summaryrefslogtreecommitdiffstats
path: root/sys/net/bridgestp.c
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/bridgestp.c
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/bridgestp.c')
-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