aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/inet6_hashtables.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6/inet6_hashtables.c')
-rw-r--r--net/ipv6/inet6_hashtables.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c
index fa7dd3856c55..262e13c02ec2 100644
--- a/net/ipv6/inet6_hashtables.c
+++ b/net/ipv6/inet6_hashtables.c
@@ -29,10 +29,19 @@ static unsigned int inet6_ehashfn(struct net *net,
29 const struct in6_addr *faddr, 29 const struct in6_addr *faddr,
30 const __be16 fport) 30 const __be16 fport)
31{ 31{
32 const u32 lhash = (__force u32)laddr->s6_addr32[3]; 32 static u32 inet6_ehash_secret __read_mostly;
33 const u32 fhash = __ipv6_addr_jhash(faddr, ipv6_hash_secret); 33 static u32 ipv6_hash_secret __read_mostly;
34
35 u32 lhash, fhash;
36
37 net_get_random_once(&inet6_ehash_secret, sizeof(inet6_ehash_secret));
38 net_get_random_once(&ipv6_hash_secret, sizeof(ipv6_hash_secret));
39
40 lhash = (__force u32)laddr->s6_addr32[3];
41 fhash = __ipv6_addr_jhash(faddr, ipv6_hash_secret);
42
34 return __inet6_ehashfn(lhash, lport, fhash, fport, 43 return __inet6_ehashfn(lhash, lport, fhash, fport,
35 inet_ehash_secret + net_hash_mix(net)); 44 inet6_ehash_secret + net_hash_mix(net));
36} 45}
37 46
38static int inet6_sk_ehashfn(const struct sock *sk) 47static int inet6_sk_ehashfn(const struct sock *sk)