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>master
parent
806150063a
commit
eafc8db0e3
@ -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; |
||||
} |
@ -0,0 +1,26 @@ |
||||
/*
|
||||
* Copied from LiMon - BOOTP. |
||||
* |
||||
* Copyright 1994, 1995, 2000 Neil Russell. |
||||
* (See License) |
||||
* Copyright 2000 Paolo Scaffardi |
||||
*/ |
||||
|
||||
#ifndef __NET_RAND_H__ |
||||
#define __NET_RAND_H__ |
||||
|
||||
#define RAND_MAX 0xffffffff |
||||
|
||||
/*
|
||||
* Seed the random number generator using the eth0 MAC address |
||||
*/ |
||||
void srand_mac(void); |
||||
|
||||
/*
|
||||
* Get a random number (after seeding with MAC address) |
||||
* |
||||
* @return random number |
||||
*/ |
||||
unsigned long rand(void); |
||||
|
||||
#endif /* __NET_RAND_H__ */ |
Loading…
Reference in new issue