diff options
author | thompsa <thompsa@FreeBSD.org> | 2006-11-02 00:39:36 +0000 |
---|---|---|
committer | thompsa <thompsa@FreeBSD.org> | 2006-11-02 00:39:36 +0000 |
commit | e6e29e358bcae4e62ea9a2d72c5b2501c75a1850 (patch) | |
tree | 6072943877d449531287b20761f6aa1195b61c4e /sys/net/bridgestp.c | |
parent | bd92877da9c377fa34d33beb0fae443db8d81d24 (diff) | |
download | FreeBSD-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.c | 15 |
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) || |