bpf: tcp: Support arbitrary SYN Cookie.
[linux-2.6-block.git] / net / core / sock.c
index 158dbdebce6a3693deb63e557e856d9cdd7500ae..147fb2656e6bb92f8a0d809c39282e85878e447f 100644 (file)
@@ -2582,8 +2582,18 @@ EXPORT_SYMBOL(sock_efree);
 #ifdef CONFIG_INET
 void sock_pfree(struct sk_buff *skb)
 {
-       if (sk_is_refcounted(skb->sk))
-               sock_gen_put(skb->sk);
+       struct sock *sk = skb->sk;
+
+       if (!sk_is_refcounted(sk))
+               return;
+
+       if (sk->sk_state == TCP_NEW_SYN_RECV && inet_reqsk(sk)->syncookie) {
+               inet_reqsk(sk)->rsk_listener = NULL;
+               reqsk_free(inet_reqsk(sk));
+               return;
+       }
+
+       sock_gen_put(sk);
 }
 EXPORT_SYMBOL(sock_pfree);
 #endif /* CONFIG_INET */