Commit eafc8db0e35275330f43a4cf7b7ae8aba71c9728

Authored by Joe Hershberger
1 parent 806150063a

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

... ... @@ -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
... ... @@ -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 */
... ... @@ -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 */
  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 +}
  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__ */