[ovs-dev] [PATCH v6 10/18] lib/rstp: Refactor port initialization.
Daniele Venturino
venturino.daniele at gmail.com
Tue Sep 9 10:34:16 UTC 2014
Acked-by: Daniele Venturino <daniele.venturino at m3s.it>
2014-08-21 1:57 GMT+02:00 Jarno Rajahalme <jrajahalme at nicira.com>:
> 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 <jrajahalme at 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 at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
More information about the dev
mailing list