Author: thompsa
Date: Sun Sep  4 22:06:32 2011
New Revision: 225380
URL: http://svn.freebsd.org/changeset/base/225380

Log:
  On the first loop for generating a bridge MAC address use the local
  hostid, this gives a good chance of keeping the same address over
  reboots. This is intended to help IPV6 and similar which generate
  their addresses from the mac.
  
  PR:           kern/160300
  Submitted by: mdodd
  Approved by:  re (kib)

Modified:
  head/sys/net/if_bridge.c

Modified: head/sys/net/if_bridge.c
==============================================================================
--- head/sys/net/if_bridge.c    Sun Sep  4 16:26:43 2011        (r225379)
+++ head/sys/net/if_bridge.c    Sun Sep  4 22:06:32 2011        (r225380)
@@ -85,6 +85,7 @@ __FBSDID("$FreeBSD$");
 #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,8 @@ bridge_clone_create(struct if_clone *ifc
 {
        struct bridge_softc *sc, *sc2;
        struct ifnet *bifp, *ifp;
-       int retry;
+       int fb, retry;
+       unsigned long hostid;
 
        sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO);
        ifp = sc->sc_ifp = if_alloc(IFT_ETHER);
@@ -593,17 +595,30 @@ bridge_clone_create(struct if_clone *ifc
        IFQ_SET_READY(&ifp->if_snd);
 
        /*
-        * Generate a random ethernet address with a locally administered
-        * address.
+        * Generate an ethernet address with a locally administered address.
         *
         * Since we are using random ethernet addresses for the bridge, it is
         * possible that we might have address collisions, so make sure that
         * this hardware address isn't already in use on another bridge.
+        * The first try uses the hostid and falls back to arc4rand().
         */
+       fb = 0;
+       getcredhostid(curthread->td_ucred, &hostid);
        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 || hostid == 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 */
+               } else {
+                       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) {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to