diff options
author | Eric Dumazet <edumazet@google.com> | 2013-10-02 07:29:50 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-03 15:33:35 -0400 |
commit | 5080546682bae3d32734b18e281091684f0ebbe4 (patch) | |
tree | d83649361f75e4d053acfc1ac986dec5f273b4e4 | |
parent | 7b4371ea48f03d3ac56df44f573e314f5b06939e (diff) |
inet: consolidate INET_TW_MATCH
TCP listener refactoring, part 2 :
We can use a generic lookup, sockets being in whatever state, if
we are sure all relevant fields are at the same place in all socket
types (ESTABLISH, TIME_WAIT, SYN_RECV)
This patch removes these macros :
inet_addrpair, inet_addrpair, tw_addrpair, tw_portpair
And adds :
sk_portpair, sk_addrpair, sk_daddr, sk_rcv_saddr
Then, INET_TW_MATCH() is really the same than INET_MATCH()
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/linux/ipv6.h | 4 | ||||
-rw-r--r-- | include/net/inet_hashtables.h | 26 | ||||
-rw-r--r-- | include/net/inet_sock.h | 2 | ||||
-rw-r--r-- | include/net/inet_timewait_sock.h | 8 | ||||
-rw-r--r-- | include/net/sock.h | 4 | ||||
-rw-r--r-- | net/ipv4/inet_connection_sock.c | 11 | ||||
-rw-r--r-- | net/ipv6/udp.c | 6 |
7 files changed, 21 insertions, 40 deletions
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 28ea38439313..b7f1f3bb346d 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
@@ -370,7 +370,7 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk) | |||
370 | #endif /* IS_ENABLED(CONFIG_IPV6) */ | 370 | #endif /* IS_ENABLED(CONFIG_IPV6) */ |
371 | 371 | ||
372 | #define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ | 372 | #define INET6_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ |
373 | ((inet_sk(__sk)->inet_portpair == (__ports)) && \ | 373 | (((__sk)->sk_portpair == (__ports)) && \ |
374 | ((__sk)->sk_family == AF_INET6) && \ | 374 | ((__sk)->sk_family == AF_INET6) && \ |
375 | ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \ | 375 | ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \ |
376 | ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \ | 376 | ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \ |
@@ -379,7 +379,7 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk) | |||
379 | net_eq(sock_net(__sk), (__net))) | 379 | net_eq(sock_net(__sk), (__net))) |
380 | 380 | ||
381 | #define INET6_TW_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ | 381 | #define INET6_TW_MATCH(__sk, __net, __saddr, __daddr, __ports, __dif) \ |
382 | ((inet_twsk(__sk)->tw_portpair == (__ports)) && \ | 382 | (((__sk)->sk_portpair == (__ports)) && \ |
383 | ((__sk)->sk_family == AF_INET6) && \ | 383 | ((__sk)->sk_family == AF_INET6) && \ |
384 | ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr)) && \ | 384 | ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr)) && \ |
385 | ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_rcv_saddr, (__daddr)) && \ | 385 | ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_rcv_saddr, (__daddr)) && \ |
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h index 594dfeead70f..10d6838378c3 100644 --- a/include/net/inet_hashtables.h +++ b/include/net/inet_hashtables.h | |||
@@ -302,35 +302,25 @@ static inline struct sock *inet_lookup_listener(struct net *net, | |||
302 | ((__force __u64)(__be32)(__saddr))); | 302 | ((__force __u64)(__be32)(__saddr))); |
303 | #endif /* __BIG_ENDIAN */ | 303 | #endif /* __BIG_ENDIAN */ |
304 | #define INET_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif) \ | 304 | #define INET_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif) \ |
305 | ((inet_sk(__sk)->inet_portpair == (__ports)) && \ | 305 | (((__sk)->sk_portpair == (__ports)) && \ |
306 | (inet_sk(__sk)->inet_addrpair == (__cookie)) && \ | 306 | ((__sk)->sk_addrpair == (__cookie)) && \ |
307 | (!(__sk)->sk_bound_dev_if || \ | 307 | (!(__sk)->sk_bound_dev_if || \ |
308 | ((__sk)->sk_bound_dev_if == (__dif))) && \ | 308 | ((__sk)->sk_bound_dev_if == (__dif))) && \ |
309 | net_eq(sock_net(__sk), (__net))) | 309 | net_eq(sock_net(__sk), (__net))) |
310 | #define INET_TW_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif)\ | ||
311 | ((inet_twsk(__sk)->tw_portpair == (__ports)) && \ | ||
312 | (inet_twsk(__sk)->tw_addrpair == (__cookie)) && \ | ||
313 | (!(__sk)->sk_bound_dev_if || \ | ||
314 | ((__sk)->sk_bound_dev_if == (__dif))) && \ | ||
315 | net_eq(sock_net(__sk), (__net))) | ||
316 | #else /* 32-bit arch */ | 310 | #else /* 32-bit arch */ |
317 | #define INET_ADDR_COOKIE(__name, __saddr, __daddr) | 311 | #define INET_ADDR_COOKIE(__name, __saddr, __daddr) |
318 | #define INET_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif) \ | 312 | #define INET_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif) \ |
319 | ((inet_sk(__sk)->inet_portpair == (__ports)) && \ | 313 | (((__sk)->sk_portpair == (__ports)) && \ |
320 | (inet_sk(__sk)->inet_daddr == (__saddr)) && \ | 314 | ((__sk)->sk_daddr == (__saddr)) && \ |
321 | (inet_sk(__sk)->inet_rcv_saddr == (__daddr)) && \ | 315 | ((__sk)->sk_rcv_saddr == (__daddr)) && \ |
322 | (!(__sk)->sk_bound_dev_if || \ | ||
323 | ((__sk)->sk_bound_dev_if == (__dif))) && \ | ||
324 | net_eq(sock_net(__sk), (__net))) | ||
325 | #define INET_TW_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif) \ | ||
326 | ((inet_twsk(__sk)->tw_portpair == (__ports)) && \ | ||
327 | (inet_twsk(__sk)->tw_daddr == (__saddr)) && \ | ||
328 | (inet_twsk(__sk)->tw_rcv_saddr == (__daddr)) && \ | ||
329 | (!(__sk)->sk_bound_dev_if || \ | 316 | (!(__sk)->sk_bound_dev_if || \ |
330 | ((__sk)->sk_bound_dev_if == (__dif))) && \ | 317 | ((__sk)->sk_bound_dev_if == (__dif))) && \ |
331 | net_eq(sock_net(__sk), (__net))) | 318 | net_eq(sock_net(__sk), (__net))) |
332 | #endif /* 64-bit arch */ | 319 | #endif /* 64-bit arch */ |
333 | 320 | ||
321 | #define INET_TW_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif)\ | ||
322 | INET_MATCH(__sk, __net, __cookie, __saddr, __daddr, __ports, __dif) | ||
323 | |||
334 | /* | 324 | /* |
335 | * Sockets in TCP_CLOSE state are _always_ taken out of the hash, so we need | 325 | * Sockets in TCP_CLOSE state are _always_ taken out of the hash, so we need |
336 | * not check it for lookups anymore, thanks Alexey. -DaveM | 326 | * not check it for lookups anymore, thanks Alexey. -DaveM |
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index f3141773c14d..6d9a7e6eb5a4 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h | |||
@@ -146,10 +146,8 @@ struct inet_sock { | |||
146 | /* Socket demultiplex comparisons on incoming packets. */ | 146 | /* Socket demultiplex comparisons on incoming packets. */ |
147 | #define inet_daddr sk.__sk_common.skc_daddr | 147 | #define inet_daddr sk.__sk_common.skc_daddr |
148 | #define inet_rcv_saddr sk.__sk_common.skc_rcv_saddr | 148 | #define inet_rcv_saddr sk.__sk_common.skc_rcv_saddr |
149 | #define inet_addrpair sk.__sk_common.skc_addrpair | ||
150 | #define inet_dport sk.__sk_common.skc_dport | 149 | #define inet_dport sk.__sk_common.skc_dport |
151 | #define inet_num sk.__sk_common.skc_num | 150 | #define inet_num sk.__sk_common.skc_num |
152 | #define inet_portpair sk.__sk_common.skc_portpair | ||
153 | 151 | ||
154 | __be32 inet_saddr; | 152 | __be32 inet_saddr; |
155 | __s16 uc_ttl; | 153 | __s16 uc_ttl; |
diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h index 828200ab1125..48fd3561722c 100644 --- a/include/net/inet_timewait_sock.h +++ b/include/net/inet_timewait_sock.h | |||
@@ -112,10 +112,8 @@ struct inet_timewait_sock { | |||
112 | #define tw_net __tw_common.skc_net | 112 | #define tw_net __tw_common.skc_net |
113 | #define tw_daddr __tw_common.skc_daddr | 113 | #define tw_daddr __tw_common.skc_daddr |
114 | #define tw_rcv_saddr __tw_common.skc_rcv_saddr | 114 | #define tw_rcv_saddr __tw_common.skc_rcv_saddr |
115 | #define tw_addrpair __tw_common.skc_addrpair | ||
116 | #define tw_dport __tw_common.skc_dport | 115 | #define tw_dport __tw_common.skc_dport |
117 | #define tw_num __tw_common.skc_num | 116 | #define tw_num __tw_common.skc_num |
118 | #define tw_portpair __tw_common.skc_portpair | ||
119 | 117 | ||
120 | int tw_timeout; | 118 | int tw_timeout; |
121 | volatile unsigned char tw_substate; | 119 | volatile unsigned char tw_substate; |
@@ -189,12 +187,6 @@ static inline struct inet_timewait_sock *inet_twsk(const struct sock *sk) | |||
189 | return (struct inet_timewait_sock *)sk; | 187 | return (struct inet_timewait_sock *)sk; |
190 | } | 188 | } |
191 | 189 | ||
192 | static inline __be32 sk_rcv_saddr(const struct sock *sk) | ||
193 | { | ||
194 | /* both inet_sk() and inet_twsk() store rcv_saddr in skc_rcv_saddr */ | ||
195 | return sk->__sk_common.skc_rcv_saddr; | ||
196 | } | ||
197 | |||
198 | void inet_twsk_put(struct inet_timewait_sock *tw); | 190 | void inet_twsk_put(struct inet_timewait_sock *tw); |
199 | 191 | ||
200 | int inet_twsk_unhash(struct inet_timewait_sock *tw); | 192 | int inet_twsk_unhash(struct inet_timewait_sock *tw); |
diff --git a/include/net/sock.h b/include/net/sock.h index f0a44cc1ff9d..e3bf213be625 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -300,6 +300,10 @@ struct sock { | |||
300 | #define sk_dontcopy_begin __sk_common.skc_dontcopy_begin | 300 | #define sk_dontcopy_begin __sk_common.skc_dontcopy_begin |
301 | #define sk_dontcopy_end __sk_common.skc_dontcopy_end | 301 | #define sk_dontcopy_end __sk_common.skc_dontcopy_end |
302 | #define sk_hash __sk_common.skc_hash | 302 | #define sk_hash __sk_common.skc_hash |
303 | #define sk_portpair __sk_common.skc_portpair | ||
304 | #define sk_addrpair __sk_common.skc_addrpair | ||
305 | #define sk_daddr __sk_common.skc_daddr | ||
306 | #define sk_rcv_saddr __sk_common.skc_rcv_saddr | ||
303 | #define sk_family __sk_common.skc_family | 307 | #define sk_family __sk_common.skc_family |
304 | #define sk_state __sk_common.skc_state | 308 | #define sk_state __sk_common.skc_state |
305 | #define sk_reuse __sk_common.skc_reuse | 309 | #define sk_reuse __sk_common.skc_reuse |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 7ac7aa11130e..56e82a4027b4 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -71,17 +71,16 @@ int inet_csk_bind_conflict(const struct sock *sk, | |||
71 | (!reuseport || !sk2->sk_reuseport || | 71 | (!reuseport || !sk2->sk_reuseport || |
72 | (sk2->sk_state != TCP_TIME_WAIT && | 72 | (sk2->sk_state != TCP_TIME_WAIT && |
73 | !uid_eq(uid, sock_i_uid(sk2))))) { | 73 | !uid_eq(uid, sock_i_uid(sk2))))) { |
74 | const __be32 sk2_rcv_saddr = sk_rcv_saddr(sk2); | 74 | |
75 | if (!sk2_rcv_saddr || !sk_rcv_saddr(sk) || | 75 | if (!sk2->sk_rcv_saddr || !sk->sk_rcv_saddr || |
76 | sk2_rcv_saddr == sk_rcv_saddr(sk)) | 76 | sk2->sk_rcv_saddr == sk->sk_rcv_saddr) |
77 | break; | 77 | break; |
78 | } | 78 | } |
79 | if (!relax && reuse && sk2->sk_reuse && | 79 | if (!relax && reuse && sk2->sk_reuse && |
80 | sk2->sk_state != TCP_LISTEN) { | 80 | sk2->sk_state != TCP_LISTEN) { |
81 | const __be32 sk2_rcv_saddr = sk_rcv_saddr(sk2); | ||
82 | 81 | ||
83 | if (!sk2_rcv_saddr || !sk_rcv_saddr(sk) || | 82 | if (!sk2->sk_rcv_saddr || !sk->sk_rcv_saddr || |
84 | sk2_rcv_saddr == sk_rcv_saddr(sk)) | 83 | sk2->sk_rcv_saddr == sk->sk_rcv_saddr) |
85 | break; | 84 | break; |
86 | } | 85 | } |
87 | } | 86 | } |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 72b7eaaf3ca0..8119791e8a95 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -57,8 +57,6 @@ int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2) | |||
57 | { | 57 | { |
58 | const struct in6_addr *sk_rcv_saddr6 = &inet6_sk(sk)->rcv_saddr; | 58 | const struct in6_addr *sk_rcv_saddr6 = &inet6_sk(sk)->rcv_saddr; |
59 | const struct in6_addr *sk2_rcv_saddr6 = inet6_rcv_saddr(sk2); | 59 | const struct in6_addr *sk2_rcv_saddr6 = inet6_rcv_saddr(sk2); |
60 | __be32 sk1_rcv_saddr = sk_rcv_saddr(sk); | ||
61 | __be32 sk2_rcv_saddr = sk_rcv_saddr(sk2); | ||
62 | int sk_ipv6only = ipv6_only_sock(sk); | 60 | int sk_ipv6only = ipv6_only_sock(sk); |
63 | int sk2_ipv6only = inet_v6_ipv6only(sk2); | 61 | int sk2_ipv6only = inet_v6_ipv6only(sk2); |
64 | int addr_type = ipv6_addr_type(sk_rcv_saddr6); | 62 | int addr_type = ipv6_addr_type(sk_rcv_saddr6); |
@@ -67,8 +65,8 @@ int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2) | |||
67 | /* if both are mapped, treat as IPv4 */ | 65 | /* if both are mapped, treat as IPv4 */ |
68 | if (addr_type == IPV6_ADDR_MAPPED && addr_type2 == IPV6_ADDR_MAPPED) | 66 | if (addr_type == IPV6_ADDR_MAPPED && addr_type2 == IPV6_ADDR_MAPPED) |
69 | return (!sk2_ipv6only && | 67 | return (!sk2_ipv6only && |
70 | (!sk1_rcv_saddr || !sk2_rcv_saddr || | 68 | (!sk->sk_rcv_saddr || !sk2->sk_rcv_saddr || |
71 | sk1_rcv_saddr == sk2_rcv_saddr)); | 69 | sk->sk_rcv_saddr == sk2->sk_rcv_saddr)); |
72 | 70 | ||
73 | if (addr_type2 == IPV6_ADDR_ANY && | 71 | if (addr_type2 == IPV6_ADDR_ANY && |
74 | !(sk2_ipv6only && addr_type == IPV6_ADDR_MAPPED)) | 72 | !(sk2_ipv6only && addr_type == IPV6_ADDR_MAPPED)) |