There is a difference between a port with STP/RSTP protocol enabled and a
      disabled role and a port which has a disabled role because STP/RSTP is
      not active. This commit ensure to make such distinction.

      Standard 802.1D claims that the Topology Change state machine (17.31)
      treats a Port as no longer active when it becomes an Alternate, Backup,
      or Disabled Port and stops learning from received frames.

Signed-off-by: Daniele Venturino <daniele.ventur...@m3s.it>
---
 lib/rstp.h                   | 12 +++---------
 lib/stp.c                    | 12 ++++--------
 ofproto/ofproto-dpif-xlate.c | 16 ++++++++++++----
 ofproto/ofproto-dpif.c       |  6 ++++--
 4 files changed, 23 insertions(+), 23 deletions(-)

diff --git a/lib/rstp.h b/lib/rstp.h
index 458aecf..b429e35 100644
--- a/lib/rstp.h
+++ b/lib/rstp.h
@@ -274,26 +274,20 @@ rstp_should_manage_bpdu(enum rstp_state state)
 
 /* Returns true if 'state' is one in which packets received on a port should
  * be forwarded, false otherwise.
- *
- * Returns true if 'state' is RSTP_DISABLED, since presumably in that case the
- * port should still work, just not have RSTP applied to it.
  */
 static inline bool
 rstp_forward_in_state(enum rstp_state state)
 {
-    return (state == RSTP_DISABLED || state == RSTP_FORWARDING);
+    return (state == RSTP_FORWARDING);
 }
 
 /* Returns true if 'state' is one in which MAC learning should be done on
  * packets received on a port, false otherwise.
- *
- * Returns true if 'state' is RSTP_DISABLED, since presumably in that case the
- * port should still work, just not have RSTP applied to it. */
+ */
 static inline bool
 rstp_learn_in_state(enum rstp_state state)
 {
-    return (state == RSTP_DISABLED || state == RSTP_LEARNING ||
-            state == RSTP_FORWARDING);
+    return (state == RSTP_LEARNING || state == RSTP_FORWARDING);
 }
 
 #endif /* rstp.h */
diff --git a/lib/stp.c b/lib/stp.c
index 8f904c0..9055922 100644
--- a/lib/stp.c
+++ b/lib/stp.c
@@ -673,24 +673,20 @@ stp_state_name(enum stp_state state)
 
 /* Returns true if 'state' is one in which packets received on a port should
  * be forwarded, false otherwise.
- *
- * Returns true if 'state' is STP_DISABLED, since presumably in that case the
- * port should still work, just not have STP applied to it. */
+ */
 bool
 stp_forward_in_state(enum stp_state state)
 {
-    return (state & (STP_DISABLED | STP_FORWARDING)) != 0;
+    return (state & STP_FORWARDING) != 0;
 }
 
 /* Returns true if 'state' is one in which MAC learning should be done on
  * packets received on a port, false otherwise.
- *
- * Returns true if 'state' is STP_DISABLED, since presumably in that case the
- * port should still work, just not have STP applied to it. */
+ */
 bool
 stp_learn_in_state(enum stp_state state)
 {
-    return (state & (STP_DISABLED | STP_LEARNING | STP_FORWARDING)) != 0;
+    return (state & (STP_LEARNING | STP_FORWARDING)) != 0;
 }
 
 /* Returns true if 'state' is one in which bpdus should be forwarded on a
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 53ec297..b230c52 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -1132,14 +1132,18 @@ static bool
 xport_stp_learn_state(const struct xport *xport)
 {
     struct stp_port *sp = xport_get_stp_port(xport);
-    return stp_learn_in_state(sp ? stp_port_get_state(sp) : STP_DISABLED);
+    return sp
+        ? stp_learn_in_state(stp_port_get_state(sp))
+        : true;
 }
 
 static bool
 xport_stp_forward_state(const struct xport *xport)
 {
     struct stp_port *sp = xport_get_stp_port(xport);
-    return stp_forward_in_state(sp ? stp_port_get_state(sp) : STP_DISABLED);
+    return sp
+        ? stp_forward_in_state(stp_port_get_state(sp))
+        : true;
 }
 
 static bool
@@ -1193,13 +1197,17 @@ xport_get_rstp_port_state(const struct xport *xport)
 static bool
 xport_rstp_learn_state(const struct xport *xport)
 {
-    return rstp_learn_in_state(xport_get_rstp_port_state(xport));
+    return xport->xbridge->rstp && xport->rstp_port
+        ? rstp_learn_in_state(xport_get_rstp_port_state(xport))
+        : true;
 }
 
 static bool
 xport_rstp_forward_state(const struct xport *xport)
 {
-    return rstp_forward_in_state(xport_get_rstp_port_state(xport));
+    return xport->xbridge->rstp && xport->rstp_port
+        ? rstp_forward_in_state(xport_get_rstp_port_state(xport))
+        : true;
 }
 
 static bool
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 95298f2..dc0ecdf 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -2520,7 +2520,8 @@ bundle_update(struct ofbundle *bundle)
     LIST_FOR_EACH (port, bundle_node, &bundle->ports) {
         if (port->up.pp.config & OFPUTIL_PC_NO_FLOOD
             || port->is_layer3
-            || !stp_forward_in_state(port->stp_state)) {
+            || (bundle->ofproto->stp && !stp_forward_in_state(port->stp_state))
+            || (bundle->ofproto->rstp && 
!rstp_forward_in_state(port->rstp_state))) {
             bundle->floodable = false;
             break;
         }
@@ -2568,7 +2569,8 @@ bundle_add_port(struct ofbundle *bundle, ofp_port_t 
ofp_port,
         list_push_back(&bundle->ports, &port->bundle_node);
         if (port->up.pp.config & OFPUTIL_PC_NO_FLOOD
             || port->is_layer3
-            || !stp_forward_in_state(port->stp_state)) {
+            || (bundle->ofproto->stp && !stp_forward_in_state(port->stp_state))
+            || (bundle->ofproto->rstp && 
!rstp_forward_in_state(port->rstp_state))) {
             bundle->floodable = false;
         }
     }
-- 
1.8.1.2

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to