1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  *	Copied from LiMon - BOOTP.
4  *
5  *	Copyright 1994, 1995, 2000 Neil Russell.
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  */
seed_mac(void)18 static 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  */
srand_mac(void)39 static inline void srand_mac(void)
40 {
41 	int ret;
42 	struct udevice *devp;
43 	u32 randv = 0;
44 
45 	if (CONFIG_IS_ENABLED(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