Prior to this patch the default values for ports were set in three different places. This refactors them all to one helper function.
Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com> --- lib/rstp.c | 105 ++++++++++++++++++------------------------------ ofproto/ofproto-dpif.c | 1 + 2 files changed, 41 insertions(+), 65 deletions(-) diff --git a/lib/rstp.c b/lib/rstp.c index 034292d..3bec795 100644 --- a/lib/rstp.c +++ b/lib/rstp.c @@ -59,7 +59,8 @@ static void set_bridge_priority__(struct rstp *); static void reinitialize_rstp__(struct rstp *); static bool is_port_number_available__(struct rstp *, int, struct rstp_port *); static uint16_t rstp_first_free_number__(struct rstp *, struct rstp_port *); -static void rstp_initialize_port__(struct rstp_port *); +static void rstp_initialize_port_defaults__(struct rstp_port *); +static void reinitialize_port__(struct rstp_port *); const char * rstp_state_name(enum rstp_state state) @@ -359,35 +360,10 @@ reinitialize_rstp__(struct rstp *rstp) rstp->ports_count = temp.ports_count; if (rstp->ports_count > 0) { - struct rstp_port *p, temp_port; + struct rstp_port *p; LIST_FOR_EACH (p, node, &rstp->ports) { - temp_port = *p; - memset(p, 0, sizeof(struct rstp_port)); - p->rstp = rstp; - p->node = temp_port.node; - p->aux = temp_port.aux; - p->port_number = temp_port.port_number; - p->port_priority = temp_port.port_priority; - p->port_id = temp_port.port_id; - p->rstp_state = RSTP_DISCARDING; - - rstp_port_set_administrative_bridge_port(p, - RSTP_ADMIN_BRIDGE_PORT_STATE_ENABLED); - rstp_port_set_oper_point_to_point_mac(p, 1); - rstp_port_set_path_cost(p, RSTP_DEFAULT_PORT_PATH_COST); - rstp_port_set_auto_edge(p, true); - /* Initialize state machines. */ - p->port_receive_sm_state = PORT_RECEIVE_SM_INIT; - p->port_protocol_migration_sm_state = - PORT_PROTOCOL_MIGRATION_SM_INIT; - p->bridge_detection_sm_state = BRIDGE_DETECTION_SM_INIT; - p->port_transmit_sm_state = PORT_TRANSMIT_SM_INIT; - p->port_information_sm_state = PORT_INFORMATION_SM_INIT; - p->port_role_transition_sm_state = PORT_ROLE_TRANSITION_SM_INIT; - p->port_state_transition_sm_state = PORT_STATE_TRANSITION_SM_INIT; - p->topology_change_sm_state = TOPOLOGY_CHANGE_SM_INIT; - p->uptime = 0; + reinitialize_port__(p); } } rstp->ref_cnt = temp.ref_cnt; @@ -730,14 +706,16 @@ rstp_get_changed_port(struct rstp *rstp, struct rstp_port **portp) return changed; } -/* Returns the port in 'rstp' with number 'port_number'. */ +/* Returns the port in 'rstp' with number 'port_number'. + * + * XXX: May only be called while concurrent deletion of ports is excluded. */ struct rstp_port * rstp_get_port(struct rstp *rstp, int port_number) { struct rstp_port *port; ovs_mutex_lock(&mutex); - if (rstp->ports_count > 0){ + if (rstp->ports_count > 0) { LIST_FOR_EACH (port, node, &rstp->ports) { if (port->port_number == port_number) { ovs_mutex_unlock(&mutex); @@ -752,9 +730,10 @@ rstp_get_port(struct rstp *rstp, int port_number) /* Updates the port_enabled parameter. */ static void update_port_enabled__(struct rstp_port *p) + OVS_REQUIRES(mutex) { - if (p->mac_operational && p->is_administrative_bridge_port == - RSTP_ADMIN_BRIDGE_PORT_STATE_ENABLED) { + if (p->mac_operational && p->is_administrative_bridge_port + == RSTP_ADMIN_BRIDGE_PORT_STATE_ENABLED) { p->port_enabled = true; } else { p->port_enabled = false; @@ -793,10 +772,12 @@ void rstp_port_set_administrative_bridge_port(struct rstp_port *p, uint8_t new_admin_port_state) { - if (new_admin_port_state == RSTP_ADMIN_BRIDGE_PORT_STATE_DISABLED || - new_admin_port_state == RSTP_ADMIN_BRIDGE_PORT_STATE_ENABLED) { + if (new_admin_port_state == RSTP_ADMIN_BRIDGE_PORT_STATE_DISABLED + || new_admin_port_state == RSTP_ADMIN_BRIDGE_PORT_STATE_ENABLED) { + ovs_mutex_lock(&mutex); p->is_administrative_bridge_port = new_admin_port_state; update_port_enabled__(p); + ovs_mutex_unlock(&mutex); } } @@ -805,29 +786,27 @@ void rstp_port_set_oper_point_to_point_mac(struct rstp_port *p, uint8_t new_oper_p2p_mac) { - if (new_oper_p2p_mac == RSTP_OPER_P2P_MAC_STATE_DISABLED || - new_oper_p2p_mac == RSTP_OPER_P2P_MAC_STATE_ENABLED) { + if (new_oper_p2p_mac == RSTP_OPER_P2P_MAC_STATE_DISABLED + || new_oper_p2p_mac == RSTP_OPER_P2P_MAC_STATE_ENABLED) { + ovs_mutex_lock(&mutex); p->oper_point_to_point_mac = new_oper_p2p_mac; update_port_enabled__(p); + ovs_mutex_unlock(&mutex); } } /* Initializes a port with the defaults values for its parameters. */ static void -rstp_initialize_port__(struct rstp_port *p) +rstp_initialize_port_defaults__(struct rstp_port *p) OVS_REQUIRES(mutex) { - struct rstp *rstp; - - rstp = p->rstp; rstp_port_set_administrative_bridge_port(p, RSTP_ADMIN_BRIDGE_PORT_STATE_ENABLED); rstp_port_set_oper_point_to_point_mac(p, 1); - rstp_port_set_priority(p, RSTP_DEFAULT_PORT_PRIORITY); - rstp_port_set_port_number(p, 0); rstp_port_set_path_cost(p, RSTP_DEFAULT_PORT_PATH_COST); rstp_port_set_auto_edge(p, true); + /* Initialize state machines. */ p->port_receive_sm_state = PORT_RECEIVE_SM_INIT; p->port_protocol_migration_sm_state = PORT_PROTOCOL_MIGRATION_SM_INIT; p->bridge_detection_sm_state = BRIDGE_DETECTION_SM_INIT; @@ -836,16 +815,13 @@ rstp_initialize_port__(struct rstp_port *p) p->port_role_transition_sm_state = PORT_ROLE_TRANSITION_SM_INIT; p->port_state_transition_sm_state = PORT_STATE_TRANSITION_SM_INIT; p->topology_change_sm_state = TOPOLOGY_CHANGE_SM_INIT; - p->aux = NULL; p->uptime = 0; - VLOG_DBG("%s: RSTP port "RSTP_PORT_ID_FMT" initialized.", rstp->name, - p->port_id); } -/* Reinitialization function used in tests. */ void -reinitialize_port(struct rstp_port *p) +reinitialize_port__(struct rstp_port *p) + OVS_REQUIRES(mutex) { struct rstp_port temp_port; struct rstp *rstp; @@ -861,25 +837,18 @@ reinitialize_port(struct rstp_port *p) p->port_id = temp_port.port_id; p->rstp_state = RSTP_DISCARDING; - rstp_port_set_administrative_bridge_port(p, - RSTP_ADMIN_BRIDGE_PORT_STATE_ENABLED); - rstp_port_set_oper_point_to_point_mac(p, 1); - rstp_port_set_path_cost(p, RSTP_DEFAULT_PORT_PATH_COST); - rstp_port_set_auto_edge(p, true); - /* Initialize state machines. */ - p->port_receive_sm_state = PORT_RECEIVE_SM_INIT; - p->port_protocol_migration_sm_state = - PORT_PROTOCOL_MIGRATION_SM_INIT; - p->bridge_detection_sm_state = BRIDGE_DETECTION_SM_INIT; - p->port_transmit_sm_state = PORT_TRANSMIT_SM_INIT; - p->port_information_sm_state = PORT_INFORMATION_SM_INIT; - p->port_role_transition_sm_state = PORT_ROLE_TRANSITION_SM_INIT; - p->port_state_transition_sm_state = PORT_STATE_TRANSITION_SM_INIT; - p->topology_change_sm_state = TOPOLOGY_CHANGE_SM_INIT; - p->uptime = 0; + rstp_initialize_port_defaults__(p); VLOG_DBG("%s: RSTP port "RSTP_PORT_ID_FMT" reinitialized.", rstp->name, - p->port_id); + p->port_id); +} + +void +reinitialize_port(struct rstp_port *p) +{ + ovs_mutex_lock(&mutex); + reinitialize_port__(p); + ovs_mutex_unlock(&mutex); } /* Sets the port state. */ @@ -908,7 +877,13 @@ rstp_add_port(struct rstp *rstp) { ovs_mutex_lock(&mutex); p->rstp = rstp; - rstp_initialize_port__(p); + rstp_port_set_priority(p, RSTP_DEFAULT_PORT_PRIORITY); + rstp_port_set_port_number(p, 0); + p->aux = NULL; + rstp_initialize_port_defaults__(p); + VLOG_DBG("%s: RSTP port "RSTP_PORT_ID_FMT" initialized.", rstp->name, + p->port_id); + rstp_port_set_state(p, RSTP_DISCARDING); list_push_back(&rstp->ports, &p->node); rstp->ports_count++; diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 32f08dd..b2942f5 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -2065,6 +2065,7 @@ rstp_run(struct ofproto_dpif *ofproto) long long int now = time_msec(); long long int elapsed = now - ofproto->rstp_last_tick; struct rstp_port *rp; + /* Every second, decrease the values of the timers. */ if (elapsed >= 1000) { rstp_tick_timers(ofproto->rstp); -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev