tcp: connect() race with timewait reuse
[firefly-linux-kernel-4.4.55.git] / include / net / inet_timewait_sock.h
index f93ad90a601b62015466d8800379c89a79eed564..b801ade2295ef8af242b97a07393b63c35ab8195 100644 (file)
@@ -194,11 +194,13 @@ static inline struct inet_timewait_sock *inet_twsk(const struct sock *sk)
 static inline __be32 inet_rcv_saddr(const struct sock *sk)
 {
        return likely(sk->sk_state != TCP_TIME_WAIT) ?
-               inet_sk(sk)->rcv_saddr : inet_twsk(sk)->tw_rcv_saddr;
+               inet_sk(sk)->inet_rcv_saddr : inet_twsk(sk)->tw_rcv_saddr;
 }
 
 extern void inet_twsk_put(struct inet_timewait_sock *tw);
 
+extern int inet_twsk_unhash(struct inet_timewait_sock *tw);
+
 extern struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk,
                                                  const int state);
 
@@ -212,14 +214,14 @@ extern void inet_twsk_schedule(struct inet_timewait_sock *tw,
 extern void inet_twsk_deschedule(struct inet_timewait_sock *tw,
                                 struct inet_timewait_death_row *twdr);
 
-extern void inet_twsk_purge(struct net *net, struct inet_hashinfo *hashinfo,
+extern void inet_twsk_purge(struct inet_hashinfo *hashinfo,
                            struct inet_timewait_death_row *twdr, int family);
 
 static inline
 struct net *twsk_net(const struct inet_timewait_sock *twsk)
 {
 #ifdef CONFIG_NET_NS
-       return twsk->tw_net;
+       return rcu_dereference(twsk->tw_net);
 #else
        return &init_net;
 #endif
@@ -229,7 +231,7 @@ static inline
 void twsk_net_set(struct inet_timewait_sock *twsk, struct net *net)
 {
 #ifdef CONFIG_NET_NS
-       twsk->tw_net = net;
+       rcu_assign_pointer(twsk->tw_net, net);
 #endif
 }
 #endif /* _INET_TIMEWAIT_SOCK_ */