diff options
Diffstat (limited to 'include/net/inet6_hashtables.h')
| -rw-r--r-- | include/net/inet6_hashtables.h | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h index 03df3b157960..5a2beed5a770 100644 --- a/include/net/inet6_hashtables.h +++ b/include/net/inet6_hashtables.h | |||
| @@ -26,19 +26,18 @@ | |||
| 26 | struct inet_hashinfo; | 26 | struct inet_hashinfo; |
| 27 | 27 | ||
| 28 | /* I have no idea if this is a good hash for v6 or not. -DaveM */ | 28 | /* I have no idea if this is a good hash for v6 or not. -DaveM */ |
| 29 | static inline int inet6_ehashfn(const struct in6_addr *laddr, const u16 lport, | 29 | static inline unsigned int inet6_ehashfn(const struct in6_addr *laddr, const u16 lport, |
| 30 | const struct in6_addr *faddr, const u16 fport, | 30 | const struct in6_addr *faddr, const u16 fport) |
| 31 | const int ehash_size) | ||
| 32 | { | 31 | { |
| 33 | int hashent = (lport ^ fport); | 32 | unsigned int hashent = (lport ^ fport); |
| 34 | 33 | ||
| 35 | hashent ^= (laddr->s6_addr32[3] ^ faddr->s6_addr32[3]); | 34 | hashent ^= (laddr->s6_addr32[3] ^ faddr->s6_addr32[3]); |
| 36 | hashent ^= hashent >> 16; | 35 | hashent ^= hashent >> 16; |
| 37 | hashent ^= hashent >> 8; | 36 | hashent ^= hashent >> 8; |
| 38 | return (hashent & (ehash_size - 1)); | 37 | return hashent; |
| 39 | } | 38 | } |
| 40 | 39 | ||
| 41 | static inline int inet6_sk_ehashfn(const struct sock *sk, const int ehash_size) | 40 | static inline int inet6_sk_ehashfn(const struct sock *sk) |
| 42 | { | 41 | { |
| 43 | const struct inet_sock *inet = inet_sk(sk); | 42 | const struct inet_sock *inet = inet_sk(sk); |
| 44 | const struct ipv6_pinfo *np = inet6_sk(sk); | 43 | const struct ipv6_pinfo *np = inet6_sk(sk); |
| @@ -46,7 +45,7 @@ static inline int inet6_sk_ehashfn(const struct sock *sk, const int ehash_size) | |||
| 46 | const struct in6_addr *faddr = &np->daddr; | 45 | const struct in6_addr *faddr = &np->daddr; |
| 47 | const __u16 lport = inet->num; | 46 | const __u16 lport = inet->num; |
| 48 | const __u16 fport = inet->dport; | 47 | const __u16 fport = inet->dport; |
| 49 | return inet6_ehashfn(laddr, lport, faddr, fport, ehash_size); | 48 | return inet6_ehashfn(laddr, lport, faddr, fport); |
| 50 | } | 49 | } |
| 51 | 50 | ||
| 52 | /* | 51 | /* |
| @@ -69,14 +68,14 @@ static inline struct sock * | |||
| 69 | /* Optimize here for direct hit, only listening connections can | 68 | /* Optimize here for direct hit, only listening connections can |
| 70 | * have wildcards anyways. | 69 | * have wildcards anyways. |
| 71 | */ | 70 | */ |
| 72 | const int hash = inet6_ehashfn(daddr, hnum, saddr, sport, | 71 | unsigned int hash = inet6_ehashfn(daddr, hnum, saddr, sport); |
| 73 | hashinfo->ehash_size); | 72 | struct inet_ehash_bucket *head = inet_ehash_bucket(hashinfo, hash); |
| 74 | struct inet_ehash_bucket *head = &hashinfo->ehash[hash]; | ||
| 75 | 73 | ||
| 74 | prefetch(head->chain.first); | ||
| 76 | read_lock(&head->lock); | 75 | read_lock(&head->lock); |
| 77 | sk_for_each(sk, node, &head->chain) { | 76 | sk_for_each(sk, node, &head->chain) { |
| 78 | /* For IPV6 do the cheaper port and family tests first. */ | 77 | /* For IPV6 do the cheaper port and family tests first. */ |
| 79 | if (INET6_MATCH(sk, saddr, daddr, ports, dif)) | 78 | if (INET6_MATCH(sk, hash, saddr, daddr, ports, dif)) |
| 80 | goto hit; /* You sunk my battleship! */ | 79 | goto hit; /* You sunk my battleship! */ |
| 81 | } | 80 | } |
| 82 | /* Must check for a TIME_WAIT'er before going to listener hash. */ | 81 | /* Must check for a TIME_WAIT'er before going to listener hash. */ |
