diff options
author | Hannes Frederic Sowa <hannes@stressinduktion.org> | 2013-10-19 15:48:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-19 19:45:35 -0400 |
commit | 1bbdceef1e535add893bf71d7b7ab102e4eb69eb (patch) | |
tree | e2eed21c778d0a6458f8350ce5f6fbfc6c58810e /net/ipv4/af_inet.c | |
parent | b23a002fc6f0c19846ee0382f019429af54a27e9 (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/ipv4/af_inet.c')
-rw-r--r-- | net/ipv4/af_inet.c | 27 |
1 files changed, 0 insertions, 27 deletions
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 4049906010f7..9433a6186f54 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -245,29 +245,6 @@ out: | |||
245 | } | 245 | } |
246 | EXPORT_SYMBOL(inet_listen); | 246 | EXPORT_SYMBOL(inet_listen); |
247 | 247 | ||
248 | u32 inet_ehash_secret __read_mostly; | ||
249 | EXPORT_SYMBOL(inet_ehash_secret); | ||
250 | |||
251 | u32 ipv6_hash_secret __read_mostly; | ||
252 | EXPORT_SYMBOL(ipv6_hash_secret); | ||
253 | |||
254 | /* | ||
255 | * inet_ehash_secret must be set exactly once, and to a non nul value | ||
256 | * ipv6_hash_secret must be set exactly once. | ||
257 | */ | ||
258 | void build_ehash_secret(void) | ||
259 | { | ||
260 | u32 rnd; | ||
261 | |||
262 | do { | ||
263 | get_random_bytes(&rnd, sizeof(rnd)); | ||
264 | } while (rnd == 0); | ||
265 | |||
266 | if (cmpxchg(&inet_ehash_secret, 0, rnd) == 0) | ||
267 | get_random_bytes(&ipv6_hash_secret, sizeof(ipv6_hash_secret)); | ||
268 | } | ||
269 | EXPORT_SYMBOL(build_ehash_secret); | ||
270 | |||
271 | /* | 248 | /* |
272 | * Create an inet socket. | 249 | * Create an inet socket. |
273 | */ | 250 | */ |
@@ -284,10 +261,6 @@ static int inet_create(struct net *net, struct socket *sock, int protocol, | |||
284 | int try_loading_module = 0; | 261 | int try_loading_module = 0; |
285 | int err; | 262 | int err; |
286 | 263 | ||
287 | if (unlikely(!inet_ehash_secret)) | ||
288 | if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM) | ||
289 | build_ehash_secret(); | ||
290 | |||
291 | sock->state = SS_UNCONNECTED; | 264 | sock->state = SS_UNCONNECTED; |
292 | 265 | ||
293 | /* Look for the requested type/protocol pair. */ | 266 | /* Look for the requested type/protocol pair. */ |