]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - net/ipv6/tcp_ipv6.c
tcp/dccp: add inet_csk_reqsk_queue_drop_and_put() helper
[karo-tx-linux.git] / net / ipv6 / tcp_ipv6.c
index 33334f0c217dee6e6afa9eb1bf920dbb582835eb..acb06f86f3723f09722d0458232a0c56306db472 100644 (file)
@@ -931,7 +931,7 @@ static void tcp_v6_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,
         */
        tcp_v6_send_ack(sk, skb, (sk->sk_state == TCP_LISTEN) ?
                        tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt,
-                       tcp_rsk(req)->rcv_nxt, req->rcv_wnd,
+                       tcp_rsk(req)->rcv_nxt, req->rsk_rcv_wnd,
                        tcp_time_stamp, req->ts_recent, sk->sk_bound_dev_if,
                        tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr),
                        0, 0);
@@ -1363,6 +1363,7 @@ static int tcp_v6_rcv(struct sk_buff *skb)
        th = tcp_hdr(skb);
        hdr = ipv6_hdr(skb);
 
+lookup:
        sk = __inet6_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest,
                                inet6_iif(skb));
        if (!sk)
@@ -1382,8 +1383,12 @@ process:
                        reqsk_put(req);
                        goto discard_it;
                }
-               if (sk->sk_state == TCP_LISTEN)
+               if (likely(sk->sk_state == TCP_LISTEN)) {
                        nsk = tcp_check_req(sk, skb, req, false);
+               } else {
+                       inet_csk_reqsk_queue_drop_and_put(sk, req);
+                       goto lookup;
+               }
                if (!nsk) {
                        reqsk_put(req);
                        goto discard_it;