diff options
author | David S. Miller <davem@davemloft.net> | 2013-10-19 19:45:46 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-19 19:45:46 -0400 |
commit | 7dcade390860712551a4feb080911d5002226188 (patch) | |
tree | 68768a3e760a90b2b13a8e7a83d573c0e63a4a35 /include/linux/net.h | |
parent | 53481da372851a5506deb5247302f75459b472b4 (diff) | |
parent | e34c9a69970d8664a36b46e6445a7cc879111cfd (diff) |
Merge branch 'net_get_random_once'
Hannes Frederic Sowa says:
====================
This series implements support for delaying the initialization of secret
keys, e.g. used for hashing, for as long as possible. This functionality
is implemented by a new macro, net_get_random_bytes.
I already used it to protect the socket hashes, the syncookie secret
(most important) and the tcp_fastopen secrets.
Changelog:
v2) Use static_keys in net_get_random_once to have as minimal impact to
the fast-path as possible.
v3) added patch "static_key: WARN on usage before jump_label_init was called":
Patch "x86/jump_label: expect default_nop if static_key gets enabled
on boot-up" relaxes the checks for using static_key primitives before
jump_label_init. So tighten them first.
v4) Update changelog on the patch "static_key: WARN on usage before
jump_label_init was called"
Included patches:
ipv4: split inet_ehashfn to hash functions per compilation unit
ipv6: split inet6_ehashfn to hash functions per compilation unit
static_key: WARN on usage before jump_label_init was called
x86/jump_label: expect default_nop if static_key gets enabled on boot-up
net: introduce new macro net_get_random_once
inet: split syncookie keys for ipv4 and ipv6 and initialize with net_get_random_once
inet: convert inet_ehash_secret and ipv6_hash_secret to net_get_random_once
tcp: switch tcp_fastopen key generation to net_get_random_once
net: switch net_secret key generation to net_get_random_once
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/net.h')
-rw-r--r-- | include/linux/net.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/include/linux/net.h b/include/linux/net.h index ca9ec8540905..a489705f6fa3 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
@@ -239,6 +239,31 @@ do { \ | |||
239 | #define net_random() prandom_u32() | 239 | #define net_random() prandom_u32() |
240 | #define net_srandom(seed) prandom_seed((__force u32)(seed)) | 240 | #define net_srandom(seed) prandom_seed((__force u32)(seed)) |
241 | 241 | ||
242 | bool __net_get_random_once(void *buf, int nbytes, bool *done, | ||
243 | struct static_key *done_key); | ||
244 | |||
245 | #ifdef HAVE_JUMP_LABEL | ||
246 | #define ___NET_RANDOM_STATIC_KEY_INIT ((struct static_key) \ | ||
247 | { .enabled = ATOMIC_INIT(0), .entries = (void *)1 }) | ||
248 | #else /* !HAVE_JUMP_LABEL */ | ||
249 | #define ___NET_RANDOM_STATIC_KEY_INIT STATIC_KEY_INIT_FALSE | ||
250 | #endif /* HAVE_JUMP_LABEL */ | ||
251 | |||
252 | /* BE CAREFUL: this function is not interrupt safe */ | ||
253 | #define net_get_random_once(buf, nbytes) \ | ||
254 | ({ \ | ||
255 | bool ___ret = false; \ | ||
256 | static bool ___done = false; \ | ||
257 | static struct static_key ___done_key = \ | ||
258 | ___NET_RANDOM_STATIC_KEY_INIT; \ | ||
259 | if (!static_key_true(&___done_key)) \ | ||
260 | ___ret = __net_get_random_once(buf, \ | ||
261 | nbytes, \ | ||
262 | &___done, \ | ||
263 | &___done_key); \ | ||
264 | ___ret; \ | ||
265 | }) | ||
266 | |||
242 | int kernel_sendmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, | 267 | int kernel_sendmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, |
243 | size_t num, size_t len); | 268 | size_t num, size_t len); |
244 | int kernel_recvmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, | 269 | int kernel_recvmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, |