[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