diff options
Diffstat (limited to 'include/net/inet_hashtables.h')
-rw-r--r-- | include/net/inet_hashtables.h | 48 |
1 files changed, 18 insertions, 30 deletions
diff --git a/include/net/inet_hashtables.h b/include/net/inet_hashtables.h index 98e0bb3014fe..b4491c9e2a5a 100644 --- a/include/net/inet_hashtables.h +++ b/include/net/inet_hashtables.h | |||
@@ -271,38 +271,15 @@ 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 *__inet_lookup_listener(const struct hlist_head *head, | 274 | extern struct sock *__inet_lookup_listener(struct inet_hashinfo *hashinfo, |
275 | const u32 daddr, | 275 | const u32 daddr, |
276 | const unsigned short hnum, | 276 | const unsigned short hnum, |
277 | const int dif); | 277 | const int dif); |
278 | 278 | ||
279 | /* Optimize the common listener case. */ | 279 | static inline struct sock *inet_lookup_listener(struct inet_hashinfo *hashinfo, |
280 | static inline struct sock * | 280 | u32 daddr, u16 dport, int dif) |
281 | inet_lookup_listener(struct inet_hashinfo *hashinfo, | ||
282 | const u32 daddr, | ||
283 | const unsigned short hnum, const int dif) | ||
284 | { | 281 | { |
285 | struct sock *sk = NULL; | 282 | return __inet_lookup_listener(hashinfo, daddr, ntohs(dport), dif); |
286 | const struct hlist_head *head; | ||
287 | |||
288 | read_lock(&hashinfo->lhash_lock); | ||
289 | head = &hashinfo->listening_hash[inet_lhashfn(hnum)]; | ||
290 | if (!hlist_empty(head)) { | ||
291 | const struct inet_sock *inet = inet_sk((sk = __sk_head(head))); | ||
292 | |||
293 | if (inet->num == hnum && !sk->sk_node.next && | ||
294 | (!inet->rcv_saddr || inet->rcv_saddr == daddr) && | ||
295 | (sk->sk_family == PF_INET || !ipv6_only_sock(sk)) && | ||
296 | !sk->sk_bound_dev_if) | ||
297 | goto sherry_cache; | ||
298 | sk = __inet_lookup_listener(head, daddr, hnum, dif); | ||
299 | } | ||
300 | if (sk) { | ||
301 | sherry_cache: | ||
302 | sock_hold(sk); | ||
303 | } | ||
304 | read_unlock(&hashinfo->lhash_lock); | ||
305 | return sk; | ||
306 | } | 283 | } |
307 | 284 | ||
308 | /* Socket demux engine toys. */ | 285 | /* Socket demux engine toys. */ |
@@ -391,14 +368,25 @@ hit: | |||
391 | goto out; | 368 | goto out; |
392 | } | 369 | } |
393 | 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 | |||
394 | static inline struct sock *__inet_lookup(struct inet_hashinfo *hashinfo, | 381 | static inline struct sock *__inet_lookup(struct inet_hashinfo *hashinfo, |
395 | const u32 saddr, const u16 sport, | 382 | const u32 saddr, const u16 sport, |
396 | const u32 daddr, const u16 hnum, | 383 | const u32 daddr, const u16 dport, |
397 | const int dif) | 384 | const int dif) |
398 | { | 385 | { |
386 | u16 hnum = ntohs(dport); | ||
399 | struct sock *sk = __inet_lookup_established(hashinfo, saddr, sport, daddr, | 387 | struct sock *sk = __inet_lookup_established(hashinfo, saddr, sport, daddr, |
400 | hnum, dif); | 388 | hnum, dif); |
401 | return sk ? : inet_lookup_listener(hashinfo, daddr, hnum, dif); | 389 | return sk ? : __inet_lookup_listener(hashinfo, daddr, hnum, dif); |
402 | } | 390 | } |
403 | 391 | ||
404 | static inline struct sock *inet_lookup(struct inet_hashinfo *hashinfo, | 392 | static inline struct sock *inet_lookup(struct inet_hashinfo *hashinfo, |
@@ -409,7 +397,7 @@ static inline struct sock *inet_lookup(struct inet_hashinfo *hashinfo, | |||
409 | struct sock *sk; | 397 | struct sock *sk; |
410 | 398 | ||
411 | local_bh_disable(); | 399 | local_bh_disable(); |
412 | sk = __inet_lookup(hashinfo, saddr, sport, daddr, ntohs(dport), dif); | 400 | sk = __inet_lookup(hashinfo, saddr, sport, daddr, dport, dif); |
413 | local_bh_enable(); | 401 | local_bh_enable(); |
414 | 402 | ||
415 | return sk; | 403 | return sk; |