From patchwork Fri Jan 20 00:53:07 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joe Hershberger X-Patchwork-Id: 136960 X-Patchwork-Delegate: joe.hershberger@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 9F4BD1007D5 for ; Fri, 20 Jan 2012 20:08:20 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 8FC252831E; Fri, 20 Jan 2012 10:08:05 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 5WT3Xh+r1R04; Fri, 20 Jan 2012 10:08:05 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 367CB28321; Fri, 20 Jan 2012 10:07:34 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 2CFF1283CE for ; Thu, 19 Jan 2012 23:50:45 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id kSvgjm54JIf1 for ; Thu, 19 Jan 2012 23:50:44 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from spamkiller05.natinst.com (mailserver5.natinst.com [130.164.80.5]) by theia.denx.de (Postfix) with ESMTP id 5BEE1283C8 for ; Thu, 19 Jan 2012 23:50:42 +0100 (CET) Received: from mailserv59-us.natinst.com (nb-hsrp-1338.natinst.com [130.164.19.133]) by spamkiller05.natinst.com (8.14.4/8.14.4) with ESMTP id q0JLxcoD018208; Thu, 19 Jan 2012 15:59:38 -0600 Received: from localhost.localdomain ([130.164.14.197]) by mailserv59-us.natinst.com (Lotus Domino Release 8.5.2FP3) with ESMTP id 2012011915590776-509591 ; Thu, 19 Jan 2012 15:59:07 -0600 From: Joe Hershberger To: u-boot@lists.denx.de Date: Thu, 19 Jan 2012 18:53:07 -0600 Message-Id: <1327020811-1538-5-git-send-email-joe.hershberger@ni.com> X-Mailer: git-send-email 1.6.0.2 In-Reply-To: <1327020811-1538-1-git-send-email-joe.hershberger@ni.com> References: <1327020811-1538-1-git-send-email-joe.hershberger@ni.com> X-MIMETrack: Itemize by SMTP Server on MailServ59-US/AUS/H/NIC(Release 8.5.2FP3|July 10, 2011) at 01/19/2012 03:59:07 PM, Serialize by Router on MailServ59-US/AUS/H/NIC(Release 8.5.2FP3|July 10, 2011) at 01/19/2012 03:59:07 PM, Serialize complete at 01/19/2012 03:59:07 PM X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.6.7361, 1.0.211, 0.0.0000 definitions=2012-01-19_09:2012-01-19, 2012-01-19, 1970-01-01 signatures=0 X-Mailman-Approved-At: Fri, 20 Jan 2012 10:07:24 +0100 Cc: Joe Hershberger Subject: [U-Boot] [PATCH 04/28] net: Make the MAC-seeded random number generator available to /net X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de MAC-seeded rand() will be needed by link-local as well, so give it an interface Signed-off-by: Joe Hershberger Cc: Joe Hershberger Cc: Wolfgang Denk Acked-by: Simon Glass --- net/Makefile | 1 + net/bootp.c | 69 +++++++++++-------------------------------------------- net/bootp.h | 3 -- net/net_rand.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ net/net_rand.h | 18 ++++++++++++++ 5 files changed, 101 insertions(+), 58 deletions(-) create mode 100644 net/net_rand.c create mode 100644 net/net_rand.h diff --git a/net/Makefile b/net/Makefile index 0544f6b..5901046 100644 --- a/net/Makefile +++ b/net/Makefile @@ -31,6 +31,7 @@ COBJS-$(CONFIG_CMD_NET) += bootp.o COBJS-$(CONFIG_CMD_DNS) += dns.o COBJS-$(CONFIG_CMD_NET) += eth.o COBJS-$(CONFIG_CMD_NET) += net.o +COBJS-$(CONFIG_BOOTP_RANDOM_DELAY) += net_rand.o COBJS-$(CONFIG_CMD_NFS) += nfs.o COBJS-$(CONFIG_CMD_RARP) += rarp.o COBJS-$(CONFIG_CMD_SNTP) += sntp.o diff --git a/net/bootp.c b/net/bootp.c index 07870d0..9824cd1 100644 --- a/net/bootp.c +++ b/net/bootp.c @@ -12,6 +12,9 @@ #include #include #include "bootp.h" +#ifdef CONFIG_BOOTP_RANDOM_DELAY +#include "net_rand.h" +#endif #include "tftp.h" #include "nfs.h" #ifdef CONFIG_STATUS_LED @@ -37,9 +40,6 @@ ulong BootpID; int BootpTry; -#ifdef CONFIG_BOOTP_RANDOM_DELAY -ulong seed1, seed2; -#endif #if defined(CONFIG_CMD_DHCP) dhcp_state_t dhcp_state = INIT; @@ -583,66 +583,25 @@ BootpRequest(void) uchar *pkt, *iphdr; struct Bootp_t *bp; int ext_len, pktlen, iplen; +#ifdef CONFIG_BOOTP_RANDOM_DELAY + ulong i, rand_ms; +#endif #if defined(CONFIG_CMD_DHCP) dhcp_state = INIT; #endif #ifdef CONFIG_BOOTP_RANDOM_DELAY /* Random BOOTP delay */ - unsigned char bi_enetaddr[6]; - int reg; - ulong tst1, tst2, sum, m_mask, m_value = 0; - - if (BootpTry == 0) { - /* get our mac */ - eth_getenv_enetaddr("ethaddr", bi_enetaddr); - - debug("BootpRequest => Our Mac: "); - for (reg = 0; reg < 6; reg++) - debug("%x%c", bi_enetaddr[reg], reg == 5 ? '\n' : ':'); - - /* Mac-Manipulation 2 get seed1 */ - tst1 = 0; - tst2 = 0; - for (reg = 2; reg < 6; reg++) { - tst1 = tst1 << 8; - tst1 = tst1 | bi_enetaddr[reg]; - } - for (reg = 0; reg < 2; reg++) { - tst2 = tst2 | bi_enetaddr[reg]; - tst2 = tst2 << 8; - } - - seed1 = tst1^tst2; + if (BootpTry == 0) + srand_mac(); - /* Mirror seed1*/ - m_mask = 0x1; - for (reg = 1; reg <= 32; reg++) { - m_value |= (m_mask & seed1); - seed1 = seed1 >> 1; - m_value = m_value << 1; - } - seed1 = m_value; - seed2 = 0xB78D0945; - } - - /* Random Number Generator */ - for (reg = 0; reg <= 0; reg++) { - sum = seed1 + seed2; - if (sum < seed1 || sum < seed2) - sum++; - seed2 = seed1; - seed1 = sum; - - if (BootpTry <= 2) { /* Start with max 1024 * 1ms */ - sum = sum >> (22-BootpTry); - } else { /*After 3rd BOOTP request max 8192 * 1ms */ - sum = sum >> 19; - } - } + if (BootpTry <= 2) /* Start with max 1024 * 1ms */ + rand_ms = rand() >> (22-BootpTry); + else /* After 3rd BOOTP request max 8192 * 1ms */ + rand_ms = rand() >> 19; - printf("Random delay: %ld ms...\n", sum); - for (reg = 0; reg < sum; reg++) + printf("Random delay: %ld ms...\n", rand_ms); + for (i = 0; i < rand_ms; i++) udelay(1000); /*Wait 1ms*/ #endif /* CONFIG_BOOTP_RANDOM_DELAY */ diff --git a/net/bootp.h b/net/bootp.h index ce73734..bf4e875 100644 --- a/net/bootp.h +++ b/net/bootp.h @@ -63,9 +63,6 @@ struct Bootp_t { extern ulong BootpID; /* ID of cur BOOTP request */ extern char BootFile[128]; /* Boot file name */ extern int BootpTry; -#ifdef CONFIG_BOOTP_RANDOM_DELAY -extern ulong seed1, seed2; /* seed for random BOOTP delay */ -#endif /* Send a BOOTP request */ diff --git a/net/net_rand.c b/net/net_rand.c new file mode 100644 index 0000000..744e2f9 --- /dev/null +++ b/net/net_rand.c @@ -0,0 +1,68 @@ +/* + * Based on LiMon - BOOTP. + * + * Copyright 1994, 1995, 2000 Neil Russell. + * (See License) + * Copyright 2000 Roland Borde + * Copyright 2000 Paolo Scaffardi + * Copyright 2000-2004 Wolfgang Denk, wd@denx.de + */ + +#include +#include +#include "net_rand.h" + +static ulong seed1, seed2; + +void srand_mac(void) +{ + ulong tst1, tst2, m_mask; + ulong m_value = 0; + int reg; + unsigned char bi_enetaddr[6]; + + /* get our mac */ + eth_getenv_enetaddr("ethaddr", bi_enetaddr); + + debug("BootpRequest => Our Mac: "); + for (reg = 0; reg < 6; reg++) + debug("%x%c", bi_enetaddr[reg], reg == 5 ? '\n' : ':'); + + /* Mac-Manipulation 2 get seed1 */ + tst1 = 0; + tst2 = 0; + for (reg = 2; reg < 6; reg++) { + tst1 = tst1 << 8; + tst1 = tst1 | bi_enetaddr[reg]; + } + for (reg = 0; reg < 2; reg++) { + tst2 = tst2 | bi_enetaddr[reg]; + tst2 = tst2 << 8; + } + + seed1 = tst1^tst2; + + /* Mirror seed1*/ + m_mask = 0x1; + for (reg = 1; reg <= 32; reg++) { + m_value |= (m_mask & seed1); + seed1 = seed1 >> 1; + m_value = m_value << 1; + } + seed1 = m_value; + seed2 = 0xB78D0945; +} + +unsigned long rand(void) +{ + ulong sum; + + /* Random Number Generator */ + sum = seed1 + seed2; + if (sum < seed1 || sum < seed2) + sum++; + seed2 = seed1; + seed1 = sum; + + return sum; +} diff --git a/net/net_rand.h b/net/net_rand.h new file mode 100644 index 0000000..2c6a6ac --- /dev/null +++ b/net/net_rand.h @@ -0,0 +1,18 @@ +/* + * Copied from LiMon - BOOTP. + * + * Copyright 1994, 1995, 2000 Neil Russell. + * (See License) + * Copyright 2000 Paolo Scaffardi + */ + +#ifndef __NET_RAND_H__ +#define __NET_RAND_H__ + +#define RAND_MAX 0xFFFFFFFF + +void srand_mac(void); +unsigned long rand(void); + +#endif /* __NET_RAND_H__ */ +