[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