aboutsummaryrefslogtreecommitdiff
path: root/ofproto
diff options
context:
space:
mode:
authorEthan Jackson <ethan@nicira.com>2012-02-19 00:34:28 -0800
committerEthan Jackson <ethan@nicira.com>2012-02-19 00:50:51 -0800
commit266ed172aa587bf8e12c1b1f98c1042011e775ca (patch)
tree20556b3145d6dff49d272ac627ccf887b0dee50f /ofproto
parentf12bbb6bd9c8f8d985bf44ad09c1ba5dfd2ebcff (diff)
ofproto-dpif: Cleanup STP on ports when disabled on their bridge.
When STP is enabled on a bridge, the STP module puts its ports in an STP_LISTENING state until STP converges. This causes all traffic destined for these ports to be dropped. If STP is disabled on the bridge, but not explicitly disabled on its ports, the bridge fails to remove the STP state from these ports. Therefore, if a port is in an STP_LISTENING state, it will remain in that state and continue to drop all traffic indefinitely. This patch fixes the issue. Signed-off-by: Ethan Jackson <ethan@nicira.com> Bug #9157.
Diffstat (limited to 'ofproto')
-rw-r--r--ofproto/ofproto-dpif.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 31c71a92..53ca41ed 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -191,6 +191,8 @@ static struct ofbundle ofpp_none_bundle = {
static void stp_run(struct ofproto_dpif *ofproto);
static void stp_wait(struct ofproto_dpif *ofproto);
+static int set_stp_port(struct ofport *,
+ const struct ofproto_port_stp_settings *);
static bool ofbundle_includes_vlan(const struct ofbundle *, uint16_t vlan);
@@ -1137,6 +1139,12 @@ set_stp(struct ofproto *ofproto_, const struct ofproto_stp_settings *s)
stp_set_max_age(ofproto->stp, s->max_age);
stp_set_forward_delay(ofproto->stp, s->fwd_delay);
} else {
+ struct ofport *ofport;
+
+ HMAP_FOR_EACH (ofport, hmap_node, &ofproto->up.ports) {
+ set_stp_port(ofport, NULL);
+ }
+
stp_destroy(ofproto->stp);
ofproto->stp = NULL;
}