diff options
Diffstat (limited to 'net/ipv6/udp.c')
-rw-r--r-- | net/ipv6/udp.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 324bd36c23bc..44fc4e3d661f 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -59,10 +59,21 @@ static unsigned int udp6_ehashfn(struct net *net, | |||
59 | const struct in6_addr *faddr, | 59 | const struct in6_addr *faddr, |
60 | const __be16 fport) | 60 | const __be16 fport) |
61 | { | 61 | { |
62 | const u32 lhash = (__force u32)laddr->s6_addr32[3]; | 62 | static u32 udp6_ehash_secret __read_mostly; |
63 | const u32 fhash = __ipv6_addr_jhash(faddr, ipv6_hash_secret); | 63 | static u32 udp_ipv6_hash_secret __read_mostly; |
64 | |||
65 | u32 lhash, fhash; | ||
66 | |||
67 | net_get_random_once(&udp6_ehash_secret, | ||
68 | sizeof(udp6_ehash_secret)); | ||
69 | net_get_random_once(&udp_ipv6_hash_secret, | ||
70 | sizeof(udp_ipv6_hash_secret)); | ||
71 | |||
72 | lhash = (__force u32)laddr->s6_addr32[3]; | ||
73 | fhash = __ipv6_addr_jhash(faddr, udp_ipv6_hash_secret); | ||
74 | |||
64 | return __inet6_ehashfn(lhash, lport, fhash, fport, | 75 | return __inet6_ehashfn(lhash, lport, fhash, fport, |
65 | inet_ehash_secret + net_hash_mix(net)); | 76 | udp_ipv6_hash_secret + net_hash_mix(net)); |
66 | } | 77 | } |
67 | 78 | ||
68 | int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2) | 79 | int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2) |