/* * 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 #include #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; }