dccp: Clean up slow-path input processing
[sfrench/cifs-2.6.git] / net / dccp / input.c
index 4222e7a654b0ca16a7850f8f67efcaddeb0a8f03..51d5fe5fffba6bba0592dd147b8693726a5afc05 100644 (file)
@@ -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;