net_rand.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. * Copied from LiMon - BOOTP.
  3. *
  4. * Copyright 1994, 1995, 2000 Neil Russell.
  5. * (See License)
  6. * Copyright 2000 Paolo Scaffardi
  7. */
  8. #ifndef __NET_RAND_H__
  9. #define __NET_RAND_H__
  10. #include <common.h>
  11. #include <dm/uclass.h>
  12. #include <rng.h>
  13. /*
  14. * Return a seed for the PRNG derived from the eth0 MAC address.
  15. */
  16. static inline unsigned int seed_mac(void)
  17. {
  18. unsigned char enetaddr[ARP_HLEN];
  19. unsigned int seed;
  20. /* get our mac */
  21. memcpy(enetaddr, eth_get_ethaddr(), ARP_HLEN);
  22. seed = enetaddr[5];
  23. seed ^= enetaddr[4] << 8;
  24. seed ^= enetaddr[3] << 16;
  25. seed ^= enetaddr[2] << 24;
  26. seed ^= enetaddr[1];
  27. seed ^= enetaddr[0] << 8;
  28. return seed;
  29. }
  30. /*
  31. * Seed the random number generator using the eth0 MAC address.
  32. */
  33. static inline void srand_mac(void)
  34. {
  35. int ret;
  36. struct udevice *devp;
  37. u32 randv = 0;
  38. if (IS_ENABLED(CONFIG_DM_RNG)) {
  39. ret = uclass_get_device(UCLASS_RNG, 0, &devp);
  40. if (ret) {
  41. ret = dm_rng_read(devp, &randv, sizeof(randv));
  42. if (ret < 0)
  43. randv = 0;
  44. }
  45. }
  46. if (randv)
  47. srand(randv);
  48. else
  49. srand(seed_mac());
  50. }
  51. #endif /* __NET_RAND_H__ */