diff options
Diffstat (limited to 'arch/um/drivers/net_user.c')
-rw-r--r-- | arch/um/drivers/net_user.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/um/drivers/net_user.c b/arch/um/drivers/net_user.c index 107c5e43fa00..142bcb2c7c6a 100644 --- a/arch/um/drivers/net_user.c +++ b/arch/um/drivers/net_user.c @@ -12,6 +12,7 @@ #include <string.h> #include <sys/socket.h> #include <sys/wait.h> +#include <sys/time.h> #include "user.h" #include "user_util.h" #include "kern_util.h" @@ -258,3 +259,32 @@ char *split_if_spec(char *str, ...) va_end(ap); return str; } + +void random_mac(unsigned char *addr) +{ + struct timeval tv; + long n; + unsigned int seed; + + gettimeofday(&tv, NULL); + + /* Assume that 20 bits of microseconds and 12 bits of the pid are + * reasonably unpredictable. + */ + seed = tv.tv_usec | (os_getpid() << 20); + srandom(seed); + + /* Don't care about endianness here - switching endianness + * just rearranges what are hopefully random numbers. + * + * Assume that RAND_MAX > 65536, so random is called twice and + * we use 16 bits of the result. + */ + n = random(); + addr[2] = (n >> 8) & 255; + addr[3] = n % 255; + + n = random(); + addr[4] = (n >> 8) & 255; + addr[5] = n % 255; +} |