Author: thompsa
Date: Fri Feb 24 17:50:36 2012
New Revision: 232118
URL: http://svn.freebsd.org/changeset/base/232118

Log:
  Only look for a usable MAC address for the bridge ID from ports within our
  bridge, this allows us to have more than one independent bridge in the same
  STP domain.
  
  PR:           kern/164369
  Submitted by: Nikos Vassiliadis (earlier version)
  MFC after:    2 weeks

Modified:
  head/sys/net/bridgestp.c

Modified: head/sys/net/bridgestp.c
==============================================================================
--- head/sys/net/bridgestp.c    Fri Feb 24 17:50:23 2012        (r232117)
+++ head/sys/net/bridgestp.c    Fri Feb 24 17:50:36 2012        (r232118)
@@ -2013,24 +2013,33 @@ bstp_reinit(struct bstp_state *bs)
        struct bstp_port *bp;
        struct ifnet *ifp, *mif;
        u_char *e_addr;
+       void *bridgeptr;
        static const u_char llzero[ETHER_ADDR_LEN];     /* 00:00:00:00:00:00 */
 
        BSTP_LOCK_ASSERT(bs);
 
+       if (LIST_EMPTY(&bs->bs_bplist))
+               goto disablestp;
+
        mif = NULL;
+       bridgeptr = LIST_FIRST(&bs->bs_bplist)->bp_ifp->if_bridge;
+       KASSERT(bridgeptr != NULL, ("Invalid bridge pointer"));
        /*
         * Search through the Ethernet adapters and find the one with the
-        * lowest value. The adapter which we take the MAC address from does
-        * not need to be part of the bridge, it just needs to be a unique
-        * value.
+        * lowest value. Make sure the adapter which we take the MAC address
+        * from is part of this bridge, so we can have more than one independent
+        * bridges in the same STP domain.
         */
        IFNET_RLOCK_NOSLEEP();
        TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
                if (ifp->if_type != IFT_ETHER)
-                       continue;
+                       continue;       /* Not Ethernet */
+
+               if (ifp->if_bridge != bridgeptr)
+                       continue;       /* Not part of our bridge */
 
                if (bstp_addr_cmp(IF_LLADDR(ifp), llzero) == 0)
-                       continue;
+                       continue;       /* No mac address set */
 
                if (mif == NULL) {
                        mif = ifp;
@@ -2042,21 +2051,8 @@ bstp_reinit(struct bstp_state *bs)
                }
        }
        IFNET_RUNLOCK_NOSLEEP();
-
-       if (LIST_EMPTY(&bs->bs_bplist) || mif == NULL) {
-               /* Set the bridge and root id (lower bits) to zero */
-               bs->bs_bridge_pv.pv_dbridge_id =
-                   ((uint64_t)bs->bs_bridge_priority) << 48;
-               bs->bs_bridge_pv.pv_root_id = bs->bs_bridge_pv.pv_dbridge_id;
-               bs->bs_root_pv = bs->bs_bridge_pv;
-               /* Disable any remaining ports, they will have no MAC address */
-               LIST_FOREACH(bp, &bs->bs_bplist, bp_next) {
-                       bp->bp_infois = BSTP_INFO_DISABLED;
-                       bstp_set_port_role(bp, BSTP_ROLE_DISABLED);
-               }
-               callout_stop(&bs->bs_bstpcallout);
-               return;
-       }
+       if (mif == NULL)
+               goto disablestp;
 
        e_addr = IF_LLADDR(mif);
        bs->bs_bridge_pv.pv_dbridge_id =
@@ -2084,6 +2080,20 @@ bstp_reinit(struct bstp_state *bs)
 
        bstp_assign_roles(bs);
        bstp_timer_start(&bs->bs_link_timer, BSTP_LINK_TIMER);
+       return;
+
+disablestp:
+       /* Set the bridge and root id (lower bits) to zero */
+       bs->bs_bridge_pv.pv_dbridge_id =
+           ((uint64_t)bs->bs_bridge_priority) << 48;
+       bs->bs_bridge_pv.pv_root_id = bs->bs_bridge_pv.pv_dbridge_id;
+       bs->bs_root_pv = bs->bs_bridge_pv;
+       /* Disable any remaining ports, they will have no MAC address */
+       LIST_FOREACH(bp, &bs->bs_bplist, bp_next) {
+               bp->bp_infois = BSTP_INFO_DISABLED;
+               bstp_set_port_role(bp, BSTP_ROLE_DISABLED);
+       }
+       callout_stop(&bs->bs_bstpcallout);
 }
 
 static int
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to