>Number:         160300
>Category:       kern
>Synopsis:       bridge(4) should attempt to use a static MAC address.
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Aug 29 23:00:19 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     
>Release:        
>Organization:
>Environment:
System: FreeBSD neo-sasami.jurai.net 8.2-STABLE FreeBSD 8.2-STABLE #5 r224868M: 
Mon Aug 15 21:36:11 EDT 2011     
[email protected]:/vol/raid/svn/stable8/sys/i386/compile/DL380G3  i386


        
Description:
        bridge(4) uses a random number function to generate it's MAC
        address.  This causes issues with IPv6.

        <precise description of the problem (multiple lines)>
>Description:
 Submitter-Id:  current-users
 Originator:    Matthew N. Dodd
 Release:       FreeBSD 8.2-STABLE i386
>How-To-Repeat:
        
>Fix:
        Use the Hostid and interface unit number to generate a 
        MAC address and fall-back to the random number generator
        on conflict.

        

Index: if_bridge.c
===================================================================
--- if_bridge.c (revision 224868)
+++ if_bridge.c (working copy)
@@ -85,6 +85,7 @@
 #include <sys/malloc.h>
 #include <sys/protosw.h>
 #include <sys/systm.h>
+#include <sys/jail.h>
 #include <sys/time.h>
 #include <sys/socket.h> /* for net/if.h */
 #include <sys/sockio.h>
@@ -560,7 +561,7 @@
 {
        struct bridge_softc *sc, *sc2;
        struct ifnet *bifp, *ifp;
-       int retry;
+       int fb, retry;
 
        sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO);
        ifp = sc->sc_ifp = if_alloc(IFT_ETHER);
@@ -600,10 +601,24 @@
         * possible that we might have address collisions, so make sure that
         * this hardware address isn't already in use on another bridge.
         */
+       fb = 0;
        for (retry = 1; retry != 0;) {
-               arc4rand(sc->sc_defaddr, ETHER_ADDR_LEN, 1);
-               sc->sc_defaddr[0] &= ~1;        /* clear multicast bit */
-               sc->sc_defaddr[0] |= 2;         /* set the LAA bit */
+               if (fb) {
+                       arc4rand(sc->sc_defaddr, ETHER_ADDR_LEN, 1);
+                       sc->sc_defaddr[0] &= ~1;/* clear multicast bit */
+                       sc->sc_defaddr[0] |= 2; /* set the LAA bit */
+               } else {
+                       unsigned long hostid;
+                       getcredhostid(curthread->td_ucred, &hostid);
+                       sc->sc_defaddr[0] = 0x2;
+                       sc->sc_defaddr[1] = (hostid >> 24) & 0xff;
+                       sc->sc_defaddr[2] = (hostid >> 16) & 0xff;
+                       sc->sc_defaddr[3] = (hostid >> 8 ) & 0xff;
+                       sc->sc_defaddr[4] =  hostid        & 0xff;
+                       sc->sc_defaddr[5] = ifp->if_dunit & 0xff;
+               }
+
+               fb = 1;
                retry = 0;
                mtx_lock(&bridge_list_mtx);
                LIST_FOREACH(sc2, &bridge_list, sc_list) {


>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "[email protected]"

Reply via email to