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