net_rand.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. * Based on LiMon - BOOTP.
  3. *
  4. * Copyright 1994, 1995, 2000 Neil Russell.
  5. * (See License)
  6. * Copyright 2000 Roland Borde
  7. * Copyright 2000 Paolo Scaffardi
  8. * Copyright 2000-2004 Wolfgang Denk, wd@denx.de
  9. */
  10. #include <common.h>
  11. #include <net.h>
  12. #include "net_rand.h"
  13. static ulong seed1, seed2;
  14. void srand_mac(void)
  15. {
  16. ulong tst1, tst2, m_mask;
  17. ulong m_value = 0;
  18. int reg;
  19. unsigned char bi_enetaddr[6];
  20. /* get our mac */
  21. eth_getenv_enetaddr("ethaddr", bi_enetaddr);
  22. debug("BootpRequest => Our Mac: ");
  23. for (reg = 0; reg < 6; reg++)
  24. debug("%x%c", bi_enetaddr[reg], reg == 5 ? '\n' : ':');
  25. /* Mac-Manipulation 2 get seed1 */
  26. tst1 = 0;
  27. tst2 = 0;
  28. for (reg = 2; reg < 6; reg++) {
  29. tst1 = tst1 << 8;
  30. tst1 = tst1 | bi_enetaddr[reg];
  31. }
  32. for (reg = 0; reg < 2; reg++) {
  33. tst2 = tst2 | bi_enetaddr[reg];
  34. tst2 = tst2 << 8;
  35. }
  36. seed1 = tst1^tst2;
  37. /* Mirror seed1*/
  38. m_mask = 0x1;
  39. for (reg = 1; reg <= 32; reg++) {
  40. m_value |= (m_mask & seed1);
  41. seed1 = seed1 >> 1;
  42. m_value = m_value << 1;
  43. }
  44. seed1 = m_value;
  45. seed2 = 0xb78d0945;
  46. }
  47. unsigned long rand(void)
  48. {
  49. ulong sum;
  50. /* Random Number Generator */
  51. sum = seed1 + seed2;
  52. if (sum < seed1 || sum < seed2)
  53. sum++;
  54. seed2 = seed1;
  55. seed1 = sum;
  56. return sum;
  57. }