See commit bacdb85ad82f981697245eefb40a3b360cfe379b.

 Signed-off by: Daniele Venturino <daniele.ventur...@m3s.it>

---
 lib/rstp.h                   | 42 +++++++++++++++++++++++++++++++++++++++---
 ofproto/ofproto-dpif-xlate.c |  6 +++---
 2 files changed, 42 insertions(+), 6 deletions(-)

diff --git a/lib/rstp.h b/lib/rstp.h
index 364a181..b15d22f 100644
--- a/lib/rstp.h
+++ b/lib/rstp.h
@@ -99,6 +99,38 @@ typedef uint64_t rstp_identifier;
 
 #define RSTP_PORT_ID_FMT "%04"PRIx16
 
+/* State of an RSTP port.
+ *
+ * The RSTP_DISABLED state means that the port is disabled by management.
+ * In our implementation, this state means that the port does not
+ * participate in the spanning tree, but it still forwards traffic as if
+ * it were in the RSTP_FORWARDING state.  This may be different from
+ * other implementations.
+ *
+ * The following diagram describes the various states and what they are
+ * allowed to do in OVS:
+ *
+ *                     FWD  LRN  TX_BPDU RX_BPDU FWD_BPDU
+ *                     ---  ---  ------- ------- --------
+ *        Disabled      Y    -      -       -        Y
+ *        Discarding    -    -      Y       Y        Y
+ *        Learning      -    Y      Y       Y        Y
+ *        Forwarding    Y    Y      Y       Y        Y
+ *
+ *
+ * FWD:              the port should forward any incoming non-rstp-BPDU
+ *                   packets.
+ *
+ * LRN:              the port should conduct MAC learning on packets received.
+ *
+ * TX_BPDU/RX_BPDU:  the port could generate/consume bpdus.
+ *
+ * FWD_BPDU:         the port should should always forward the BPDUS,
+ *                   whether they are generated by the port or received
+ *                   as incoming packets.
+ *
+ */
+
 enum rstp_state {
     RSTP_DISABLED,
     RSTP_LEARNING,
@@ -128,7 +160,7 @@ const char *rstp_state_name(enum rstp_state);
 const char *rstp_port_role_name(enum rstp_port_role);
 static inline bool rstp_forward_in_state(enum rstp_state);
 static inline bool rstp_learn_in_state(enum rstp_state);
-static inline bool rstp_should_manage_bpdu(enum rstp_state state);
+static inline bool rstp_should_forward_bpdu(enum rstp_state state);
 
 void rstp_init(void)
     OVS_EXCLUDED(rstp_mutex);
@@ -255,12 +287,16 @@ void rstp_port_set_state(struct rstp_port *p, enum 
rstp_state state)
 /* Inline functions. */
 /* Returns true if 'state' is one in which BPDU packets should be received
  * and transmitted on a port, false otherwise.
+ *
+ * Returns true if 'state' is RSTP_DISABLED, since in that case the port does
+ * not generate the bpdu and should just forward it (e.g. patch port on pif
+ * bridge).
  */
 static inline bool
-rstp_should_manage_bpdu(enum rstp_state state)
+rstp_should_forward_bpdu(enum rstp_state state)
 {
     return (state == RSTP_DISCARDING || state == RSTP_LEARNING ||
-            state == RSTP_FORWARDING);
+            state == RSTP_FORWARDING || state == RSTP_DISABLED);
 }
 
 /* Returns true if 'state' is one in which packets received on a port should
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 786494d..51d25d4 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -1193,9 +1193,9 @@ xport_rstp_forward_state(const struct xport *xport)
 }
 
 static bool
-xport_rstp_should_manage_bpdu(const struct xport *xport)
+xport_rstp_should_forward_bpdu(const struct xport *xport)
 {
-    return rstp_should_manage_bpdu(xport_get_rstp_port_state(xport));
+    return rstp_should_forward_bpdu(xport_get_rstp_port_state(xport));
 }
 
 static void
@@ -2493,7 +2493,7 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t 
ofp_port,
     } else if (check_stp) {
         if (is_stp(&ctx->base_flow)) {
             if (!xport_stp_should_forward_bpdu(xport) &&
-                !xport_rstp_should_manage_bpdu(xport)) {
+                !xport_rstp_should_forward_bpdu(xport)) {
                 if (ctx->xbridge->stp != NULL) {
                     xlate_report(ctx, "STP not in listening state, "
                             "skipping bpdu output");
-- 
1.8.1.2

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

Reply via email to