diff options
-rw-r--r-- | include/net/inet_hashtables.h | 31 | ||||
-rw-r--r-- | net/dccp/ipv4.c | 10 | ||||
-rw-r--r-- | net/ipv4/inet_hashtables.c | 18 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 10 |
4 files changed, 43 insertions, 26 deletions
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h index bd513f3b9c7e..b4491c9e2a5a 100644 --- a/include/net/inet_hashtables.h +++ b/include/net/inet_hashtables.h | |||
@@ -271,10 +271,16 @@ static inline int inet_iif(const struct sk_buff *skb) | |||
271 | return ((struct rtable *)skb->dst)->rt_iif; | 271 | return ((struct rtable *)skb->dst)->rt_iif; |
272 | } | 272 | } |
273 | 273 | ||
274 | extern struct sock * | 274 | extern struct sock *__inet_lookup_listener(struct inet_hashinfo *hashinfo, |
275 | inet_lookup_listener(struct inet_hashinfo *hashinfo, | 275 | const u32 daddr, |
276 | const u32 daddr, | 276 | const unsigned short hnum, |
277 | const unsigned short hnum, const int dif); | 277 | const int dif); |
278 | |||
279 | static inline struct sock *inet_lookup_listener(struct inet_hashinfo *hashinfo, | ||
280 | u32 daddr, u16 dport, int dif) | ||
281 | { | ||
282 | return __inet_lookup_listener(hashinfo, daddr, ntohs(dport), dif); | ||
283 | } | ||
278 | 284 | ||
279 | /* Socket demux engine toys. */ | 285 | /* Socket demux engine toys. */ |
280 | #ifdef __BIG_ENDIAN | 286 | #ifdef __BIG_ENDIAN |
@@ -362,14 +368,25 @@ hit: | |||
362 | goto out; | 368 | goto out; |
363 | } | 369 | } |
364 | 370 | ||
371 | static inline struct sock * | ||
372 | inet_lookup_established(struct inet_hashinfo *hashinfo, | ||
373 | const u32 saddr, const u16 sport, | ||
374 | const u32 daddr, const u16 dport, | ||
375 | const int dif) | ||
376 | { | ||
377 | return __inet_lookup_established(hashinfo, saddr, sport, daddr, | ||
378 | ntohs(dport), dif); | ||
379 | } | ||
380 | |||
365 | static inline struct sock *__inet_lookup(struct inet_hashinfo *hashinfo, | 381 | static inline struct sock *__inet_lookup(struct inet_hashinfo *hashinfo, |
366 | const u32 saddr, const u16 sport, | 382 | const u32 saddr, const u16 sport, |
367 | const u32 daddr, const u16 hnum, | 383 | const u32 daddr, const u16 dport, |
368 | const int dif) | 384 | const int dif) |
369 | { | 385 | { |
386 | u16 hnum = ntohs(dport); | ||
370 | struct sock *sk = __inet_lookup_established(hashinfo, saddr, sport, daddr, | 387 | struct sock *sk = __inet_lookup_established(hashinfo, saddr, sport, daddr, |
371 | hnum, dif); | 388 | hnum, dif); |
372 | return sk ? : inet_lookup_listener(hashinfo, daddr, hnum, dif); | 389 | return sk ? : __inet_lookup_listener(hashinfo, daddr, hnum, dif); |
373 | } | 390 | } |
374 | 391 | ||
375 | static inline struct sock *inet_lookup(struct inet_hashinfo *hashinfo, | 392 | static inline struct sock *inet_lookup(struct inet_hashinfo *hashinfo, |
@@ -380,7 +397,7 @@ static inline struct sock *inet_lookup(struct inet_hashinfo *hashinfo, | |||
380 | struct sock *sk; | 397 | struct sock *sk; |
381 | 398 | ||
382 | local_bh_disable(); | 399 | local_bh_disable(); |
383 | sk = __inet_lookup(hashinfo, saddr, sport, daddr, ntohs(dport), dif); | 400 | sk = __inet_lookup(hashinfo, saddr, sport, daddr, dport, dif); |
384 | local_bh_enable(); | 401 | local_bh_enable(); |
385 | 402 | ||
386 | return sk; | 403 | return sk; |
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index 171d363876ee..9a1a76a7dc41 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c | |||
@@ -608,10 +608,10 @@ static struct sock *dccp_v4_hnd_req(struct sock *sk, struct sk_buff *skb) | |||
608 | if (req != NULL) | 608 | if (req != NULL) |
609 | return dccp_check_req(sk, skb, req, prev); | 609 | return dccp_check_req(sk, skb, req, prev); |
610 | 610 | ||
611 | nsk = __inet_lookup_established(&dccp_hashinfo, | 611 | nsk = inet_lookup_established(&dccp_hashinfo, |
612 | iph->saddr, dh->dccph_sport, | 612 | iph->saddr, dh->dccph_sport, |
613 | iph->daddr, ntohs(dh->dccph_dport), | 613 | iph->daddr, dh->dccph_dport, |
614 | inet_iif(skb)); | 614 | inet_iif(skb)); |
615 | if (nsk != NULL) { | 615 | if (nsk != NULL) { |
616 | if (nsk->sk_state != DCCP_TIME_WAIT) { | 616 | if (nsk->sk_state != DCCP_TIME_WAIT) { |
617 | bh_lock_sock(nsk); | 617 | bh_lock_sock(nsk); |
@@ -925,7 +925,7 @@ static int dccp_v4_rcv(struct sk_buff *skb) | |||
925 | * Look up flow ID in table and get corresponding socket */ | 925 | * Look up flow ID in table and get corresponding socket */ |
926 | sk = __inet_lookup(&dccp_hashinfo, | 926 | sk = __inet_lookup(&dccp_hashinfo, |
927 | skb->nh.iph->saddr, dh->dccph_sport, | 927 | skb->nh.iph->saddr, dh->dccph_sport, |
928 | skb->nh.iph->daddr, ntohs(dh->dccph_dport), | 928 | skb->nh.iph->daddr, dh->dccph_dport, |
929 | inet_iif(skb)); | 929 | inet_iif(skb)); |
930 | 930 | ||
931 | /* | 931 | /* |
diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c index bfc39066e730..fb296c9a7f3f 100644 --- a/net/ipv4/inet_hashtables.c +++ b/net/ipv4/inet_hashtables.c | |||
@@ -124,10 +124,10 @@ EXPORT_SYMBOL(inet_listen_wlock); | |||
124 | * remote address for the connection. So always assume those are both | 124 | * remote address for the connection. So always assume those are both |
125 | * wildcarded during the search since they can never be otherwise. | 125 | * wildcarded during the search since they can never be otherwise. |
126 | */ | 126 | */ |
127 | static struct sock *__inet_lookup_listener(const struct hlist_head *head, | 127 | static struct sock *inet_lookup_listener_slow(const struct hlist_head *head, |
128 | const u32 daddr, | 128 | const u32 daddr, |
129 | const unsigned short hnum, | 129 | const unsigned short hnum, |
130 | const int dif) | 130 | const int dif) |
131 | { | 131 | { |
132 | struct sock *result = NULL, *sk; | 132 | struct sock *result = NULL, *sk; |
133 | const struct hlist_node *node; | 133 | const struct hlist_node *node; |
@@ -162,9 +162,9 @@ static struct sock *__inet_lookup_listener(const struct hlist_head *head, | |||
162 | } | 162 | } |
163 | 163 | ||
164 | /* Optimize the common listener case. */ | 164 | /* Optimize the common listener case. */ |
165 | struct sock *inet_lookup_listener(struct inet_hashinfo *hashinfo, | 165 | struct sock *__inet_lookup_listener(struct inet_hashinfo *hashinfo, |
166 | const u32 daddr, const unsigned short hnum, | 166 | const u32 daddr, const unsigned short hnum, |
167 | const int dif) | 167 | const int dif) |
168 | { | 168 | { |
169 | struct sock *sk = NULL; | 169 | struct sock *sk = NULL; |
170 | const struct hlist_head *head; | 170 | const struct hlist_head *head; |
@@ -179,7 +179,7 @@ struct sock *inet_lookup_listener(struct inet_hashinfo *hashinfo, | |||
179 | (sk->sk_family == PF_INET || !ipv6_only_sock(sk)) && | 179 | (sk->sk_family == PF_INET || !ipv6_only_sock(sk)) && |
180 | !sk->sk_bound_dev_if) | 180 | !sk->sk_bound_dev_if) |
181 | goto sherry_cache; | 181 | goto sherry_cache; |
182 | sk = __inet_lookup_listener(head, daddr, hnum, dif); | 182 | sk = inet_lookup_listener_slow(head, daddr, hnum, dif); |
183 | } | 183 | } |
184 | if (sk) { | 184 | if (sk) { |
185 | sherry_cache: | 185 | sherry_cache: |
@@ -188,7 +188,7 @@ sherry_cache: | |||
188 | read_unlock(&hashinfo->lhash_lock); | 188 | read_unlock(&hashinfo->lhash_lock); |
189 | return sk; | 189 | return sk; |
190 | } | 190 | } |
191 | EXPORT_SYMBOL_GPL(inet_lookup_listener); | 191 | EXPORT_SYMBOL_GPL(__inet_lookup_listener); |
192 | 192 | ||
193 | /* called with local bh disabled */ | 193 | /* called with local bh disabled */ |
194 | static int __inet_check_established(struct inet_timewait_death_row *death_row, | 194 | static int __inet_check_established(struct inet_timewait_death_row *death_row, |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index b2aa512a30e9..2973dee0a489 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -951,9 +951,9 @@ static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb) | |||
951 | if (req) | 951 | if (req) |
952 | return tcp_check_req(sk, skb, req, prev); | 952 | return tcp_check_req(sk, skb, req, prev); |
953 | 953 | ||
954 | nsk = __inet_lookup_established(&tcp_hashinfo, skb->nh.iph->saddr, | 954 | nsk = inet_lookup_established(&tcp_hashinfo, skb->nh.iph->saddr, |
955 | th->source, skb->nh.iph->daddr, | 955 | th->source, skb->nh.iph->daddr, |
956 | ntohs(th->dest), inet_iif(skb)); | 956 | th->dest, inet_iif(skb)); |
957 | 957 | ||
958 | if (nsk) { | 958 | if (nsk) { |
959 | if (nsk->sk_state != TCP_TIME_WAIT) { | 959 | if (nsk->sk_state != TCP_TIME_WAIT) { |
@@ -1090,7 +1090,7 @@ int tcp_v4_rcv(struct sk_buff *skb) | |||
1090 | TCP_SKB_CB(skb)->sacked = 0; | 1090 | TCP_SKB_CB(skb)->sacked = 0; |
1091 | 1091 | ||
1092 | sk = __inet_lookup(&tcp_hashinfo, skb->nh.iph->saddr, th->source, | 1092 | sk = __inet_lookup(&tcp_hashinfo, skb->nh.iph->saddr, th->source, |
1093 | skb->nh.iph->daddr, ntohs(th->dest), | 1093 | skb->nh.iph->daddr, th->dest, |
1094 | inet_iif(skb)); | 1094 | inet_iif(skb)); |
1095 | 1095 | ||
1096 | if (!sk) | 1096 | if (!sk) |
@@ -1168,7 +1168,7 @@ do_time_wait: | |||
1168 | case TCP_TW_SYN: { | 1168 | case TCP_TW_SYN: { |
1169 | struct sock *sk2 = inet_lookup_listener(&tcp_hashinfo, | 1169 | struct sock *sk2 = inet_lookup_listener(&tcp_hashinfo, |
1170 | skb->nh.iph->daddr, | 1170 | skb->nh.iph->daddr, |
1171 | ntohs(th->dest), | 1171 | th->dest, |
1172 | inet_iif(skb)); | 1172 | inet_iif(skb)); |
1173 | if (sk2) { | 1173 | if (sk2) { |
1174 | inet_twsk_deschedule((struct inet_timewait_sock *)sk, | 1174 | inet_twsk_deschedule((struct inet_timewait_sock *)sk, |