svn commit: r236048 - stable/9/sys/net
Andrew Thompson
thompsa at FreeBSD.org
Sat May 26 07:35:45 UTC 2012
Author: thompsa
Date: Sat May 26 07:35:44 2012
New Revision: 236048
URL: http://svn.freebsd.org/changeset/base/236048
Log:
MFC r232118
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)
Modified:
stable/9/sys/net/bridgestp.c
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/amd64/include/xen/ (props changed)
stable/9/sys/boot/ (props changed)
stable/9/sys/boot/i386/efi/ (props changed)
stable/9/sys/boot/ia64/efi/ (props changed)
stable/9/sys/boot/ia64/ski/ (props changed)
stable/9/sys/boot/powerpc/boot1.chrp/ (props changed)
stable/9/sys/boot/powerpc/ofw/ (props changed)
stable/9/sys/cddl/contrib/opensolaris/ (props changed)
stable/9/sys/conf/ (props changed)
stable/9/sys/contrib/dev/acpica/ (props changed)
stable/9/sys/contrib/octeon-sdk/ (props changed)
stable/9/sys/contrib/pf/ (props changed)
stable/9/sys/contrib/x86emu/ (props changed)
stable/9/sys/dev/ (props changed)
stable/9/sys/dev/e1000/ (props changed)
stable/9/sys/dev/ixgbe/ (props changed)
stable/9/sys/fs/ (props changed)
stable/9/sys/fs/ntfs/ (props changed)
stable/9/sys/modules/ (props changed)
Modified: stable/9/sys/net/bridgestp.c
==============================================================================
--- stable/9/sys/net/bridgestp.c Sat May 26 07:34:46 2012 (r236047)
+++ stable/9/sys/net/bridgestp.c Sat May 26 07:35:44 2012 (r236048)
@@ -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
More information about the svn-src-stable-9
mailing list