Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (46 commits) tcp: MD5: Fix IPv6 signatures skbuff: add missing kernel-doc for do_not_encrypt net/ipv4/route.c: fix build error tcp: MD5: Fix MD5 signatures on certain ACK packets ipv6: Fix ip6_xmit to send fragments if ipfragok is true ipvs: Move userspace definitions to include/linux/ip_vs.h netdev: Fix lockdep warnings in multiqueue configurations. netfilter: xt_hashlimit: fix race between htable_destroy and htable_gc netfilter: ipt_recent: fix race between recent_mt_destroy and proc manipulations netfilter: nf_conntrack_tcp: decrease timeouts while data in unacknowledged irda: replace __FUNCTION__ with __func__ nsc-ircc: default to dongle type 9 on IBM hardware bluetooth: add quirks for a few hci_usb devices hysdn: remove the packed attribute from PofTimStamp_tag isdn: use the common ascii hex helpers tg3: adapt tg3 to use reworked PCI PM code atm: fix direct casts of pointers to u32 in the InterPhase driver atm: fix const assignment/discard warnings in the ATM networking driver net: use the common ascii hex helpers random32: seeding improvement ...
This commit is contained in:
+27
-21
@@ -56,23 +56,12 @@ static u32 __random32(struct rnd_state *state)
|
||||
return (state->s1 ^ state->s2 ^ state->s3);
|
||||
}
|
||||
|
||||
static void __set_random32(struct rnd_state *state, unsigned long s)
|
||||
/*
|
||||
* Handle minimum values for seeds
|
||||
*/
|
||||
static inline u32 __seed(u32 x, u32 m)
|
||||
{
|
||||
if (s == 0)
|
||||
s = 1; /* default seed is 1 */
|
||||
|
||||
#define LCG(n) (69069 * n)
|
||||
state->s1 = LCG(s);
|
||||
state->s2 = LCG(state->s1);
|
||||
state->s3 = LCG(state->s2);
|
||||
|
||||
/* "warm it up" */
|
||||
__random32(state);
|
||||
__random32(state);
|
||||
__random32(state);
|
||||
__random32(state);
|
||||
__random32(state);
|
||||
__random32(state);
|
||||
return (x < m) ? x + m : x;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -107,7 +96,7 @@ void srandom32(u32 entropy)
|
||||
*/
|
||||
for_each_possible_cpu (i) {
|
||||
struct rnd_state *state = &per_cpu(net_rand_state, i);
|
||||
__set_random32(state, state->s1 ^ entropy);
|
||||
state->s1 = __seed(state->s1 ^ entropy, 1);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(srandom32);
|
||||
@@ -122,7 +111,19 @@ static int __init random32_init(void)
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
struct rnd_state *state = &per_cpu(net_rand_state,i);
|
||||
__set_random32(state, i + jiffies);
|
||||
|
||||
#define LCG(x) ((x) * 69069) /* super-duper LCG */
|
||||
state->s1 = __seed(LCG(i + jiffies), 1);
|
||||
state->s2 = __seed(LCG(state->s1), 7);
|
||||
state->s3 = __seed(LCG(state->s2), 15);
|
||||
|
||||
/* "warm it up" */
|
||||
__random32(state);
|
||||
__random32(state);
|
||||
__random32(state);
|
||||
__random32(state);
|
||||
__random32(state);
|
||||
__random32(state);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -135,13 +136,18 @@ core_initcall(random32_init);
|
||||
static int __init random32_reseed(void)
|
||||
{
|
||||
int i;
|
||||
unsigned long seed;
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
struct rnd_state *state = &per_cpu(net_rand_state,i);
|
||||
u32 seeds[3];
|
||||
|
||||
get_random_bytes(&seed, sizeof(seed));
|
||||
__set_random32(state, seed);
|
||||
get_random_bytes(&seeds, sizeof(seeds));
|
||||
state->s1 = __seed(seeds[0], 1);
|
||||
state->s2 = __seed(seeds[1], 7);
|
||||
state->s3 = __seed(seeds[2], 15);
|
||||
|
||||
/* mix it in */
|
||||
__random32(state);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user