From patchwork Thu May 31 18:12:43 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Walle X-Patchwork-Id: 162214 X-Patchwork-Delegate: prafulla@marvell.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 3BE4AB6FB6 for ; Fri, 1 Jun 2012 04:13:52 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 10E532810E; Thu, 31 May 2012 20:13:48 +0200 (CEST) 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 lQ505yuh1TUD; Thu, 31 May 2012 20:13:47 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 23D6D28115; Thu, 31 May 2012 20:13:36 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 72077280FB for ; Thu, 31 May 2012 20:13:28 +0200 (CEST) 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 y9JXDOF956jf for ; Thu, 31 May 2012 20:13:27 +0200 (CEST) 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 mail.serverraum.org (mail.serverraum.org [78.47.150.89]) by theia.denx.de (Postfix) with ESMTP id 998FE280F5 for ; Thu, 31 May 2012 20:13:24 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail.serverraum.org (Postfix) with ESMTP id C73363F002; Thu, 31 May 2012 20:13:24 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mail.serverraum.org Received: from mail.serverraum.org ([127.0.0.1]) by localhost (web.serverraum.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id x5peGe6AHdVH; Thu, 31 May 2012 20:13:24 +0200 (CEST) Received: from thanatos.fritz.box (95-89-251-205-dynip.superkabel.de [95.89.251.205]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.serverraum.org (Postfix) with ESMTPSA id 738813EFFD; Thu, 31 May 2012 20:13:24 +0200 (CEST) From: Michael Walle To: u-boot@lists.denx.de Date: Thu, 31 May 2012 20:12:43 +0200 Message-Id: <1338487965-31791-3-git-send-email-michael@walle.cc> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1338487965-31791-1-git-send-email-michael@walle.cc> References: <1338487965-31791-1-git-send-email-michael@walle.cc> Cc: Joe Hershberger Subject: [U-Boot] [PATCH v7 2/4] net: use common rand()/srand() functions 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 Replace rand() with the functions from lib/. The link-local network code stores its own seed, derived from the MAC address. Thus making it independent from calls to srand() in other modules. Signed-off-by: Michael Walle Cc: Joe Hershberger --- include/configs/ETX094.h | 1 + include/configs/MERGERBOX.h | 1 + include/configs/MVBC_P.h | 1 + include/configs/MVBLM7.h | 1 + include/configs/MVSMR.h | 1 + include/configs/bfin_adi_common.h | 1 + include/configs/sacsng.h | 1 + net/Makefile | 2 - net/link_local.c | 7 ++-- net/net_rand.c | 68 ------------------------------------- net/net_rand.h | 32 +++++++++++++---- 11 files changed, 36 insertions(+), 80 deletions(-) delete mode 100644 net/net_rand.c diff --git a/include/configs/ETX094.h b/include/configs/ETX094.h index c427093..aee9915 100644 --- a/include/configs/ETX094.h +++ b/include/configs/ETX094.h @@ -54,6 +54,7 @@ #define CONFIG_FLASH_16BIT /* for board with 16bit wide flash */ #undef SB_ETX094 /* only for SB-Board with 16MB SDRAM */ +#define CONFIG_RAND #define CONFIG_BOOTP_RANDOM_DELAY /* graceful BOOTP recovery mode */ #define CONFIG_ETHADDR 08:00:06:00:00:00 diff --git a/include/configs/MERGERBOX.h b/include/configs/MERGERBOX.h index 8176916..c2b962f 100644 --- a/include/configs/MERGERBOX.h +++ b/include/configs/MERGERBOX.h @@ -315,6 +315,7 @@ /* * BOOTP options */ +#define CONFIG_RAND #define CONFIG_BOOTP_BOOTFILESIZE #define CONFIG_BOOTP_BOOTPATH #define CONFIG_BOOTP_GATEWAY diff --git a/include/configs/MVBC_P.h b/include/configs/MVBC_P.h index ade4893..d38da0b 100644 --- a/include/configs/MVBC_P.h +++ b/include/configs/MVBC_P.h @@ -110,6 +110,7 @@ #undef CONFIG_WATCHDOG +#define CONFIG_RAND #define CONFIG_BOOTP_VENDOREX #define CONFIG_BOOTP_SUBNETMASK #define CONFIG_BOOTP_GATEWAY diff --git a/include/configs/MVBLM7.h b/include/configs/MVBLM7.h index 8b20f72..7c8c808 100644 --- a/include/configs/MVBLM7.h +++ b/include/configs/MVBLM7.h @@ -232,6 +232,7 @@ #define CONFIG_ETHPRIME "TSEC0" +#define CONFIG_RAND #define CONFIG_BOOTP_VENDOREX #define CONFIG_BOOTP_SUBNETMASK #define CONFIG_BOOTP_GATEWAY diff --git a/include/configs/MVSMR.h b/include/configs/MVSMR.h index f94ad5c..6f10907 100644 --- a/include/configs/MVSMR.h +++ b/include/configs/MVSMR.h @@ -98,6 +98,7 @@ #define CONFIG_CMD_PING #define CONFIG_CMD_SDRAM +#define CONFIG_RAND #define CONFIG_BOOTP_BOOTFILESIZE #define CONFIG_BOOTP_BOOTPATH #define CONFIG_BOOTP_DNS diff --git a/include/configs/bfin_adi_common.h b/include/configs/bfin_adi_common.h index 3fbf5c6..0f4c2d8 100644 --- a/include/configs/bfin_adi_common.h +++ b/include/configs/bfin_adi_common.h @@ -11,6 +11,7 @@ #ifndef _CONFIG_CMD_DEFAULT_H # include # if ADI_CMDS_NETWORK +# define CONFIG_RAND # define CONFIG_CMD_DHCP # define CONFIG_BOOTP_SUBNETMASK # define CONFIG_BOOTP_GATEWAY diff --git a/include/configs/sacsng.h b/include/configs/sacsng.h index 43036b2..d604de3 100644 --- a/include/configs/sacsng.h +++ b/include/configs/sacsng.h @@ -475,6 +475,7 @@ "bootm" #endif /* CONFIG_BOOT_ROOT_NFS */ +#define CONFIG_RAND #define CONFIG_BOOTP_RANDOM_DELAY /* Randomize the BOOTP retry delay */ /* diff --git a/net/Makefile b/net/Makefile index 5264687..e7764ce 100644 --- a/net/Makefile +++ b/net/Makefile @@ -34,8 +34,6 @@ COBJS-$(CONFIG_CMD_DNS) += dns.o COBJS-$(CONFIG_CMD_NET) += eth.o COBJS-$(CONFIG_CMD_LINK_LOCAL) += link_local.o COBJS-$(CONFIG_CMD_NET) += net.o -COBJS-$(CONFIG_BOOTP_RANDOM_DELAY) += net_rand.o -COBJS-$(CONFIG_CMD_LINK_LOCAL) += net_rand.o COBJS-$(CONFIG_CMD_NFS) += nfs.o COBJS-$(CONFIG_CMD_PING) += ping.o COBJS-$(CONFIG_CMD_RARP) += rarp.o diff --git a/net/link_local.c b/net/link_local.c index 3362863..582d011 100644 --- a/net/link_local.c +++ b/net/link_local.c @@ -56,6 +56,7 @@ static unsigned conflicts; static unsigned nprobes; static unsigned nclaims; static int ready; +static unsigned int seed; static void link_local_timeout(void); @@ -68,7 +69,7 @@ static IPaddr_t pick(void) unsigned tmp; do { - tmp = rand() & IN_CLASSB_HOST; + tmp = rand_r(&seed) & IN_CLASSB_HOST; } while (tmp > (IN_CLASSB_HOST - 0x0200)); return (IPaddr_t) htonl((LINKLOCAL_ADDR + 0x0100) + tmp); } @@ -78,7 +79,7 @@ static IPaddr_t pick(void) */ static inline unsigned random_delay_ms(unsigned secs) { - return rand() % (secs * 1000); + return rand_r(&seed) % (secs * 1000); } static void configure_wait(void) @@ -109,7 +110,7 @@ void link_local_start(void) } NetOurSubnetMask = IN_CLASSB_NET; - srand_mac(); + seed = seed_mac(); if (ip == 0) ip = pick(); diff --git a/net/net_rand.c b/net/net_rand.c deleted file mode 100644 index 5387aba..0000000 --- a/net/net_rand.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * 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 index c98db64..62de375 100644 --- a/net/net_rand.h +++ b/net/net_rand.h @@ -9,18 +9,36 @@ #ifndef __NET_RAND_H__ #define __NET_RAND_H__ -#define RAND_MAX 0xffffffff +#include /* - * Seed the random number generator using the eth0 MAC address + * Return a seed for the PRNG derived from the timer and the eth0 MAC address. */ -void srand_mac(void); +static inline unsigned int seed_mac(void) +{ + unsigned char enetaddr[6]; + unsigned int seed; + + /* get our mac */ + eth_getenv_enetaddr("ethaddr", enetaddr); + + seed = get_timer(0); + seed ^= enetaddr[5]; + seed ^= enetaddr[4] << 8; + seed ^= enetaddr[3] << 16; + seed ^= enetaddr[2] << 24; + seed ^= enetaddr[1]; + seed ^= enetaddr[0] << 8; + + return seed; +} /* - * Get a random number (after seeding with MAC address) - * - * @return random number + * Seed the random number generator using the timer and the eth0 MAC address. */ -unsigned long rand(void); +static inline void srand_mac(void) +{ + srand(seed_mac()); +} #endif /* __NET_RAND_H__ */