aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/udp.c
diff options
context:
space:
mode:
authorHannes Frederic Sowa <hannes@stressinduktion.org>2013-10-19 15:48:57 -0400
committerDavid S. Miller <davem@davemloft.net>2013-10-19 19:45:35 -0400
commit1bbdceef1e535add893bf71d7b7ab102e4eb69eb (patch)
treee2eed21c778d0a6458f8350ce5f6fbfc6c58810e /net/ipv6/udp.c
parentb23a002fc6f0c19846ee0382f019429af54a27e9 (diff)
inet: convert inet_ehash_secret and ipv6_hash_secret to net_get_random_once
Initialize the ehash and ipv6_hash_secrets with net_get_random_once. Each compilation unit gets its own secret now: ipv4/inet_hashtables.o ipv4/udp.o ipv6/inet6_hashtables.o ipv6/udp.o rds/connection.o The functions still get inlined into the hashing functions. In the fast path we have at most two (needed in ipv6) if (unlikely(...)). Cc: Eric Dumazet <edumazet@google.com> Cc: "David S. Miller" <davem@davemloft.net> Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/udp.c')
-rw-r--r--net/ipv6/udp.c17
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
68int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2) 79int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2)