aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2013-10-02 07:29:50 -0400
committerDavid S. Miller <davem@davemloft.net>2013-10-03 15:33:35 -0400
commit5080546682bae3d32734b18e281091684f0ebbe4 (patch)
treed83649361f75e4d053acfc1ac986dec5f273b4e4
parent7b4371ea48f03d3ac56df44f573e314f5b06939e (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.h4
-rw-r--r--include/net/inet_hashtables.h26
-rw-r--r--include/net/inet_sock.h2
-rw-r--r--include/net/inet_timewait_sock.h8
-rw-r--r--include/net/sock.h4
-rw-r--r--net/ipv4/inet_connection_sock.c11
-rw-r--r--net/ipv6/udp.c6
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
192static 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
198void inet_twsk_put(struct inet_timewait_sock *tw); 190void inet_twsk_put(struct inet_timewait_sock *tw);
199 191
200int inet_twsk_unhash(struct inet_timewait_sock *tw); 192int 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))