diff options
Diffstat (limited to 'net/net_rand.c')
| -rw-r--r-- | net/net_rand.c | 68 | 
1 files changed, 68 insertions, 0 deletions
| diff --git a/net/net_rand.c b/net/net_rand.c new file mode 100644 index 000000000..5387abadc --- /dev/null +++ b/net/net_rand.c @@ -0,0 +1,68 @@ +/* + *	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; +} |