Module Name:    src
Committed By:   yamt
Date:           Mon Jan 28 15:05:03 UTC 2013

Modified Files:
        src/sys/net: if_tap.c

Log Message:
use cprng_fast instead of getmicrouptime to generate "random" mac address
because the latter often produces the same addresses for subsequent tap
instances.


To generate a diff of this commit:
cvs rdiff -u -r1.69 -r1.70 src/sys/net/if_tap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_tap.c
diff -u src/sys/net/if_tap.c:1.69 src/sys/net/if_tap.c:1.70
--- src/sys/net/if_tap.c:1.69	Mon Jan 28 15:01:13 2013
+++ src/sys/net/if_tap.c	Mon Jan 28 15:05:03 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_tap.c,v 1.69 2013/01/28 15:01:13 yamt Exp $	*/
+/*	$NetBSD: if_tap.c,v 1.70 2013/01/28 15:05:03 yamt Exp $	*/
 
 /*
  *  Copyright (c) 2003, 2004, 2008, 2009 The NetBSD Foundation.
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.69 2013/01/28 15:01:13 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.70 2013/01/28 15:05:03 yamt Exp $");
 
 #if defined(_KERNEL_OPT)
 
@@ -46,6 +46,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/conf.h>
+#include <sys/cprng.h>
 #include <sys/device.h>
 #include <sys/file.h>
 #include <sys/filedesc.h>
@@ -265,8 +266,6 @@ tap_attach(device_t parent, device_t sel
 	uint8_t enaddr[ETHER_ADDR_LEN] =
 	    { 0xf2, 0x0b, 0xa4, 0xff, 0xff, 0xff };
 	char enaddrstr[3 * ETHER_ADDR_LEN];
-	struct timeval tv;
-	uint32_t ui;
 
 	sc->sc_dev = self;
 	sc->sc_sih = softint_establish(SOFTINT_CLOCK, tap_softintr, sc);
@@ -278,12 +277,10 @@ tap_attach(device_t parent, device_t sel
 
 	/*
 	 * In order to obtain unique initial Ethernet address on a host,
-	 * do some randomisation using the current uptime.  It's not meant
-	 * for anything but avoiding hard-coding an address.
+	 * do some randomisation.  It's not meant for anything but avoiding
+	 * hard-coding an address.
 	 */
-	getmicrouptime(&tv);
-	ui = (tv.tv_sec ^ tv.tv_usec) & 0xffffff;
-	memcpy(enaddr+3, (uint8_t *)&ui, 3);
+	cprng_fast(&enaddr[3], 3);
 
 	aprint_verbose_dev(self, "Ethernet address %s\n",
 	    ether_snprintf(enaddrstr, sizeof(enaddrstr), enaddr));

Reply via email to