diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/Makefile | 2 | ||||
| -rw-r--r-- | net/link_local.c | 7 | ||||
| -rw-r--r-- | net/net_rand.c | 68 | ||||
| -rw-r--r-- | net/net_rand.h | 31 | 
4 files changed, 28 insertions, 80 deletions
| diff --git a/net/Makefile b/net/Makefile index 526468718..e7764ce93 100644 --- a/net/Makefile +++ b/net/Makefile @@ -34,8 +34,6 @@ COBJS-$(CONFIG_CMD_DNS)  += dns.o  COBJS-$(CONFIG_CMD_NET)  += eth.o  COBJS-$(CONFIG_CMD_LINK_LOCAL) += link_local.o  COBJS-$(CONFIG_CMD_NET)  += net.o -COBJS-$(CONFIG_BOOTP_RANDOM_DELAY) += net_rand.o -COBJS-$(CONFIG_CMD_LINK_LOCAL) += net_rand.o  COBJS-$(CONFIG_CMD_NFS)  += nfs.o  COBJS-$(CONFIG_CMD_PING) += ping.o  COBJS-$(CONFIG_CMD_RARP) += rarp.o diff --git a/net/link_local.c b/net/link_local.c index 336286395..582d0115b 100644 --- a/net/link_local.c +++ b/net/link_local.c @@ -56,6 +56,7 @@ static unsigned conflicts;  static unsigned nprobes;  static unsigned nclaims;  static int ready; +static unsigned int seed;  static void link_local_timeout(void); @@ -68,7 +69,7 @@ static IPaddr_t pick(void)  	unsigned tmp;  	do { -		tmp = rand() & IN_CLASSB_HOST; +		tmp = rand_r(&seed) & IN_CLASSB_HOST;  	} while (tmp > (IN_CLASSB_HOST - 0x0200));  	return (IPaddr_t) htonl((LINKLOCAL_ADDR + 0x0100) + tmp);  } @@ -78,7 +79,7 @@ static IPaddr_t pick(void)   */  static inline unsigned random_delay_ms(unsigned secs)  { -	return rand() % (secs * 1000); +	return rand_r(&seed) % (secs * 1000);  }  static void configure_wait(void) @@ -109,7 +110,7 @@ void link_local_start(void)  	}  	NetOurSubnetMask = IN_CLASSB_NET; -	srand_mac(); +	seed = seed_mac();  	if (ip == 0)  		ip = pick(); diff --git a/net/net_rand.c b/net/net_rand.c deleted file mode 100644 index 5387abadc..000000000 --- a/net/net_rand.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - *	Based on LiMon - BOOTP. - * - *	Copyright 1994, 1995, 2000 Neil Russell. - *	(See License) - *	Copyright 2000 Roland Borde - *	Copyright 2000 Paolo Scaffardi - *	Copyright 2000-2004 Wolfgang Denk, wd@denx.de - */ - -#include <common.h> -#include <net.h> -#include "net_rand.h" - -static ulong seed1, seed2; - -void srand_mac(void) -{ -	ulong tst1, tst2, m_mask; -	ulong m_value = 0; -	int reg; -	unsigned char bi_enetaddr[6]; - -	/* get our mac */ -	eth_getenv_enetaddr("ethaddr", bi_enetaddr); - -	debug("BootpRequest => Our Mac: "); -	for (reg = 0; reg < 6; reg++) -		debug("%x%c", bi_enetaddr[reg], reg == 5 ? '\n' : ':'); - -	/* Mac-Manipulation 2 get seed1 */ -	tst1 = 0; -	tst2 = 0; -	for (reg = 2; reg < 6; reg++) { -		tst1 = tst1 << 8; -		tst1 = tst1 | bi_enetaddr[reg]; -	} -	for (reg = 0; reg < 2; reg++) { -		tst2 = tst2 | bi_enetaddr[reg]; -		tst2 = tst2 << 8; -	} - -	seed1 = tst1^tst2; - -	/* Mirror seed1*/ -	m_mask = 0x1; -	for (reg = 1; reg <= 32; reg++) { -		m_value |= (m_mask & seed1); -		seed1 = seed1 >> 1; -		m_value = m_value << 1; -	} -	seed1 = m_value; -	seed2 = 0xb78d0945; -} - -unsigned long rand(void) -{ -	ulong sum; - -	/* Random Number Generator */ -	sum = seed1 + seed2; -	if (sum < seed1 || sum < seed2) -		sum++; -	seed2 = seed1; -	seed1 = sum; - -	return sum; -} diff --git a/net/net_rand.h b/net/net_rand.h index c98db6428..ba9d0642c 100644 --- a/net/net_rand.h +++ b/net/net_rand.h @@ -9,18 +9,35 @@  #ifndef __NET_RAND_H__  #define __NET_RAND_H__ -#define RAND_MAX 0xffffffff +#include <common.h>  /* - * Seed the random number generator using the eth0 MAC address + * Return a seed for the PRNG derived from the eth0 MAC address.   */ -void srand_mac(void); +static inline unsigned int seed_mac(void) +{ +	unsigned char enetaddr[6]; +	unsigned int seed; + +	/* get our mac */ +	eth_getenv_enetaddr("ethaddr", enetaddr); + +	seed = enetaddr[5]; +	seed ^= enetaddr[4] << 8; +	seed ^= enetaddr[3] << 16; +	seed ^= enetaddr[2] << 24; +	seed ^= enetaddr[1]; +	seed ^= enetaddr[0] << 8; + +	return seed; +}  /* - * Get a random number (after seeding with MAC address) - * - * @return random number + * Seed the random number generator using the eth0 MAC address.   */ -unsigned long rand(void); +static inline void srand_mac(void) +{ +	srand(seed_mac()); +}  #endif /* __NET_RAND_H__ */ |