Signed-off-by: Daniele Venturino <[email protected]>
---
lib/rstp-common.h | 6 ------
lib/rstp.c | 31 ++++++++++++++++++++++++++++++-
lib/rstp.h | 9 ++++++++-
ofproto/ofproto-dpif.c | 4 +++-
ofproto/ofproto.h | 2 ++
utilities/ovs-vsctl.8.in | 9 +++++++++
vswitchd/bridge.c | 10 ++++++++++
7 files changed, 62 insertions(+), 9 deletions(-)
diff --git a/lib/rstp-common.h b/lib/rstp-common.h
index 587f88c..cd43079 100644
--- a/lib/rstp-common.h
+++ b/lib/rstp-common.h
@@ -240,12 +240,6 @@ struct rstp_bpdu {
uint8_t padding[7];
});
-enum rstp_admin_point_to_point_mac_state {
- RSTP_ADMIN_P2P_MAC_FORCE_TRUE,
- RSTP_ADMIN_P2P_MAC_FORCE_FALSE,
- RSTP_ADMIN_P2P_MAC_FORCE_AUTO
-};
-
enum rstp_info_is {
INFO_IS_DISABLED,
INFO_IS_RECEIVED,
diff --git a/lib/rstp.c b/lib/rstp.c
index 0f96749..e3007e2 100644
--- a/lib/rstp.c
+++ b/lib/rstp.c
@@ -110,6 +110,9 @@ static void rstp_port_set_admin_edge__(struct rstp_port *,
bool admin_edge)
OVS_REQUIRES(rstp_mutex);
static void rstp_port_set_auto_edge__(struct rstp_port *, bool auto_edge)
OVS_REQUIRES(rstp_mutex);
+static void rstp_port_set_admin_point_to_point_mac__(struct rstp_port *,
+ enum rstp_admin_point_to_point_mac_state admin_p2p_mac_state)
+ OVS_REQUIRES(rstp_mutex);
static void rstp_port_set_mcheck__(struct rstp_port *, bool mcheck)
OVS_REQUIRES(rstp_mutex);
static void reinitialize_port__(struct rstp_port *p)
@@ -922,6 +925,8 @@ rstp_port_set_administrative_bridge_port__(struct rstp_port
*p,
uint8_t admin_port_state)
OVS_REQUIRES(rstp_mutex)
{
+ VLOG_DBG("%s, port %u: set RSTP port admin-port-state to %d",
+ p->rstp->name, p->port_number, admin_port_state);
if (admin_port_state == RSTP_ADMIN_BRIDGE_PORT_STATE_DISABLED
|| admin_port_state == RSTP_ADMIN_BRIDGE_PORT_STATE_ENABLED) {
@@ -1120,6 +1125,27 @@ rstp_port_set_auto_edge__(struct rstp_port *port, bool
auto_edge)
}
}
+/* Sets the port admin_point_to_point_mac parameter. */
+static void rstp_port_set_admin_point_to_point_mac__(struct rstp_port *port,
+ enum rstp_admin_point_to_point_mac_state admin_p2p_mac_state)
+ OVS_REQUIRES(rstp_mutex)
+{
+ VLOG_DBG("%s, port %u: set RSTP port admin-point-to-point-mac to %d",
+ port->rstp->name, port->port_number, admin_p2p_mac_state);
+ if (admin_p2p_mac_state == RSTP_ADMIN_P2P_MAC_FORCE_TRUE) {
+ port->admin_point_to_point_mac = admin_p2p_mac_state;
+ rstp_port_set_oper_point_to_point_mac__(port,
+ RSTP_OPER_P2P_MAC_STATE_ENABLED);
+ } else if (admin_p2p_mac_state == RSTP_ADMIN_P2P_MAC_FORCE_FALSE) {
+ port->admin_point_to_point_mac = admin_p2p_mac_state;
+ rstp_port_set_oper_point_to_point_mac__(port,
+ RSTP_OPER_P2P_MAC_STATE_DISABLED);
+ } else if (admin_p2p_mac_state == RSTP_ADMIN_P2P_MAC_AUTO) {
+ port->admin_point_to_point_mac = admin_p2p_mac_state;
+ /* FIXME fix auto behaviour */
+ }
+}
+
/* Sets the port mcheck parameter.
* [17.19.13] May be set by management to force the Port Protocol Migration
* state machine to transmit RST BPDUs for a MigrateTime (17.13.9) period, to
@@ -1289,7 +1315,8 @@ rstp_port_get_status(const struct rstp_port *p, uint16_t
*id,
void
rstp_port_set(struct rstp_port *port, uint16_t port_num, int priority,
uint32_t path_cost, bool is_admin_edge, bool is_auto_edge,
- bool do_mcheck, void *aux)
+ enum rstp_admin_point_to_point_mac_state admin_p2p_mac_state,
+ bool admin_port_state, bool do_mcheck, void *aux)
OVS_EXCLUDED(rstp_mutex)
{
ovs_mutex_lock(&rstp_mutex);
@@ -1299,6 +1326,8 @@ rstp_port_set(struct rstp_port *port, uint16_t port_num,
int priority,
rstp_port_set_path_cost__(port, path_cost);
rstp_port_set_admin_edge__(port, is_admin_edge);
rstp_port_set_auto_edge__(port, is_auto_edge);
+ rstp_port_set_admin_point_to_point_mac__(port, admin_p2p_mac_state);
+ rstp_port_set_administrative_bridge_port__(port, admin_port_state);
rstp_port_set_mcheck__(port, do_mcheck);
ovs_mutex_unlock(&rstp_mutex);
}
diff --git a/lib/rstp.h b/lib/rstp.h
index ccf8292..458aecf 100644
--- a/lib/rstp.h
+++ b/lib/rstp.h
@@ -120,6 +120,12 @@ enum rstp_port_role {
ROLE_DISABLED
};
+enum rstp_admin_point_to_point_mac_state {
+ RSTP_ADMIN_P2P_MAC_FORCE_FALSE,
+ RSTP_ADMIN_P2P_MAC_FORCE_TRUE,
+ RSTP_ADMIN_P2P_MAC_AUTO
+};
+
struct rstp;
struct rstp_port;
struct ofproto_rstp_settings;
@@ -211,7 +217,8 @@ uint32_t rstp_convert_speed_to_cost(unsigned int speed);
void rstp_port_set(struct rstp_port *, uint16_t port_num, int priority,
uint32_t path_cost, bool is_admin_edge, bool is_auto_edge,
- bool do_mcheck, void *aux)
+ enum rstp_admin_point_to_point_mac_state
admin_p2p_mac_state,
+ bool admin_port_state, bool do_mcheck, void *aux)
OVS_EXCLUDED(rstp_mutex);
enum rstp_state rstp_port_get_state(const struct rstp_port *)
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 2302073..95298f2 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -2402,7 +2402,9 @@ set_rstp_port(struct ofport *ofport_,
}
rstp_port_set(rp, s->port_num, s->priority, s->path_cost,
- s->admin_edge_port, s->auto_edge, s->mcheck, ofport);
+ s->admin_edge_port, s->auto_edge,
+ s->admin_p2p_mac_state, s->admin_port_state, s->mcheck,
+ ofport);
update_rstp_port_state(ofport);
/* Synchronize operational status. */
rstp_port_set_mac_operational(rp, ofport->may_enable);
diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h
index 989747d..bb28376 100644
--- a/ofproto/ofproto.h
+++ b/ofproto/ofproto.h
@@ -126,6 +126,8 @@ struct ofproto_port_rstp_settings {
bool admin_edge_port;
bool auto_edge;
bool mcheck;
+ uint8_t admin_p2p_mac_state;
+ bool admin_port_state;
};
struct ofproto_stp_settings {
diff --git a/utilities/ovs-vsctl.8.in b/utilities/ovs-vsctl.8.in
index 8cf13ae..2902a27 100644
--- a/utilities/ovs-vsctl.8.in
+++ b/utilities/ovs-vsctl.8.in
@@ -1073,6 +1073,15 @@ Set the auto edge value of port \fBeth0\fR:
.IP
.B "ovs\-vsctl set Port eth0 other_config:rstp-port-auto-edge=true"
.PP
+Set the admin point to point mac value of port \fBeth0\fR.
+Acceptable values are 0 (force false), 1 (force true) or 2 (auto).
+.IP
+.B "ovs\-vsctl set Port eth0 other_config:rstp-admin-p2p-mac=1"
+.PP
+Set the admin port state value of port \fBeth0\fR.
+.IP
+.B "ovs\-vsctl set Port eth0 other_config:rstp-admin-port-state=true"
+.PP
Set the mcheck value of port \fBeth0\fR:
.IP
.B "ovs\-vsctl set Port eth0 other_config:rstp-port-mcheck=true"
diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index 20cfcba..a5fb361 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -1398,6 +1398,16 @@ port_configure_rstp(const struct ofproto *ofproto,
struct port *port,
port_s->priority = RSTP_DEFAULT_PORT_PRIORITY;
}
+ config_str = smap_get(&port->cfg->other_config, "rstp-admin-p2p-mac");
+ if (config_str) {
+ port_s->admin_p2p_mac_state = strtoul(config_str, NULL, 0);
+ } else {
+ port_s->admin_p2p_mac_state = RSTP_ADMIN_P2P_MAC_FORCE_TRUE;
+ }
+
+ port_s->admin_port_state = smap_get_bool(&port->cfg->other_config,
+ "rstp-admin-port-state", true);
+
port_s->admin_edge_port = smap_get_bool(&port->cfg->other_config,
"rstp-port-admin-edge", false);
port_s->auto_edge = smap_get_bool(&port->cfg->other_config,
--
1.8.1.2
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev