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