Thanks, I applied this to master.

On Wed, Oct 31, 2018 at 02:49:28PM -0700, Yifeng Sun wrote:
> Thanks for the improvement.
> 
> Tested-by: Yifeng Sun <pkusunyif...@gmail.com>
> Reviewed-by: Yifeng Sun <pkusunyif...@gmail.com>
> 
> On Mon, Oct 29, 2018 at 3:59 PM Ben Pfaff <b...@ovn.org> wrote:
> 
> > Using an shash instead of an array simplifies the code for both the caller
> > and the callee.  Putting the set of allowed OpenFlow versions into the
> > ofproto_controller data structure also simplifies the overall function
> > interface slightly.
> >
> > Signed-off-by: Ben Pfaff <b...@ovn.org>
> > ---
> >  ofproto/connmgr.c |  51 +++++++++++----------------
> >  ofproto/connmgr.h |   5 ++-
> >  ofproto/ofproto.c |   7 ++--
> >  ofproto/ofproto.h |   7 ++--
> >  vswitchd/bridge.c | 102
> > ++++++++++++++++++++++--------------------------------
> >  5 files changed, 69 insertions(+), 103 deletions(-)
> >
> > diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c
> > index c7532cf01217..f5576d50524d 100644
> > --- a/ofproto/connmgr.c
> > +++ b/ofproto/connmgr.c
> > @@ -580,9 +580,7 @@ connmgr_free_controller_info(struct shash *info)
> >  /* Changes 'mgr''s set of controllers to the 'n_controllers' controllers
> > in
> >   * 'controllers'. */
> >  void
> > -connmgr_set_controllers(struct connmgr *mgr,
> > -                        const struct ofproto_controller *controllers,
> > -                        size_t n_controllers, uint32_t allowed_versions)
> > +connmgr_set_controllers(struct connmgr *mgr, struct shash *controllers)
> >      OVS_EXCLUDED(ofproto_mutex)
> >  {
> >      bool had_controllers = connmgr_has_controllers(mgr);
> > @@ -591,52 +589,49 @@ connmgr_set_controllers(struct connmgr *mgr,
> >       * cover a smaller amount of code, if that yielded some benefit. */
> >      ovs_mutex_lock(&ofproto_mutex);
> >
> > -    /* Create newly configured controllers and services.
> > -     * Create a name to ofproto_controller mapping in 'new_controllers'.
> > */
> > -    struct shash new_controllers = SHASH_INITIALIZER(&new_controllers);
> > -    for (size_t i = 0; i < n_controllers; i++) {
> > -        const struct ofproto_controller *c = &controllers[i];
> > +    /* Create newly configured controllers and services. */
> > +    struct shash_node *node;
> > +    SHASH_FOR_EACH (node, controllers) {
> > +        const char *target = node->name;
> > +        const struct ofproto_controller *c = node->data;
> >
> > -        if (!vconn_verify_name(c->target)) {
> > +        if (!vconn_verify_name(target)) {
> >              bool add = false;
> > -            struct ofconn *ofconn = find_controller_by_target(mgr,
> > c->target);
> > +            struct ofconn *ofconn = find_controller_by_target(mgr,
> > target);
> >              if (!ofconn) {
> >                  VLOG_INFO("%s: added primary controller \"%s\"",
> > -                          mgr->name, c->target);
> > +                          mgr->name, target);
> >                  add = true;
> >              } else if (rconn_get_allowed_versions(ofconn->rconn) !=
> > -                       allowed_versions) {
> > +                       c->allowed_versions) {
> >                  VLOG_INFO("%s: re-added primary controller \"%s\"",
> > -                          mgr->name, c->target);
> > +                          mgr->name, target);
> >                  add = true;
> >                  ofconn_destroy(ofconn);
> >              }
> >              if (add) {
> > -                add_controller(mgr, c->target, c->dscp, allowed_versions);
> > +                add_controller(mgr, target, c->dscp, c->allowed_versions);
> >              }
> > -        } else if (!pvconn_verify_name(c->target)) {
> > +        } else if (!pvconn_verify_name(target)) {
> >              bool add = false;
> > -            struct ofservice *ofservice = ofservice_lookup(mgr,
> > c->target);
> > +            struct ofservice *ofservice = ofservice_lookup(mgr, target);
> >              if (!ofservice) {
> >                  VLOG_INFO("%s: added service controller \"%s\"",
> > -                          mgr->name, c->target);
> > +                          mgr->name, target);
> >                  add = true;
> > -            } else if (ofservice->allowed_versions != allowed_versions) {
> > +            } else if (ofservice->allowed_versions !=
> > c->allowed_versions) {
> >                  VLOG_INFO("%s: re-added service controller \"%s\"",
> > -                          mgr->name, c->target);
> > +                          mgr->name, target);
> >                  ofservice_destroy(mgr, ofservice);
> >                  add = true;
> >              }
> >              if (add) {
> > -                ofservice_create(mgr, c->target, allowed_versions,
> > c->dscp);
> > +                ofservice_create(mgr, target, c->allowed_versions,
> > c->dscp);
> >              }
> >          } else {
> >              VLOG_WARN_RL(&rl, "%s: unsupported controller \"%s\"",
> > -                         mgr->name, c->target);
> > -            continue;
> > +                         mgr->name, target);
> >          }
> > -
> > -        shash_add_once(&new_controllers, c->target, &controllers[i]);
> >      }
> >
> >      /* Delete controllers that are no longer configured.
> > @@ -644,8 +639,7 @@ connmgr_set_controllers(struct connmgr *mgr,
> >      struct ofconn *ofconn, *next_ofconn;
> >      HMAP_FOR_EACH_SAFE (ofconn, next_ofconn, hmap_node,
> > &mgr->controllers) {
> >          const char *target = ofconn_get_target(ofconn);
> > -        struct ofproto_controller *c = shash_find_data(&new_controllers,
> > -                                                       target);
> > +        struct ofproto_controller *c = shash_find_data(controllers,
> > target);
> >          if (!c) {
> >              VLOG_INFO("%s: removed primary controller \"%s\"",
> >                        mgr->name, target);
> > @@ -660,8 +654,7 @@ connmgr_set_controllers(struct connmgr *mgr,
> >      struct ofservice *ofservice, *next_ofservice;
> >      HMAP_FOR_EACH_SAFE (ofservice, next_ofservice, node, &mgr->services) {
> >          const char *target = pvconn_get_name(ofservice->pvconn);
> > -        struct ofproto_controller *c = shash_find_data(&new_controllers,
> > -                                                       target);
> > +        struct ofproto_controller *c = shash_find_data(controllers,
> > target);
> >          if (!c) {
> >              VLOG_INFO("%s: removed service controller \"%s\"",
> >                        mgr->name, target);
> > @@ -671,8 +664,6 @@ connmgr_set_controllers(struct connmgr *mgr,
> >          }
> >      }
> >
> > -    shash_destroy(&new_controllers);
> > -
> >      ovs_mutex_unlock(&ofproto_mutex);
> >
> >      update_in_band_remotes(mgr);
> > diff --git a/ofproto/connmgr.h b/ofproto/connmgr.h
> > index 4a22f1c26611..11c8f9a85121 100644
> > --- a/ofproto/connmgr.h
> > +++ b/ofproto/connmgr.h
> > @@ -56,6 +56,7 @@ enum ofconn_type {
> >      OFCONN_PRIMARY,             /* An ordinary OpenFlow controller. */
> >      OFCONN_SERVICE              /* A service connection, e.g.
> > "ovs-ofctl". */
> >  };
> > +const char *ofconn_type_to_string(enum ofconn_type);
> >
> >  /* An asynchronous message that might need to be queued between threads.
> > */
> >  struct ofproto_async_msg {
> > @@ -94,9 +95,7 @@ void connmgr_retry(struct connmgr *);
> >  bool connmgr_has_controllers(const struct connmgr *);
> >  void connmgr_get_controller_info(struct connmgr *, struct shash *);
> >  void connmgr_free_controller_info(struct shash *);
> > -void connmgr_set_controllers(struct connmgr *,
> > -                             const struct ofproto_controller[], size_t n,
> > -                             uint32_t allowed_versions);
> > +void connmgr_set_controllers(struct connmgr *, struct shash *);
> >  void connmgr_reconnect(const struct connmgr *);
> >
> >  int connmgr_set_snoops(struct connmgr *, const struct sset *snoops);
> > diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> > index 8b2e3ca97a2b..222c749940ec 100644
> > --- a/ofproto/ofproto.c
> > +++ b/ofproto/ofproto.c
> > @@ -639,12 +639,9 @@ ofproto_set_datapath_id(struct ofproto *p, uint64_t
> > datapath_id)
> >  }
> >
> >  void
> > -ofproto_set_controllers(struct ofproto *p,
> > -                        const struct ofproto_controller *controllers,
> > -                        size_t n_controllers, uint32_t allowed_versions)
> > +ofproto_set_controllers(struct ofproto *p, struct shash *controllers)
> >  {
> > -    connmgr_set_controllers(p->connmgr, controllers, n_controllers,
> > -                            allowed_versions);
> > +    connmgr_set_controllers(p->connmgr, controllers);
> >  }
> >
> >  void
> > diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h
> > index 3ca88baf018f..595729dd61f1 100644
> > --- a/ofproto/ofproto.h
> > +++ b/ofproto/ofproto.h
> > @@ -208,11 +208,12 @@ enum ofproto_band {
> >  };
> >
> >  struct ofproto_controller {
> > -    char *target;               /* e.g. "tcp:127.0.0.1" */
> >      int max_backoff;            /* Maximum reconnection backoff, in
> > seconds. */
> >      int probe_interval;         /* Max idle time before probing, in
> > seconds. */
> >      enum ofproto_band band;     /* In-band or out-of-band? */
> >      bool enable_async_msgs;     /* Initially enable asynchronous
> > messages? */
> > +    uint32_t allowed_versions;  /* OpenFlow protocol versions that may
> > +                                 * be negotiated for a session. */
> >
> >      /* OpenFlow packet-in rate-limiting. */
> >      int rate_limit;             /* Max packet-in rate in packets per
> > second. */
> > @@ -304,9 +305,7 @@ int ofproto_port_query_by_name(const struct ofproto *,
> > const char *devname,
> >  /* Top-level configuration. */
> >  uint64_t ofproto_get_datapath_id(const struct ofproto *);
> >  void ofproto_set_datapath_id(struct ofproto *, uint64_t datapath_id);
> > -void ofproto_set_controllers(struct ofproto *,
> > -                             const struct ofproto_controller *, size_t n,
> > -                             uint32_t allowed_versions);
> > +void ofproto_set_controllers(struct ofproto *, struct shash *controllers);
> >  void ofproto_set_fail_mode(struct ofproto *, enum ofproto_fail_mode
> > fail_mode);
> >  void ofproto_reconnect_controllers(struct ofproto *);
> >  void ofproto_set_extra_in_band_remotes(struct ofproto *,
> > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> > index 9d230b20641c..83708ee51c7a 100644
> > --- a/vswitchd/bridge.c
> > +++ b/vswitchd/bridge.c
> > @@ -3462,48 +3462,6 @@ bridge_del_ports(struct bridge *br, const struct
> > shash *wanted_ports)
> >      }
> >  }
> >
> > -/* Initializes 'oc' appropriately as a management service controller for
> > - * 'br'.
> > - *
> > - * The caller must free oc->target when it is no longer needed. */
> > -static void
> > -bridge_ofproto_controller_for_mgmt(const struct bridge *br,
> > -                                   struct ofproto_controller *oc)
> > -{
> > -    oc->target = xasprintf("punix:%s/%s.mgmt", ovs_rundir(), br->name);
> > -    oc->max_backoff = 0;
> > -    oc->probe_interval = 60;
> > -    oc->band = OFPROTO_OUT_OF_BAND;
> > -    oc->rate_limit = 0;
> > -    oc->burst_limit = 0;
> > -    oc->enable_async_msgs = true;
> > -    oc->dscp = 0;
> > -}
> > -
> > -/* Converts ovsrec_controller 'c' into an ofproto_controller in 'oc'.  */
> > -static void
> > -bridge_ofproto_controller_from_ovsrec(const struct ovsrec_controller *c,
> > -                                      struct ofproto_controller *oc)
> > -{
> > -    int dscp;
> > -
> > -    oc->target = c->target;
> > -    oc->max_backoff = c->max_backoff ? *c->max_backoff / 1000 : 8;
> > -    oc->probe_interval = c->inactivity_probe ? *c->inactivity_probe /
> > 1000 : 5;
> > -    oc->band = (!c->connection_mode || !strcmp(c->connection_mode,
> > "in-band")
> > -                ? OFPROTO_IN_BAND : OFPROTO_OUT_OF_BAND);
> > -    oc->rate_limit = c->controller_rate_limit ? *c->controller_rate_limit
> > : 0;
> > -    oc->burst_limit = (c->controller_burst_limit
> > -                       ? *c->controller_burst_limit : 0);
> > -    oc->enable_async_msgs = (!c->enable_async_messages
> > -                             || *c->enable_async_messages);
> > -    dscp = smap_get_int(&c->other_config, "dscp", DSCP_DEFAULT);
> > -    if (dscp < 0 || dscp > 63) {
> > -        dscp = DSCP_DEFAULT;
> > -    }
> > -    oc->dscp = dscp;
> > -}
> > -
> >  /* Configures the IP stack for 'br''s local interface properly according
> > to the
> >   * configuration in 'c'.  */
> >  static void
> > @@ -3589,10 +3547,6 @@ bridge_configure_remotes(struct bridge *br,
> >
> >      enum ofproto_fail_mode fail_mode;
> >
> > -    struct ofproto_controller *ocs;
> > -    size_t n_ocs;
> > -    size_t i;
> > -
> >      /* Check if we should disable in-band control on this bridge. */
> >      disable_in_band = smap_get_bool(&br->cfg->other_config,
> > "disable-in-band",
> >                                      false);
> > @@ -3611,13 +3565,22 @@ bridge_configure_remotes(struct bridge *br,
> >      n_controllers = (ofproto_get_flow_restore_wait() ? 0
> >                       : bridge_get_controllers(br, &controllers));
> >
> > -    ocs = xmalloc((n_controllers + 1) * sizeof *ocs);
> > -    n_ocs = 0;
> > -
> > -    bridge_ofproto_controller_for_mgmt(br, &ocs[n_ocs++]);
> > -    for (i = 0; i < n_controllers; i++) {
> > +    /* The set of controllers to pass down to ofproto. */
> > +    struct shash ocs = SHASH_INITIALIZER(&ocs);
> > +
> > +    /* Add managment controller. */
> > +    struct ofproto_controller *oc = xmalloc(sizeof *oc);
> > +    *oc = (struct ofproto_controller) {
> > +        .probe_interval = 60,
> > +        .band = OFPROTO_OUT_OF_BAND,
> > +        .enable_async_msgs = true,
> > +        .allowed_versions = bridge_get_allowed_versions(br),
> > +    };
> > +    shash_add_nocopy(
> > +        &ocs, xasprintf("punix:%s/%s.mgmt", ovs_rundir(), br->name), oc);
> > +
> > +    for (size_t i = 0; i < n_controllers; i++) {
> >          struct ovsrec_controller *c = controllers[i];
> > -
> >          if (daemon_should_self_confine()
> >              && (!strncmp(c->target, "punix:", 6)
> >              || !strncmp(c->target, "unix:", 5))) {
> > @@ -3668,17 +3631,34 @@ bridge_configure_remotes(struct bridge *br,
> >          }
> >
> >          bridge_configure_local_iface_netdev(br, c);
> > -        bridge_ofproto_controller_from_ovsrec(c, &ocs[n_ocs]);
> > -        if (disable_in_band) {
> > -            ocs[n_ocs].band = OFPROTO_OUT_OF_BAND;
> > +
> > +        int dscp = smap_get_int(&c->other_config, "dscp", DSCP_DEFAULT);
> > +        if (dscp < 0 || dscp > 63) {
> > +            dscp = DSCP_DEFAULT;
> >          }
> > -        n_ocs++;
> > -    }
> >
> > -    ofproto_set_controllers(br->ofproto, ocs, n_ocs,
> > -                            bridge_get_allowed_versions(br));
> > -    free(ocs[0].target); /* From bridge_ofproto_controller_for_mgmt(). */
> > -    free(ocs);
> > +        oc = xmalloc(sizeof *oc);
> > +        *oc = (struct ofproto_controller) {
> > +            .max_backoff = c->max_backoff ? *c->max_backoff / 1000 : 8,
> > +            .probe_interval = (c->inactivity_probe
> > +                               ? *c->inactivity_probe / 1000 : 5),
> > +            .band = ((!c->connection_mode
> > +                      || !strcmp(c->connection_mode, "in-band"))
> > +                     && !disable_in_band
> > +                     ? OFPROTO_IN_BAND : OFPROTO_OUT_OF_BAND),
> > +            .enable_async_msgs = (!c->enable_async_messages
> > +                                  || *c->enable_async_messages),
> > +            .allowed_versions = bridge_get_allowed_versions(br),
> > +            .rate_limit = (c->controller_rate_limit
> > +                           ? *c->controller_rate_limit : 0),
> > +            .burst_limit = (c->controller_burst_limit
> > +                            ? *c->controller_burst_limit : 0),
> > +            .dscp = dscp,
> > +        };
> > +        shash_add(&ocs, c->target, oc);
> > +    }
> > +    ofproto_set_controllers(br->ofproto, &ocs);
> > +    shash_destroy_free_data(&ocs);
> >
> >      /* Set the fail-mode. */
> >      fail_mode = !br->cfg->fail_mode
> > --
> > 2.16.1
> >
> > _______________________________________________
> > dev mailing list
> > d...@openvswitch.org
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> >
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to