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 <[email protected]>
---
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
[email protected]
http://openvswitch.org/mailman/listinfo/dev