/* Caller (dccp_v4_do_rcv) will send Reset */
                dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
                return 1;
+       } else if (sk->sk_state == DCCP_CLOSED) {
+               dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
+               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,
         *              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;
        }
 
        switch (sk->sk_state) {
-       case DCCP_CLOSED:
-               dcb->dccpd_reset_code = DCCP_RESET_CODE_NO_CONNECTION;
-               return 1;
-
        case DCCP_REQUESTING:
                queued = dccp_rcv_request_sent_state_process(sk, skb, dh, len);
                if (queued >= 0)
                __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;