aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorAndrew Thompson <thompsa@FreeBSD.org>2006-11-02 00:39:36 +0000
committerAndrew Thompson <thompsa@FreeBSD.org>2006-11-02 00:39:36 +0000
commitedc9f4ae99fa00b065cb47c1d0d0737686ab3dca (patch)
tree6072943877d449531287b20761f6aa1195b61c4e /sys
parent3398f41fc0edef1f321627f72cdf219787262085 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/net/bridgestp.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/sys/net/bridgestp.c b/sys/net/bridgestp.c
index 3d9187abd0ea..957f8e65c46a 100644
--- a/sys/net/bridgestp.c
+++ b/sys/net/bridgestp.c
@@ -1045,16 +1045,17 @@ bstp_update_roles(struct bstp_state *bs, struct bstp_port *bp)
bp->bp_operedge) &&
(bp->bp_recent_root_timer.active == 0 || !bp->bp_reroot) &&
!bp->bp_sync) {
- switch (bp->bp_state) {
- case BSTP_IFSTATE_DISCARDING:
- bstp_set_port_state(bp, BSTP_IFSTATE_LEARNING);
- break;
- case BSTP_IFSTATE_LEARNING:
+ /*
+ * If agreed|operedge then go straight to forwarding,
+ * otherwise follow discard -> learn -> forward.
+ */
+ if (bp->bp_agreed || bp->bp_operedge ||
+ bp->bp_state == BSTP_IFSTATE_LEARNING) {
bstp_set_port_state(bp,
BSTP_IFSTATE_FORWARDING);
bp->bp_agreed = bp->bp_protover;
- break;
- }
+ } else if (bp->bp_state == BSTP_IFSTATE_DISCARDING)
+ bstp_set_port_state(bp, BSTP_IFSTATE_LEARNING);
}
if (((bp->bp_sync && !bp->bp_synced) ||