Lines Matching +full:step +full:- +full:down
23 /* rate-limit for syncs in reply to sequence-invalid packets; RFC 4340, 7.5.4 */
28 __skb_pull(skb, dccp_hdr(skb)->dccph_doff * 4); in dccp_enqueue_skb()
29 __skb_queue_tail(&sk->sk_receive_queue, skb); in dccp_enqueue_skb()
31 sk->sk_data_ready(sk); in dccp_enqueue_skb()
42 sk->sk_shutdown = SHUTDOWN_MASK; in dccp_fin()
51 switch (sk->sk_state) { in dccp_rcv_close()
54 * - CLOSED (may be a late or duplicate packet) in dccp_rcv_close()
55 * - PASSIVE_CLOSEREQ (the peer has sent a CloseReq earlier) in dccp_rcv_close()
56 * - RESPOND (already handled by dccp_check_req) in dccp_rcv_close()
60 * Simultaneous-close: receiving a Close after sending one. This in dccp_rcv_close()
61 * can happen if both client and server perform active-close and in dccp_rcv_close()
62 * will result in an endless ping-pong of crossing and retrans- in dccp_rcv_close()
65 * achieved when one of the nodes acts as tie-breaker. in dccp_rcv_close()
69 if (dccp_sk(sk)->dccps_role != DCCP_ROLE_CLIENT) in dccp_rcv_close()
98 * Step 7: Check for unexpected packet types in dccp_rcv_closereq()
103 if (dccp_sk(sk)->dccps_role != DCCP_ROLE_CLIENT) { in dccp_rcv_closereq()
104 dccp_send_sync(sk, DCCP_SKB_CB(skb)->dccpd_seq, DCCP_PKT_SYNC); in dccp_rcv_closereq()
108 /* Step 13: process relevant Client states < CLOSEREQ */ in dccp_rcv_closereq()
109 switch (sk->sk_state) { in dccp_rcv_closereq()
151 u16 err = dccp_reset_code_convert(dccp_hdr_reset(skb)->dccph_reset_code); in dccp_rcv_reset()
153 sk->sk_err = err; in dccp_rcv_reset()
165 struct dccp_ackvec *av = dccp_sk(sk)->dccps_hc_rx_ackvec; in dccp_handle_ackvec_processing()
169 if (DCCP_SKB_CB(skb)->dccpd_ack_seq != DCCP_PKT_WITHOUT_ACK_SEQ) in dccp_handle_ackvec_processing()
170 dccp_ackvec_clear_state(av, DCCP_SKB_CB(skb)->dccpd_ack_seq); in dccp_handle_ackvec_processing()
178 /* Don't deliver to RX CCID when node has shut down read end. */ in dccp_deliver_input_to_ccids()
179 if (!(sk->sk_shutdown & RCV_SHUTDOWN)) in dccp_deliver_input_to_ccids()
180 ccid_hc_rx_packet_recv(dp->dccps_hc_rx_ccid, sk, skb); in dccp_deliver_input_to_ccids()
185 if (sk->sk_write_queue.qlen > 0 || !(sk->sk_shutdown & SEND_SHUTDOWN)) in dccp_deliver_input_to_ccids()
186 ccid_hc_tx_packet_recv(dp->dccps_hc_tx_ccid, sk, skb); in dccp_deliver_input_to_ccids()
193 u64 lswl, lawl, seqno = DCCP_SKB_CB(skb)->dccpd_seq, in dccp_check_seqno()
194 ackno = DCCP_SKB_CB(skb)->dccpd_ack_seq; in dccp_check_seqno()
197 * Step 5: Prepare sequence numbers for Sync in dccp_check_seqno()
202 * in Step 6. A SyncAck is generated if necessary in in dccp_check_seqno()
203 * Step 15 * / in dccp_check_seqno()
208 if (dh->dccph_type == DCCP_PKT_SYNC || in dccp_check_seqno()
209 dh->dccph_type == DCCP_PKT_SYNCACK) { in dccp_check_seqno()
210 if (between48(ackno, dp->dccps_awl, dp->dccps_awh) && in dccp_check_seqno()
211 dccp_delta_seqno(dp->dccps_swl, seqno) >= 0) in dccp_check_seqno()
214 return -1; in dccp_check_seqno()
218 * Step 6: Check sequence numbers in dccp_check_seqno()
228 lswl = dp->dccps_swl; in dccp_check_seqno()
229 lawl = dp->dccps_awl; in dccp_check_seqno()
231 if (dh->dccph_type == DCCP_PKT_CLOSEREQ || in dccp_check_seqno()
232 dh->dccph_type == DCCP_PKT_CLOSE || in dccp_check_seqno()
233 dh->dccph_type == DCCP_PKT_RESET) { in dccp_check_seqno()
234 lswl = ADD48(dp->dccps_gsr, 1); in dccp_check_seqno()
235 lawl = dp->dccps_gar; in dccp_check_seqno()
238 if (between48(seqno, lswl, dp->dccps_swh) && in dccp_check_seqno()
240 between48(ackno, lawl, dp->dccps_awh))) { in dccp_check_seqno()
243 if (dh->dccph_type != DCCP_PKT_SYNC && in dccp_check_seqno()
245 after48(ackno, dp->dccps_gar)) in dccp_check_seqno()
246 dp->dccps_gar = ackno; in dccp_check_seqno()
250 * Step 6: Check sequence numbers in dccp_check_seqno()
258 * These Syncs are rate-limited as per RFC 4340, 7.5.4: in dccp_check_seqno()
261 if (time_before(now, (dp->dccps_rate_last + in dccp_check_seqno()
263 return -1; in dccp_check_seqno()
265 DCCP_WARN("Step 6 failed for %s packet, " in dccp_check_seqno()
268 "sending SYNC...\n", dccp_packet_name(dh->dccph_type), in dccp_check_seqno()
270 (unsigned long long) dp->dccps_swh, in dccp_check_seqno()
274 (unsigned long long) dp->dccps_awh); in dccp_check_seqno()
276 dp->dccps_rate_last = now; in dccp_check_seqno()
278 if (dh->dccph_type == DCCP_PKT_RESET) in dccp_check_seqno()
279 seqno = dp->dccps_gsr; in dccp_check_seqno()
281 return -1; in dccp_check_seqno()
292 switch (dccp_hdr(skb)->dccph_type) { in __dccp_rcv_established()
297 * - sk_shutdown == RCV_SHUTDOWN, use Code 1, "Not Listening" in __dccp_rcv_established()
298 * - sk_receive_queue is full, use Code 2, "Receive Buffer" in __dccp_rcv_established()
306 * Step 9: Process Reset in __dccp_rcv_established()
308 * Tear down connection in __dccp_rcv_established()
324 /* Step 7 in __dccp_rcv_established()
335 if (dp->dccps_role != DCCP_ROLE_LISTEN) in __dccp_rcv_established()
339 if (dp->dccps_role != DCCP_ROLE_CLIENT) in __dccp_rcv_established()
342 if (dccp_delta_seqno(dp->dccps_osr, in __dccp_rcv_established()
343 DCCP_SKB_CB(skb)->dccpd_seq) >= 0) { in __dccp_rcv_established()
345 dccp_send_sync(sk, DCCP_SKB_CB(skb)->dccpd_seq, in __dccp_rcv_established()
350 dccp_send_sync(sk, DCCP_SKB_CB(skb)->dccpd_seq, in __dccp_rcv_established()
355 * As with DCCP-Ack packets, DCCP-Sync and DCCP-SyncAck packets in __dccp_rcv_established()
356 * MAY have non-zero-length application data areas, whose in __dccp_rcv_established()
394 * Step 4: Prepare sequence numbers in REQUEST in dccp_rcv_request_sent_state_process()
399 * other endpoint, so P will pass the tests in Step 6 * / in dccp_rcv_request_sent_state_process()
401 * / * Response processing continues in Step 10; Reset in dccp_rcv_request_sent_state_process()
402 * processing continues in Step 9 * / in dccp_rcv_request_sent_state_process()
404 if (dh->dccph_type == DCCP_PKT_RESPONSE) { in dccp_rcv_request_sent_state_process()
409 if (!between48(DCCP_SKB_CB(skb)->dccpd_ack_seq, in dccp_rcv_request_sent_state_process()
410 dp->dccps_awl, dp->dccps_awh)) { in dccp_rcv_request_sent_state_process()
413 (unsigned long long)dp->dccps_awl, in dccp_rcv_request_sent_state_process()
414 (unsigned long long)DCCP_SKB_CB(skb)->dccpd_ack_seq, in dccp_rcv_request_sent_state_process()
415 (unsigned long long)dp->dccps_awh); in dccp_rcv_request_sent_state_process()
420 * If option processing (Step 8) failed, return 1 here so that in dccp_rcv_request_sent_state_process()
428 if (likely(dp->dccps_options_received.dccpor_timestamp_echo)) in dccp_rcv_request_sent_state_process()
429 dp->dccps_syn_rtt = dccp_sample_rtt(sk, 10 * (tstamp - in dccp_rcv_request_sent_state_process()
430 dp->dccps_options_received.dccpor_timestamp_echo)); in dccp_rcv_request_sent_state_process()
434 WARN_ON(sk->sk_send_head == NULL); in dccp_rcv_request_sent_state_process()
435 kfree_skb(sk->sk_send_head); in dccp_rcv_request_sent_state_process()
436 sk->sk_send_head = NULL; in dccp_rcv_request_sent_state_process()
445 dp->dccps_gsr = dp->dccps_isr = DCCP_SKB_CB(skb)->dccpd_seq; in dccp_rcv_request_sent_state_process()
447 dccp_sync_mss(sk, icsk->icsk_pmtu_cookie); in dccp_rcv_request_sent_state_process()
450 * Step 10: Process REQUEST state (second part) in dccp_rcv_request_sent_state_process()
453 * server (see Step 4), and we should move to in dccp_rcv_request_sent_state_process()
461 * / * Step 12 will send the Ack completing the in dccp_rcv_request_sent_state_process()
462 * three-way handshake * / in dccp_rcv_request_sent_state_process()
472 if (dccp_feat_activate_values(sk, &dp->dccps_featneg)) in dccp_rcv_request_sent_state_process()
476 icsk->icsk_af_ops->rebuild_header(sk); in dccp_rcv_request_sent_state_process()
479 sk->sk_state_change(sk); in dccp_rcv_request_sent_state_process()
483 if (sk->sk_write_pending || icsk->icsk_ack.pingpong || in dccp_rcv_request_sent_state_process()
484 icsk->icsk_accept_queue.rskq_defer_accept) { in dccp_rcv_request_sent_state_process()
490 * to stand against the temptation 8) --ANK in dccp_rcv_request_sent_state_process()
496 * us, also stated in the draft. -acme in dccp_rcv_request_sent_state_process()
502 return -1; in dccp_rcv_request_sent_state_process()
507 DCCP_SKB_CB(skb)->dccpd_reset_code = DCCP_RESET_CODE_PACKET_ERROR; in dccp_rcv_request_sent_state_process()
511 DCCP_SKB_CB(skb)->dccpd_reset_code = DCCP_RESET_CODE_ABORTED; in dccp_rcv_request_sent_state_process()
517 sk->sk_err = ECOMM; in dccp_rcv_request_sent_state_process()
527 u32 sample = dp->dccps_options_received.dccpor_timestamp_echo; in dccp_rcv_respond_partopen_state_process()
530 switch (dh->dccph_type) { in dccp_rcv_respond_partopen_state_process()
535 if (sk->sk_state == DCCP_RESPOND) in dccp_rcv_respond_partopen_state_process()
550 if (sk->sk_state == DCCP_PARTOPEN) in dccp_rcv_respond_partopen_state_process()
555 long delta = dccp_timestamp() - sample; in dccp_rcv_respond_partopen_state_process()
557 dp->dccps_syn_rtt = dccp_sample_rtt(sk, 10 * delta); in dccp_rcv_respond_partopen_state_process()
560 dp->dccps_osr = DCCP_SKB_CB(skb)->dccpd_seq; in dccp_rcv_respond_partopen_state_process()
563 if (dh->dccph_type == DCCP_PKT_DATAACK || in dccp_rcv_respond_partopen_state_process()
564 dh->dccph_type == DCCP_PKT_DATA) { in dccp_rcv_respond_partopen_state_process()
580 const int old_state = sk->sk_state; in dccp_rcv_state_process()
585 * Step 3: Process LISTEN state in dccp_rcv_state_process()
591 * however; other options are processed in Step 8. This in dccp_rcv_state_process()
601 * (* A Response packet will be generated in Step 11 *) in dccp_rcv_state_process()
606 if (sk->sk_state == DCCP_LISTEN) { in dccp_rcv_state_process()
607 if (dh->dccph_type == DCCP_PKT_REQUEST) { in dccp_rcv_state_process()
613 acceptable = inet_csk(sk)->icsk_af_ops->conn_request(sk, skb) >= 0; in dccp_rcv_state_process()
621 if (dh->dccph_type == DCCP_PKT_RESET) in dccp_rcv_state_process()
625 dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION; in dccp_rcv_state_process()
627 } else if (sk->sk_state == DCCP_CLOSED) { in dccp_rcv_state_process()
628 dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION; in dccp_rcv_state_process()
632 /* Step 6: Check sequence numbers (omitted in LISTEN/REQUEST state) */ in dccp_rcv_state_process()
633 if (sk->sk_state != DCCP_REQUESTING && dccp_check_seqno(sk, skb)) in dccp_rcv_state_process()
637 * Step 7: Check for unexpected packet types in dccp_rcv_state_process()
644 if ((dp->dccps_role != DCCP_ROLE_CLIENT && in dccp_rcv_state_process()
645 dh->dccph_type == DCCP_PKT_RESPONSE) || in dccp_rcv_state_process()
646 (dp->dccps_role == DCCP_ROLE_CLIENT && in dccp_rcv_state_process()
647 dh->dccph_type == DCCP_PKT_REQUEST) || in dccp_rcv_state_process()
648 (sk->sk_state == DCCP_RESPOND && dh->dccph_type == DCCP_PKT_DATA)) { in dccp_rcv_state_process()
649 dccp_send_sync(sk, dcb->dccpd_seq, DCCP_PKT_SYNC); in dccp_rcv_state_process()
653 /* Step 8: Process options */ in dccp_rcv_state_process()
658 * Step 9: Process Reset in dccp_rcv_state_process()
660 * Tear down connection in dccp_rcv_state_process()
665 if (dh->dccph_type == DCCP_PKT_RESET) { in dccp_rcv_state_process()
668 } else if (dh->dccph_type == DCCP_PKT_CLOSEREQ) { /* Step 13 */ in dccp_rcv_state_process()
672 } else if (dh->dccph_type == DCCP_PKT_CLOSE) { /* Step 14 */ in dccp_rcv_state_process()
678 switch (sk->sk_state) { in dccp_rcv_state_process()
688 /* Step 8: if using Ack Vectors, mark packet acknowledgeable */ in dccp_rcv_state_process()
698 if (dh->dccph_type == DCCP_PKT_ACK || in dccp_rcv_state_process()
699 dh->dccph_type == DCCP_PKT_DATAACK) { in dccp_rcv_state_process()
702 sk->sk_state_change(sk); in dccp_rcv_state_process()
706 } else if (unlikely(dh->dccph_type == DCCP_PKT_SYNC)) { in dccp_rcv_state_process()
707 dccp_send_sync(sk, dcb->dccpd_seq, DCCP_PKT_SYNCACK); in dccp_rcv_state_process()
721 * dccp_sample_rtt - Validate and finalise computation of RTT sample
730 delta -= dccp_sk(sk)->dccps_options_received.dccpor_elapsed_time * 10; in dccp_sample_rtt()