summaryrefslogtreecommitdiffstats
path: root/sys/net
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 /sys/net
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.
Diffstat (limited to 'sys/net')
-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