summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthompsa <thompsa@FreeBSD.org>2006-11-02 00:39:36 +0000
committerthompsa <thompsa@FreeBSD.org>2006-11-02 00:39:36 +0000
commite6e29e358bcae4e62ea9a2d72c5b2501c75a1850 (patch)
tree6072943877d449531287b20761f6aa1195b61c4e
parentbd92877da9c377fa34d33beb0fae443db8d81d24 (diff)
downloadFreeBSD-src-e6e29e358bcae4e62ea9a2d72c5b2501c75a1850.zip
FreeBSD-src-e6e29e358bcae4e62ea9a2d72c5b2501c75a1850.tar.gz
If the port is agreed or edge then allow it go go straight to forwarding rather
than waiting another tick (1s) for the states to be checked again.
-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 3d9187a..957f8e6 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) ||
OpenPOWER on IntegriCloud