|
@@ -619,20 +619,31 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
- if (sk->sk_state != DCCP_REQUESTING && sk->sk_state != DCCP_RESPOND) {
|
|
|
- if (dccp_check_seqno(sk, skb))
|
|
|
- goto discard;
|
|
|
-
|
|
|
- /*
|
|
|
- * Step 8: Process options and mark acknowledgeable
|
|
|
- */
|
|
|
- if (dccp_parse_options(sk, NULL, skb))
|
|
|
- return 1;
|
|
|
+ /* Step 6: Check sequence numbers (omitted in LISTEN/REQUEST state) */
|
|
|
+ if (sk->sk_state != DCCP_REQUESTING && dccp_check_seqno(sk, skb))
|
|
|
+ goto discard;
|
|
|
|
|
|
- dccp_handle_ackvec_processing(sk, skb);
|
|
|
- dccp_deliver_input_to_ccids(sk, skb);
|
|
|
+ /*
|
|
|
+ * Step 7: Check for unexpected packet types
|
|
|
+ * If (S.is_server and P.type == Response)
|
|
|
+ * or (S.is_client and P.type == Request)
|
|
|
+ * or (S.state == RESPOND and P.type == Data),
|
|
|
+ * Send Sync packet acknowledging P.seqno
|
|
|
+ * Drop packet and return
|
|
|
+ */
|
|
|
+ if ((dp->dccps_role != DCCP_ROLE_CLIENT &&
|
|
|
+ dh->dccph_type == DCCP_PKT_RESPONSE) ||
|
|
|
+ (dp->dccps_role == DCCP_ROLE_CLIENT &&
|
|
|
+ dh->dccph_type == DCCP_PKT_REQUEST) ||
|
|
|
+ (sk->sk_state == DCCP_RESPOND && dh->dccph_type == DCCP_PKT_DATA)) {
|
|
|
+ dccp_send_sync(sk, dcb->dccpd_seq, DCCP_PKT_SYNC);
|
|
|
+ goto discard;
|
|
|
}
|
|
|
|
|
|
+ /* Step 8: Process options */
|
|
|
+ if (dccp_parse_options(sk, NULL, skb))
|
|
|
+ return 1;
|
|
|
+
|
|
|
/*
|
|
|
* Step 9: Process Reset
|
|
|
* If P.type == Reset,
|
|
@@ -640,31 +651,15 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|
|
* S.state := TIMEWAIT
|
|
|
* Set TIMEWAIT timer
|
|
|
* Drop packet and return
|
|
|
- */
|
|
|
+ */
|
|
|
if (dh->dccph_type == DCCP_PKT_RESET) {
|
|
|
dccp_rcv_reset(sk, skb);
|
|
|
return 0;
|
|
|
- /*
|
|
|
- * Step 7: Check for unexpected packet types
|
|
|
- * If (S.is_server and P.type == Response)
|
|
|
- * or (S.is_client and P.type == Request)
|
|
|
- * or (S.state == RESPOND and P.type == Data),
|
|
|
- * Send Sync packet acknowledging P.seqno
|
|
|
- * Drop packet and return
|
|
|
- */
|
|
|
- } else if ((dp->dccps_role != DCCP_ROLE_CLIENT &&
|
|
|
- dh->dccph_type == DCCP_PKT_RESPONSE) ||
|
|
|
- (dp->dccps_role == DCCP_ROLE_CLIENT &&
|
|
|
- dh->dccph_type == DCCP_PKT_REQUEST) ||
|
|
|
- (sk->sk_state == DCCP_RESPOND &&
|
|
|
- dh->dccph_type == DCCP_PKT_DATA)) {
|
|
|
- dccp_send_sync(sk, dcb->dccpd_seq, DCCP_PKT_SYNC);
|
|
|
- goto discard;
|
|
|
- } else if (dh->dccph_type == DCCP_PKT_CLOSEREQ) {
|
|
|
+ } else if (dh->dccph_type == DCCP_PKT_CLOSEREQ) { /* Step 13 */
|
|
|
if (dccp_rcv_closereq(sk, skb))
|
|
|
return 0;
|
|
|
goto discard;
|
|
|
- } else if (dh->dccph_type == DCCP_PKT_CLOSE) {
|
|
|
+ } else if (dh->dccph_type == DCCP_PKT_CLOSE) { /* Step 14 */
|
|
|
if (dccp_rcv_close(sk, skb))
|
|
|
return 0;
|
|
|
goto discard;
|
|
@@ -679,8 +674,12 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|
|
__kfree_skb(skb);
|
|
|
return 0;
|
|
|
|
|
|
- case DCCP_RESPOND:
|
|
|
case DCCP_PARTOPEN:
|
|
|
+ /* Step 8: if using Ack Vectors, mark packet acknowledgeable */
|
|
|
+ dccp_handle_ackvec_processing(sk, skb);
|
|
|
+ dccp_deliver_input_to_ccids(sk, skb);
|
|
|
+ /* fall through */
|
|
|
+ case DCCP_RESPOND:
|
|
|
queued = dccp_rcv_respond_partopen_state_process(sk, skb,
|
|
|
dh, len);
|
|
|
break;
|