aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/inet_hashtables.h31
-rw-r--r--net/dccp/ipv4.c10
-rw-r--r--net/ipv4/inet_hashtables.c18
-rw-r--r--net/ipv4/tcp_ipv4.c10
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
274extern struct sock * 274extern 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
279static 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
371static 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
365static inline struct sock *__inet_lookup(struct inet_hashinfo *hashinfo, 381static 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
375static inline struct sock *inet_lookup(struct inet_hashinfo *hashinfo, 392static 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 */
127static struct sock *__inet_lookup_listener(const struct hlist_head *head, 127static 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. */
165struct sock *inet_lookup_listener(struct inet_hashinfo *hashinfo, 165struct 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) {
185sherry_cache: 185sherry_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}
191EXPORT_SYMBOL_GPL(inet_lookup_listener); 191EXPORT_SYMBOL_GPL(__inet_lookup_listener);
192 192
193/* called with local bh disabled */ 193/* called with local bh disabled */
194static int __inet_check_established(struct inet_timewait_death_row *death_row, 194static 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,