Commit eafc8db0e35275330f43a4cf7b7ae8aba71c9728
1 parent
806150063a
Exists in
master
and in
54 other branches
net: Move MAC-seeded rand out of bootp.c
Make the MAC-seeded random number generator available to /net in general. MAC-seeded rand will be needed by link-local as well, so give it an interface. Signed-off-by: Joe Hershberger <joe.hershberger@ni.com> Acked-by: Simon Glass <sjg@chromium.org>
Showing 5 changed files with 107 additions and 58 deletions Side-by-side Diff
net/Makefile
... | ... | @@ -31,6 +31,7 @@ |
31 | 31 | COBJS-$(CONFIG_CMD_DNS) += dns.o |
32 | 32 | COBJS-$(CONFIG_CMD_NET) += eth.o |
33 | 33 | COBJS-$(CONFIG_CMD_NET) += net.o |
34 | +COBJS-$(CONFIG_BOOTP_RANDOM_DELAY) += net_rand.o | |
34 | 35 | COBJS-$(CONFIG_CMD_NFS) += nfs.o |
35 | 36 | COBJS-$(CONFIG_CMD_RARP) += rarp.o |
36 | 37 | COBJS-$(CONFIG_CMD_SNTP) += sntp.o |
net/bootp.c
... | ... | @@ -12,6 +12,7 @@ |
12 | 12 | #include <command.h> |
13 | 13 | #include <net.h> |
14 | 14 | #include "bootp.h" |
15 | +#include "net_rand.h" | |
15 | 16 | #include "tftp.h" |
16 | 17 | #include "nfs.h" |
17 | 18 | #ifdef CONFIG_STATUS_LED |
... | ... | @@ -37,9 +38,6 @@ |
37 | 38 | |
38 | 39 | ulong BootpID; |
39 | 40 | int BootpTry; |
40 | -#ifdef CONFIG_BOOTP_RANDOM_DELAY | |
41 | -ulong seed1, seed2; | |
42 | -#endif | |
43 | 41 | |
44 | 42 | #if defined(CONFIG_CMD_DHCP) |
45 | 43 | dhcp_state_t dhcp_state = INIT; |
... | ... | @@ -584,6 +582,9 @@ |
584 | 582 | uchar *pkt, *iphdr; |
585 | 583 | struct Bootp_t *bp; |
586 | 584 | int ext_len, pktlen, iplen; |
585 | +#ifdef CONFIG_BOOTP_RANDOM_DELAY | |
586 | + ulong i, rand_ms; | |
587 | +#endif | |
587 | 588 | |
588 | 589 | bootstage_mark_name(BOOTSTAGE_ID_BOOTP_START, "bootp_start"); |
589 | 590 | #if defined(CONFIG_CMD_DHCP) |
590 | 591 | |
591 | 592 | |
... | ... | @@ -591,60 +592,16 @@ |
591 | 592 | #endif |
592 | 593 | |
593 | 594 | #ifdef CONFIG_BOOTP_RANDOM_DELAY /* Random BOOTP delay */ |
594 | - unsigned char bi_enetaddr[6]; | |
595 | - int reg; | |
596 | - ulong tst1, tst2, sum, m_mask, m_value = 0; | |
595 | + if (BootpTry == 0) | |
596 | + srand_mac(); | |
597 | 597 | |
598 | - if (BootpTry == 0) { | |
599 | - /* get our mac */ | |
600 | - eth_getenv_enetaddr("ethaddr", bi_enetaddr); | |
598 | + if (BootpTry <= 2) /* Start with max 1024 * 1ms */ | |
599 | + rand_ms = rand() >> (22 - BootpTry); | |
600 | + else /* After 3rd BOOTP request max 8192 * 1ms */ | |
601 | + rand_ms = rand() >> 19; | |
601 | 602 | |
602 | - debug("BootpRequest => Our Mac: "); | |
603 | - for (reg = 0; reg < 6; reg++) | |
604 | - debug("%x%c", bi_enetaddr[reg], reg == 5 ? '\n' : ':'); | |
605 | - | |
606 | - /* Mac-Manipulation 2 get seed1 */ | |
607 | - tst1 = 0; | |
608 | - tst2 = 0; | |
609 | - for (reg = 2; reg < 6; reg++) { | |
610 | - tst1 = tst1 << 8; | |
611 | - tst1 = tst1 | bi_enetaddr[reg]; | |
612 | - } | |
613 | - for (reg = 0; reg < 2; reg++) { | |
614 | - tst2 = tst2 | bi_enetaddr[reg]; | |
615 | - tst2 = tst2 << 8; | |
616 | - } | |
617 | - | |
618 | - seed1 = tst1^tst2; | |
619 | - | |
620 | - /* Mirror seed1*/ | |
621 | - m_mask = 0x1; | |
622 | - for (reg = 1; reg <= 32; reg++) { | |
623 | - m_value |= (m_mask & seed1); | |
624 | - seed1 = seed1 >> 1; | |
625 | - m_value = m_value << 1; | |
626 | - } | |
627 | - seed1 = m_value; | |
628 | - seed2 = 0xB78D0945; | |
629 | - } | |
630 | - | |
631 | - /* Random Number Generator */ | |
632 | - for (reg = 0; reg <= 0; reg++) { | |
633 | - sum = seed1 + seed2; | |
634 | - if (sum < seed1 || sum < seed2) | |
635 | - sum++; | |
636 | - seed2 = seed1; | |
637 | - seed1 = sum; | |
638 | - | |
639 | - if (BootpTry <= 2) { /* Start with max 1024 * 1ms */ | |
640 | - sum = sum >> (22-BootpTry); | |
641 | - } else { /*After 3rd BOOTP request max 8192 * 1ms */ | |
642 | - sum = sum >> 19; | |
643 | - } | |
644 | - } | |
645 | - | |
646 | - printf("Random delay: %ld ms...\n", sum); | |
647 | - for (reg = 0; reg < sum; reg++) | |
603 | + printf("Random delay: %ld ms...\n", rand_ms); | |
604 | + for (i = 0; i < rand_ms; i++) | |
648 | 605 | udelay(1000); /*Wait 1ms*/ |
649 | 606 | |
650 | 607 | #endif /* CONFIG_BOOTP_RANDOM_DELAY */ |
net/bootp.h
... | ... | @@ -63,9 +63,6 @@ |
63 | 63 | extern ulong BootpID; /* ID of cur BOOTP request */ |
64 | 64 | extern char BootFile[128]; /* Boot file name */ |
65 | 65 | extern int BootpTry; |
66 | -#ifdef CONFIG_BOOTP_RANDOM_DELAY | |
67 | -extern ulong seed1, seed2; /* seed for random BOOTP delay */ | |
68 | -#endif | |
69 | 66 | |
70 | 67 | |
71 | 68 | /* Send a BOOTP request */ |
net/net_rand.c
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 | + | |
11 | +#include <common.h> | |
12 | +#include <net.h> | |
13 | +#include "net_rand.h" | |
14 | + | |
15 | +static ulong seed1, seed2; | |
16 | + | |
17 | +void srand_mac(void) | |
18 | +{ | |
19 | + ulong tst1, tst2, m_mask; | |
20 | + ulong m_value = 0; | |
21 | + int reg; | |
22 | + unsigned char bi_enetaddr[6]; | |
23 | + | |
24 | + /* get our mac */ | |
25 | + eth_getenv_enetaddr("ethaddr", bi_enetaddr); | |
26 | + | |
27 | + debug("BootpRequest => Our Mac: "); | |
28 | + for (reg = 0; reg < 6; reg++) | |
29 | + debug("%x%c", bi_enetaddr[reg], reg == 5 ? '\n' : ':'); | |
30 | + | |
31 | + /* Mac-Manipulation 2 get seed1 */ | |
32 | + tst1 = 0; | |
33 | + tst2 = 0; | |
34 | + for (reg = 2; reg < 6; reg++) { | |
35 | + tst1 = tst1 << 8; | |
36 | + tst1 = tst1 | bi_enetaddr[reg]; | |
37 | + } | |
38 | + for (reg = 0; reg < 2; reg++) { | |
39 | + tst2 = tst2 | bi_enetaddr[reg]; | |
40 | + tst2 = tst2 << 8; | |
41 | + } | |
42 | + | |
43 | + seed1 = tst1^tst2; | |
44 | + | |
45 | + /* Mirror seed1*/ | |
46 | + m_mask = 0x1; | |
47 | + for (reg = 1; reg <= 32; reg++) { | |
48 | + m_value |= (m_mask & seed1); | |
49 | + seed1 = seed1 >> 1; | |
50 | + m_value = m_value << 1; | |
51 | + } | |
52 | + seed1 = m_value; | |
53 | + seed2 = 0xb78d0945; | |
54 | +} | |
55 | + | |
56 | +unsigned long rand(void) | |
57 | +{ | |
58 | + ulong sum; | |
59 | + | |
60 | + /* Random Number Generator */ | |
61 | + sum = seed1 + seed2; | |
62 | + if (sum < seed1 || sum < seed2) | |
63 | + sum++; | |
64 | + seed2 = seed1; | |
65 | + seed1 = sum; | |
66 | + | |
67 | + return sum; | |
68 | +} |
net/net_rand.h
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 | +#define RAND_MAX 0xffffffff | |
13 | + | |
14 | +/* | |
15 | + * Seed the random number generator using the eth0 MAC address | |
16 | + */ | |
17 | +void srand_mac(void); | |
18 | + | |
19 | +/* | |
20 | + * Get a random number (after seeding with MAC address) | |
21 | + * | |
22 | + * @return random number | |
23 | + */ | |
24 | +unsigned long rand(void); | |
25 | + | |
26 | +#endif /* __NET_RAND_H__ */ |