]> git.hungrycats.org Git - linux/commitdiff
[NET]: net_random_init needs to get seed later in boot process
authorStephen Hemminger <shemminger@osdl.org>
Mon, 30 Aug 2004 09:37:48 +0000 (02:37 -0700)
committerDavid S. Miller <davem@kernel.bkbits.net>
Mon, 30 Aug 2004 09:37:48 +0000 (02:37 -0700)
Argh.. random_init isn't called until the device's are initialized.
Rather than mess with random.c initialization, how about this; it resets
the net_random state late in initialization when get_random_bytes is ready.

Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/utils.c

index 6093174581fd07479b0ff69e626efc42fdce161e..e11a8654f36390f30162e11b6cdbad3d0ee73a26 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/types.h>
 #include <linux/random.h>
 #include <linux/percpu.h>
+#include <linux/init.h>
 
 #include <asm/system.h>
 #include <asm/uaccess.h>
@@ -77,10 +78,8 @@ static u32 __net_random(struct nrnd_state *state)
        return (state->s1 ^ state->s2 ^ state->s3);
 }
 
-static void __net_srandom(struct nrnd_state *state, unsigned long entropy)
+static void __net_srandom(struct nrnd_state *state, unsigned long s)
 {
-       u32 s = state->s1 ^ entropy;
-
        if (s == 0)
                s = 1;      /* default seed is 1 */
 
@@ -112,24 +111,33 @@ unsigned long net_random(void)
 void net_srandom(unsigned long entropy)
 {
        struct nrnd_state *state = &get_cpu_var(net_rand_state);
-       __net_srandom(state, entropy);
+       __net_srandom(state, state->s1^entropy);
        put_cpu_var(state);
 }
 
 void __init net_random_init(void)
+{
+       int i;
+
+       for (i = 0; i < NR_CPUS; i++) {
+               struct nrnd_state *state = &per_cpu(net_rand_state,i);
+               __net_srandom(state, i+jiffies);
+       }
+}
+
+static int net_random_reseed(void)
 {
        int i;
        unsigned long seed[NR_CPUS];
 
        get_random_bytes(seed, sizeof(seed));
-
        for (i = 0; i < NR_CPUS; i++) {
                struct nrnd_state *state = &per_cpu(net_rand_state,i);
-
-               memset(state, 0, sizeof(*state));
                __net_srandom(state, seed[i]);
        }
+       return 0;
 }
+late_initcall(net_random_reseed);
 
 int net_msg_cost = 5*HZ;
 int net_msg_burst = 10;