mirror of
https://github.com/opnsense/src.git
synced 2026-06-11 01:30:30 -04:00
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
This commit is contained in:
parent
52c746eacc
commit
8d45bd6e80
1 changed files with 30 additions and 20 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue