return 0;
        }
 
-       reason = SKB_DROP_REASON_NOT_SPECIFIED;
        if (tcp_checksum_complete(skb))
                goto csum_err;
 
                if (!nsk)
                        return 0;
                if (nsk != sk) {
-                       if (tcp_child_process(sk, nsk, skb)) {
+                       reason = tcp_child_process(sk, nsk, skb);
+                       if (reason) {
                                rsk = nsk;
                                goto reset;
                        }
                if (nsk == sk) {
                        reqsk_put(req);
                        tcp_v4_restore_cb(skb);
-               } else if (tcp_child_process(sk, nsk, skb)) {
-                       tcp_v4_send_reset(nsk, skb);
-                       goto discard_and_relse;
                } else {
+                       drop_reason = tcp_child_process(sk, nsk, skb);
+                       if (drop_reason) {
+                               tcp_v4_send_reset(nsk, skb);
+                               goto discard_and_relse;
+                       }
                        sock_put(sk);
                        return 0;
                }
 
        if (np->rxopt.all)
                opt_skb = skb_clone_and_charge_r(skb, sk);
 
-       reason = SKB_DROP_REASON_NOT_SPECIFIED;
        if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */
                struct dst_entry *dst;
 
                struct sock *nsk = tcp_v6_cookie_check(sk, skb);
 
                if (nsk != sk) {
-                       if (nsk && tcp_child_process(sk, nsk, skb))
-                               goto reset;
+                       if (nsk) {
+                               reason = tcp_child_process(sk, nsk, skb);
+                               if (reason)
+                                       goto reset;
+                       }
                        if (opt_skb)
                                __kfree_skb(opt_skb);
                        return 0;
                if (nsk == sk) {
                        reqsk_put(req);
                        tcp_v6_restore_cb(skb);
-               } else if (tcp_child_process(sk, nsk, skb)) {
-                       tcp_v6_send_reset(nsk, skb);
-                       goto discard_and_relse;
                } else {
+                       drop_reason = tcp_child_process(sk, nsk, skb);
+                       if (drop_reason) {
+                               tcp_v6_send_reset(nsk, skb);
+                               goto discard_and_relse;
+                       }
                        sock_put(sk);
                        return 0;
                }