kern/133239: [ae] [jme] if_jme can assign duplicate MAC address
Gavin Atkinson
gavin at FreeBSD.org
Tue Mar 31 03:00:02 PDT 2009
>Number: 133239
>Category: kern
>Synopsis: [ae] [jme] if_jme can assign duplicate MAC address
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Mar 31 10:00:00 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator: Gavin Atkinson
>Release: FreeBSD 8.0-CURRENT i386
>Organization:
>Environment:
System: FreeBSD rho.york.ac.uk 8.0-CURRENT FreeBSD 8.0-CURRENT #45: Sun Mar 29 17:36:55 BST 2009 root at rho.york.ac.uk:/usr/obj/usr/src/sys/RHO i386 i386
>Description:
If jme(4) cannot read the MAC address from the eeprom, it will
generate a fake MAC address using arc4random(). However, when doing this
it uses an OUI that is assigned to ASUSTek, and doesn't set the
"locally-assigned" bit, meaning that this has the potential to clash with
other machines, as well as generally not being a nice thing to do.
Additionally, ae(4) suffers a similar problem, although at least
that driver does set the "locally-assigned" bit.
>How-To-Repeat:
N/A
>Fix:
Fix these drivers in the same way as ate(4) was fixed: use a
locally assigned address rather than stealing one. The best way this
is currently done in FreeBSD seems to be to set the first three bytes
to 'b', 's', 'd' - so do the same here. This works as 'b' has the
"llocally-assigned" bit set.
--- ae_jme_macaddress.diff begins here ---
Index: src/sys/dev/ae/if_ae.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ae/if_ae.c,v
retrieving revision 1.3
diff -u -r1.3 if_ae.c
--- src/sys/dev/ae/if_ae.c 4 Feb 2009 20:35:31 -0000 1.3
+++ src/sys/dev/ae/if_ae.c 31 Mar 2009 09:02:38 -0000
@@ -1072,11 +1072,13 @@
eaddr[0] = arc4random();
/*
- * Set OUI to ASUSTek COMPUTER INC.
+ * Set OUI to convenient locally assigned address. 'b'
+ * is 0x62, which has the locally assigned bit set, and
+ * the broadcast/multicast bit clear.
*/
- sc->eaddr[0] = 0x02; /* U/L bit set. */
- sc->eaddr[1] = 0x1f;
- sc->eaddr[2] = 0xc6;
+ sc->eaddr[0] = 'b';
+ sc->eaddr[1] = 's';
+ sc->eaddr[2] = 'd';
sc->eaddr[3] = (eaddr[0] >> 16) & 0xff;
sc->eaddr[4] = (eaddr[0] >> 8) & 0xff;
sc->eaddr[5] = (eaddr[0] >> 0) & 0xff;
Index: src/sys/dev/jme/if_jme.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/jme/if_jme.c,v
retrieving revision 1.10
diff -u -r1.10 if_jme.c
--- src/sys/dev/jme/if_jme.c 4 Dec 2008 02:16:53 -0000 1.10
+++ src/sys/dev/jme/if_jme.c 31 Mar 2009 08:59:13 -0000
@@ -460,10 +460,15 @@
device_printf(sc->jme_dev,
"generating fake ethernet address.\n");
par0 = arc4random();
- /* Set OUI to JMicron. */
- sc->jme_eaddr[0] = 0x00;
- sc->jme_eaddr[1] = 0x1B;
- sc->jme_eaddr[2] = 0x8C;
+
+ /*
+ * Set OUI to convenient locally assigned address. 'b'
+ * is 0x62, which has the locally assigned bit set, and
+ * the broadcast/multicast bit clear.
+ */
+ sc->jme_eaddr[0] = 'b';
+ sc->jme_eaddr[1] = 's';
+ sc->jme_eaddr[2] = 'd';
sc->jme_eaddr[3] = (par0 >> 16) & 0xff;
sc->jme_eaddr[4] = (par0 >> 8) & 0xff;
sc->jme_eaddr[5] = par0 & 0xff;
--- ae_jme_macaddress.diff ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list