[ovs-dev] [sset 5/8] ofproto: Change string sets in interface from svec to sset.

Ben Pfaff blp at nicira.com
Fri Mar 25 22:40:47 UTC 2011


---
 ofproto/collectors.c      |   20 +++++++-------------
 ofproto/collectors.h      |    7 ++++---
 ofproto/netflow.c         |    3 +--
 ofproto/netflow.h         |    6 +++---
 ofproto/ofproto-sflow.c   |   10 +++++-----
 ofproto/ofproto.c         |   23 ++++++++++++++---------
 ofproto/ofproto.h         |   11 ++++++-----
 utilities/ovs-openflowd.c |   12 ++++++------
 vswitchd/bridge.c         |   29 +++++++++++++++--------------
 9 files changed, 61 insertions(+), 60 deletions(-)

diff --git a/ofproto/collectors.c b/ofproto/collectors.c
index 58d6abb..bd3e89b 100644
--- a/ofproto/collectors.c
+++ b/ofproto/collectors.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@
 #include <unistd.h>
 
 #include "socket-util.h"
-#include "svec.h"
+#include "sset.h"
 #include "util.h"
 #include "vlog.h"
 
@@ -47,24 +47,19 @@ struct collectors {
  * added, otherwise to a new collectors object if at least one was successfully
  * added.  Thus, even on a failure return, it is possible that '*collectorsp'
  * is nonnull, and even on a successful return, it is possible that
- * '*collectorsp' is null, if 'target's is an empty svec. */
+ * '*collectorsp' is null, if 'target's is an empty sset. */
 int
-collectors_create(const struct svec *targets_, uint16_t default_port,
+collectors_create(const struct sset *targets, uint16_t default_port,
                   struct collectors **collectorsp)
 {
     struct collectors *c;
-    struct svec targets;
+    const char *name;
     int retval = 0;
-    size_t i;
-
-    svec_clone(&targets, targets_);
-    svec_sort_unique(&targets);
 
     c = xmalloc(sizeof *c);
-    c->fds = xmalloc(sizeof *c->fds * targets.n);
+    c->fds = xmalloc(sizeof *c->fds * sset_count(targets));
     c->n_fds = 0;
-    for (i = 0; i < targets.n; i++) {
-        const char *name = targets.names[i];
+    SSET_FOR_EACH (name, targets) {
         int error;
         int fd;
 
@@ -81,7 +76,6 @@ collectors_create(const struct svec *targets_, uint16_t default_port,
             }
         }
     }
-    svec_destroy(&targets);
 
     if (c->n_fds) {
         *collectorsp = c;
diff --git a/ofproto/collectors.h b/ofproto/collectors.h
index ac70f37..47b148b 100644
--- a/ofproto/collectors.h
+++ b/ofproto/collectors.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009 Nicira Networks.
+ * Copyright (c) 2009, 2011 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,12 +17,13 @@
 #ifndef COLLECTORS_H
 #define COLLECTORS_H 1
 
+#include <stddef.h>
 #include <stdint.h>
-#include "svec.h"
 
 struct collectors;
+struct sset;
 
-int collectors_create(const struct svec *targets, uint16_t default_port,
+int collectors_create(const struct sset *targets, uint16_t default_port,
                       struct collectors **);
 void collectors_destroy(struct collectors *);
 
diff --git a/ofproto/netflow.c b/ofproto/netflow.c
index 77572fe..2d69db8 100644
--- a/ofproto/netflow.c
+++ b/ofproto/netflow.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,7 +28,6 @@
 #include "ofproto.h"
 #include "packets.h"
 #include "socket-util.h"
-#include "svec.h"
 #include "timeval.h"
 #include "util.h"
 #include "vlog.h"
diff --git a/ofproto/netflow.h b/ofproto/netflow.h
index 58fe7cb..bf5bf45 100644
--- a/ofproto/netflow.h
+++ b/ofproto/netflow.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
 
 #include <stdint.h>
 #include "flow.h"
-#include "svec.h"
+#include "sset.h"
 
 /* Default active timeout interval, in seconds.
  *
@@ -31,7 +31,7 @@
 struct ofexpired;
 
 struct netflow_options {
-    struct svec collectors;
+    struct sset collectors;
     uint8_t engine_type;
     uint8_t engine_id;
     int active_timeout;
diff --git a/ofproto/ofproto-sflow.c b/ofproto/ofproto-sflow.c
index 05794e1..5351b83 100644
--- a/ofproto/ofproto-sflow.c
+++ b/ofproto/ofproto-sflow.c
@@ -72,7 +72,7 @@ static bool
 ofproto_sflow_options_equal(const struct ofproto_sflow_options *a,
                             const struct ofproto_sflow_options *b)
 {
-    return (svec_equal(&a->targets, &b->targets)
+    return (sset_equals(&a->targets, &b->targets)
             && a->sampling_rate == b->sampling_rate
             && a->polling_interval == b->polling_interval
             && a->header_len == b->header_len
@@ -85,7 +85,7 @@ static struct ofproto_sflow_options *
 ofproto_sflow_options_clone(const struct ofproto_sflow_options *old)
 {
     struct ofproto_sflow_options *new = xmemdup(old, sizeof *old);
-    svec_clone(&new->targets, &old->targets);
+    sset_clone(&new->targets, &old->targets);
     new->agent_device = old->agent_device ? xstrdup(old->agent_device) : NULL;
     new->control_ip = old->control_ip ? xstrdup(old->control_ip) : NULL;
     return new;
@@ -95,7 +95,7 @@ static void
 ofproto_sflow_options_destroy(struct ofproto_sflow_options *options)
 {
     if (options) {
-        svec_destroy(&options->targets);
+        sset_destroy(&options->targets);
         free(options->agent_device);
         free(options->control_ip);
         free(options);
@@ -395,7 +395,7 @@ ofproto_sflow_set_options(struct ofproto_sflow *os,
     SFLAddress agentIP;
     time_t now;
 
-    if (!options->targets.n || !options->sampling_rate) {
+    if (sset_is_empty(&options->targets) || !options->sampling_rate) {
         /* No point in doing any work if there are no targets or nothing to
          * sample. */
         ofproto_sflow_clear(os);
@@ -409,7 +409,7 @@ ofproto_sflow_set_options(struct ofproto_sflow *os,
      * collectors (which indicates that opening one or more of the configured
      * collectors failed, so that we should retry). */
     if (options_changed
-        || collectors_count(os->collectors) < options->targets.n) {
+        || collectors_count(os->collectors) < sset_count(&options->targets)) {
         collectors_destroy(os->collectors);
         collectors_create(&options->targets, SFL_DEFAULT_COLLECTOR_PORT,
                           &os->collectors);
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index 5412f8e..0c625b6 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -56,7 +56,6 @@
 #include "shash.h"
 #include "sset.h"
 #include "stream-ssl.h"
-#include "svec.h"
 #include "tag.h"
 #include "timeval.h"
 #include "unaligned.h"
@@ -873,10 +872,11 @@ ofproto_set_desc(struct ofproto *p,
 
 static int
 set_pvconns(struct pvconn ***pvconnsp, size_t *n_pvconnsp,
-            const struct svec *svec)
+            const struct sset *sset)
 {
     struct pvconn **pvconns = *pvconnsp;
     size_t n_pvconns = *n_pvconnsp;
+    const char *name;
     int retval = 0;
     size_t i;
 
@@ -885,10 +885,9 @@ set_pvconns(struct pvconn ***pvconnsp, size_t *n_pvconnsp,
     }
     free(pvconns);
 
-    pvconns = xmalloc(svec->n * sizeof *pvconns);
+    pvconns = xmalloc(sset_count(sset) * sizeof *pvconns);
     n_pvconns = 0;
-    for (i = 0; i < svec->n; i++) {
-        const char *name = svec->names[i];
+    SSET_FOR_EACH (name, sset) {
         struct pvconn *pvconn;
         int error;
 
@@ -910,7 +909,7 @@ set_pvconns(struct pvconn ***pvconnsp, size_t *n_pvconnsp,
 }
 
 int
-ofproto_set_snoops(struct ofproto *ofproto, const struct svec *snoops)
+ofproto_set_snoops(struct ofproto *ofproto, const struct sset *snoops)
 {
     return set_pvconns(&ofproto->snoops, &ofproto->n_snoops, snoops);
 }
@@ -919,7 +918,7 @@ int
 ofproto_set_netflow(struct ofproto *ofproto,
                     const struct netflow_options *nf_options)
 {
-    if (nf_options && nf_options->collectors.n) {
+    if (nf_options && !sset_is_empty(&nf_options->collectors)) {
         if (!ofproto->netflow) {
             ofproto->netflow = netflow_create();
         }
@@ -1034,13 +1033,19 @@ ofproto_get_fail_mode(const struct ofproto *p)
     return p->fail_mode;
 }
 
+bool
+ofproto_has_snoops(const struct ofproto *ofproto)
+{
+    return ofproto->n_snoops > 0;
+}
+
 void
-ofproto_get_snoops(const struct ofproto *ofproto, struct svec *snoops)
+ofproto_get_snoops(const struct ofproto *ofproto, struct sset *snoops)
 {
     size_t i;
 
     for (i = 0; i < ofproto->n_snoops; i++) {
-        svec_add(snoops, pvconn_get_name(ofproto->snoops[i]));
+        sset_add(snoops, pvconn_get_name(ofproto->snoops[i]));
     }
 }
 
diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h
index b049fe1..96f0098 100644
--- a/ofproto/ofproto.h
+++ b/ofproto/ofproto.h
@@ -24,6 +24,7 @@
 #include <stdint.h>
 #include "flow.h"
 #include "netflow.h"
+#include "sset.h"
 #include "tag.h"
 
 #ifdef  __cplusplus
@@ -35,7 +36,6 @@ struct nlattr;
 struct ofhooks;
 struct ofproto;
 struct shash;
-struct svec;
 
 struct ofproto_controller_info {
     bool is_connected;
@@ -55,7 +55,7 @@ struct ofexpired {
 };
 
 struct ofproto_sflow_options {
-    struct svec targets;
+    struct sset targets;
     uint32_t sampling_rate;
     uint32_t polling_interval;
     uint32_t header_len;
@@ -118,7 +118,7 @@ void ofproto_set_desc(struct ofproto *,
                       const char *mfr_desc, const char *hw_desc,
                       const char *sw_desc, const char *serial_desc,
                       const char *dp_desc);
-int ofproto_set_snoops(struct ofproto *, const struct svec *snoops);
+int ofproto_set_snoops(struct ofproto *, const struct sset *snoops);
 int ofproto_set_netflow(struct ofproto *,
                         const struct netflow_options *nf_options);
 void ofproto_set_sflow(struct ofproto *, const struct ofproto_sflow_options *);
@@ -136,8 +136,9 @@ const struct cfm *ofproto_iface_get_cfm(struct ofproto *, uint32_t port_no);
 uint64_t ofproto_get_datapath_id(const struct ofproto *);
 bool ofproto_has_primary_controller(const struct ofproto *);
 enum ofproto_fail_mode ofproto_get_fail_mode(const struct ofproto *);
-void ofproto_get_listeners(const struct ofproto *, struct svec *);
-void ofproto_get_snoops(const struct ofproto *, struct svec *);
+void ofproto_get_listeners(const struct ofproto *, struct sset *);
+bool ofproto_has_snoops(const struct ofproto *);
+void ofproto_get_snoops(const struct ofproto *, struct sset *);
 void ofproto_get_all_flows(struct ofproto *p, struct ds *);
 
 /* Functions for use by ofproto implementation modules, not by clients. */
diff --git a/utilities/ovs-openflowd.c b/utilities/ovs-openflowd.c
index d2e0336..f1c52f9 100644
--- a/utilities/ovs-openflowd.c
+++ b/utilities/ovs-openflowd.c
@@ -73,13 +73,13 @@ struct ofsettings {
     const char *dp_desc;        /* Datapath description. */
 
     /* Related vconns and network devices. */
-    struct svec snoops;          /* Listen for controller snooping conns. */
+    struct sset snoops;          /* Listen for controller snooping conns. */
 
     /* Failure behavior. */
     int max_idle;             /* Idle time for flows in fail-open mode. */
 
     /* NetFlow. */
-    struct svec netflow;        /* NetFlow targets. */
+    struct sset netflow;        /* NetFlow targets. */
 };
 
 static unixctl_cb_func ovs_openflowd_exit;
@@ -291,9 +291,9 @@ parse_options(int argc, char *argv[], struct ofsettings *s)
     s->serial_desc = NULL;
     s->dp_desc = NULL;
     svec_init(&controllers);
-    svec_init(&s->snoops);
+    sset_init(&s->snoops);
     s->max_idle = 0;
-    svec_init(&s->netflow);
+    sset_init(&s->netflow);
     svec_init(&s->ports);
     for (;;) {
         int c;
@@ -398,7 +398,7 @@ parse_options(int argc, char *argv[], struct ofsettings *s)
             break;
 
         case OPT_NETFLOW:
-            svec_add(&s->netflow, optarg);
+            sset_add(&s->netflow, optarg);
             break;
 
         case 'l':
@@ -406,7 +406,7 @@ parse_options(int argc, char *argv[], struct ofsettings *s)
             break;
 
         case OPT_SNOOP:
-            svec_add(&s->snoops, optarg);
+            sset_add(&s->snoops, optarg);
             break;
 
         case OPT_PORTS:
diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index 4d06e0c..4815e46 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -813,12 +813,14 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg)
                 }
             }
 
-            opts.collectors.n = nf_cfg->n_targets;
-            opts.collectors.names = nf_cfg->targets;
+            sset_init(&opts.collectors);
+            sset_add_array(&opts.collectors,
+                           nf_cfg->targets, nf_cfg->n_targets);
             if (ofproto_set_netflow(br->ofproto, &opts)) {
                 VLOG_ERR("bridge %s: problem setting netflow collectors",
                          br->name);
             }
+            sset_destroy(&opts.collectors);
         } else {
             ofproto_set_netflow(br->ofproto, NULL);
         }
@@ -832,8 +834,9 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg)
 
             memset(&oso, 0, sizeof oso);
 
-            oso.targets.n = sflow_cfg->n_targets;
-            oso.targets.names = sflow_cfg->targets;
+            sset_init(&oso.targets);
+            sset_add_array(&oso.targets,
+                           sflow_cfg->targets, sflow_cfg->n_targets);
 
             oso.sampling_rate = SFL_DEFAULT_SAMPLING_RATE;
             if (sflow_cfg->sampling) {
@@ -863,7 +866,7 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg)
             }
             ofproto_set_sflow(br->ofproto, &oso);
 
-            /* Do not destroy oso.targets because it is owned by sflow_cfg. */
+            sset_destroy(&oso.targets);
         } else {
             ofproto_set_sflow(br->ofproto, NULL);
         }
@@ -1793,7 +1796,6 @@ static void
 bridge_reconfigure_one(struct bridge *br)
 {
     enum ofproto_fail_mode fail_mode;
-    struct svec snoops, old_snoops;
     struct port *port, *next;
     struct shash_node *node;
     struct shash new_ports;
@@ -1873,16 +1875,15 @@ bridge_reconfigure_one(struct bridge *br)
      * controller to another?) */
 
     /* Configure OpenFlow controller connection snooping. */
-    svec_init(&snoops);
-    svec_add_nocopy(&snoops, xasprintf("punix:%s/%s.snoop",
-                                       ovs_rundir(), br->name));
-    svec_init(&old_snoops);
-    ofproto_get_snoops(br->ofproto, &old_snoops);
-    if (!svec_equal(&snoops, &old_snoops)) {
+    if (!ofproto_has_snoops(br->ofproto)) {
+        struct sset snoops;
+
+        sset_init(&snoops);
+        sset_add_and_free(&snoops, xasprintf("punix:%s/%s.snoop",
+                                             ovs_rundir(), br->name));
         ofproto_set_snoops(br->ofproto, &snoops);
+        sset_destroy(&snoops);
     }
-    svec_destroy(&snoops);
-    svec_destroy(&old_snoops);
 
     mirror_reconfigure(br);
 }
-- 
1.7.1




More information about the dev mailing list