diff options
Diffstat (limited to 'include/net/inet6_hashtables.h')
-rw-r--r-- | include/net/inet6_hashtables.h | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h index 9e34c877a770..fd4ee016ba5c 100644 --- a/include/net/inet6_hashtables.h +++ b/include/net/inet6_hashtables.h | |||
@@ -28,16 +28,16 @@ | |||
28 | 28 | ||
29 | struct inet_hashinfo; | 29 | struct inet_hashinfo; |
30 | 30 | ||
31 | /* I have no idea if this is a good hash for v6 or not. -DaveM */ | ||
32 | static inline unsigned int inet6_ehashfn(struct net *net, | 31 | static inline unsigned int inet6_ehashfn(struct net *net, |
33 | const struct in6_addr *laddr, const u16 lport, | 32 | const struct in6_addr *laddr, const u16 lport, |
34 | const struct in6_addr *faddr, const __be16 fport) | 33 | const struct in6_addr *faddr, const __be16 fport) |
35 | { | 34 | { |
36 | u32 ports = (lport ^ (__force u16)fport); | 35 | u32 ports = (((u32)lport) << 16) | (__force u32)fport; |
37 | 36 | ||
38 | return jhash_3words((__force u32)laddr->s6_addr32[3], | 37 | return jhash_3words((__force u32)laddr->s6_addr32[3], |
39 | (__force u32)faddr->s6_addr32[3], | 38 | ipv6_addr_jhash(faddr), |
40 | ports, inet_ehash_secret + net_hash_mix(net)); | 39 | ports, |
40 | inet_ehash_secret + net_hash_mix(net)); | ||
41 | } | 41 | } |
42 | 42 | ||
43 | static inline int inet6_sk_ehashfn(const struct sock *sk) | 43 | static inline int inet6_sk_ehashfn(const struct sock *sk) |
@@ -71,6 +71,8 @@ extern struct sock *__inet6_lookup_established(struct net *net, | |||
71 | 71 | ||
72 | extern struct sock *inet6_lookup_listener(struct net *net, | 72 | extern struct sock *inet6_lookup_listener(struct net *net, |
73 | struct inet_hashinfo *hashinfo, | 73 | struct inet_hashinfo *hashinfo, |
74 | const struct in6_addr *saddr, | ||
75 | const __be16 sport, | ||
74 | const struct in6_addr *daddr, | 76 | const struct in6_addr *daddr, |
75 | const unsigned short hnum, | 77 | const unsigned short hnum, |
76 | const int dif); | 78 | const int dif); |
@@ -88,7 +90,8 @@ static inline struct sock *__inet6_lookup(struct net *net, | |||
88 | if (sk) | 90 | if (sk) |
89 | return sk; | 91 | return sk; |
90 | 92 | ||
91 | return inet6_lookup_listener(net, hashinfo, daddr, hnum, dif); | 93 | return inet6_lookup_listener(net, hashinfo, saddr, sport, |
94 | daddr, hnum, dif); | ||
92 | } | 95 | } |
93 | 96 | ||
94 | static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo, | 97 | static inline struct sock *__inet6_lookup_skb(struct inet_hashinfo *hashinfo, |