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