diff options
author | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 07:57:58 +0000 |
---|---|---|
committer | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 14:19:22 -0500 |
commit | eafc8db0e35275330f43a4cf7b7ae8aba71c9728 (patch) | |
tree | 0f76700afacfdeab0feafbd787e32d347083a0fd /net/net_rand.c | |
parent | 806150063a6b98d7e757bd9f640af1755bb387fd (diff) | |
download | u-boot-imx-eafc8db0e35275330f43a4cf7b7ae8aba71c9728.zip u-boot-imx-eafc8db0e35275330f43a4cf7b7ae8aba71c9728.tar.gz u-boot-imx-eafc8db0e35275330f43a4cf7b7ae8aba71c9728.tar.bz2 |
net: Move MAC-seeded rand out of bootp.c
Make the MAC-seeded random number generator available to /net in
general. MAC-seeded rand will be needed by link-local as well, so
give it an interface.
Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Acked-by: Simon Glass <sjg@chromium.org>
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 0000000..5387aba --- /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; +} |