[ovs-dev] [PATCH 08/18] ofproto, connmgr: Parameterise OpenFlow versions for adding controller
Simon Horman
horms at verge.net.au
Thu Oct 18 05:58:08 UTC 2012
Allow allowed Open Flow versions to be passed rather
than relying on hard-coded defaults.
This is in preparation for allowing configuration of the
allowed OpenFlow versions.
Signed-off-by: Simon Horman <horms at verge.net.au>
---
ofproto/connmgr.c | 34 +++++++++++++---------------------
ofproto/connmgr.h | 3 ++-
ofproto/ofproto.c | 6 ++++--
ofproto/ofproto.h | 3 ++-
vswitchd/bridge.c | 2 +-
5 files changed, 22 insertions(+), 26 deletions(-)
diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c
index bab6f44..339cc39 100644
--- a/ofproto/connmgr.c
+++ b/ofproto/connmgr.c
@@ -138,7 +138,7 @@ struct ofservice {
static void ofservice_reconfigure(struct ofservice *,
const struct ofproto_controller *);
static int ofservice_create(struct connmgr *mgr, const char *target,
- struct ofputil_version_bitmap *allowed_versions,
+ const struct ofputil_version_bitmap *allowed_versions,
uint8_t dscp);
static void ofservice_destroy(struct connmgr *, struct ofservice *);
static struct ofservice *ofservice_lookup(struct connmgr *,
@@ -293,16 +293,12 @@ connmgr_run(struct connmgr *mgr,
retval = pvconn_accept(ofservice->pvconn, &vconn);
if (!retval) {
- struct ofputil_version_bitmap ovb =
- OFPUTIL_VERSION_BITMAP_INITIALIZER;
struct rconn *rconn;
char *name;
/* Passing default value for creation of the rconn */
- ofputil_version_bitmap_set1(&ovb, OFP10_VERSION);
- rconn = rconn_create(ofservice->probe_interval, 0,
- ofservice->dscp, &ovb);
- ofputil_version_bitmap_free_data(&ovb);
+ rconn = rconn_create(ofservice->probe_interval, 0, ofservice->dscp,
+ vconn_get_allowed_versions(vconn));
name = ofconn_make_name(mgr, vconn_get_name(vconn));
rconn_connect_unreliably(rconn, vconn, name);
free(name);
@@ -405,7 +401,8 @@ connmgr_retry(struct connmgr *mgr)
/* OpenFlow configuration. */
-static void add_controller(struct connmgr *, const char *target, uint8_t dscp);
+static void add_controller(struct connmgr *, const char *target, uint8_t dscp,
+ const struct ofputil_version_bitmap *allowed_versions);
static struct ofconn *find_controller_by_target(struct connmgr *,
const char *target);
static void update_fail_open(struct connmgr *);
@@ -496,7 +493,8 @@ connmgr_free_controller_info(struct shash *info)
void
connmgr_set_controllers(struct connmgr *mgr,
const struct ofproto_controller *controllers,
- size_t n_controllers)
+ size_t n_controllers,
+ const struct ofputil_version_bitmap *allowed_versions)
{
bool had_controllers = connmgr_has_controllers(mgr);
struct shash new_controllers;
@@ -514,17 +512,13 @@ connmgr_set_controllers(struct connmgr *mgr,
if (!find_controller_by_target(mgr, c->target)) {
VLOG_INFO("%s: added primary controller \"%s\"",
mgr->name, c->target);
- add_controller(mgr, c->target, c->dscp);
+ add_controller(mgr, c->target, c->dscp, allowed_versions);
}
} else if (!pvconn_verify_name(c->target)) {
if (!ofservice_lookup(mgr, c->target)) {
- struct ofputil_version_bitmap ovb =
- OFPUTIL_VERSION_BITMAP_INITIALIZER;
VLOG_INFO("%s: added service controller \"%s\"",
mgr->name, c->target);
- ofputil_version_bitmap_set1(&ovb, OFP10_VERSION);
- ofservice_create(mgr, c->target, &ovb, c->dscp);
- ofputil_version_bitmap_free_data(&ovb);
+ ofservice_create(mgr, c->target, allowed_versions, c->dscp);
}
} else {
VLOG_WARN_RL(&rl, "%s: unsupported controller \"%s\"",
@@ -619,16 +613,14 @@ connmgr_has_snoops(const struct connmgr *mgr)
/* Creates a new controller for 'target' in 'mgr'. update_controller() needs
* to be called later to finish the new ofconn's configuration. */
static void
-add_controller(struct connmgr *mgr, const char *target, uint8_t dscp)
+add_controller(struct connmgr *mgr, const char *target, uint8_t dscp,
+ const struct ofputil_version_bitmap *allowed_versions)
{
- struct ofputil_version_bitmap ovb = OFPUTIL_VERSION_BITMAP_INITIALIZER;
char *name = ofconn_make_name(mgr, target);
struct ofconn *ofconn;
- ofputil_version_bitmap_set1(&ovb, OFP10_VERSION);
- ofconn = ofconn_create(mgr, rconn_create(5, 8, dscp, &ovb),
+ ofconn = ofconn_create(mgr, rconn_create(5, 8, dscp, allowed_versions),
OFCONN_PRIMARY, true);
- ofputil_version_bitmap_free_data(&ovb);
ofconn->pktbuf = pktbuf_create();
rconn_connect(ofconn->rconn, target, name);
hmap_insert(&mgr->controllers, &ofconn->hmap_node, hash_string(target, 0));
@@ -1636,7 +1628,7 @@ connmgr_flushed(struct connmgr *mgr)
* ofservice. */
static int
ofservice_create(struct connmgr *mgr, const char *target,
- struct ofputil_version_bitmap *allowed_versions,
+ const struct ofputil_version_bitmap *allowed_versions,
uint8_t dscp)
{
struct ofservice *ofservice;
diff --git a/ofproto/connmgr.h b/ofproto/connmgr.h
index 3a508ca..f31db7f 100644
--- a/ofproto/connmgr.h
+++ b/ofproto/connmgr.h
@@ -85,7 +85,8 @@ 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);
+ const struct ofproto_controller[], size_t n,
+ const struct ofputil_version_bitmap *allowed_versions);
void connmgr_reconnect(const struct connmgr *);
int connmgr_set_snoops(struct connmgr *mgr, const struct shash *snoops);
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index 568f9bb..e363d05 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -480,9 +480,11 @@ 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)
+ size_t n_controllers,
+ const struct ofputil_version_bitmap *allowed_versions)
{
- connmgr_set_controllers(p->connmgr, controllers, n_controllers);
+ connmgr_set_controllers(p->connmgr, controllers, n_controllers,
+ allowed_versions);
}
void
diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h
index 2128e07..cdad2f8 100644
--- a/ofproto/ofproto.h
+++ b/ofproto/ofproto.h
@@ -210,7 +210,8 @@ int ofproto_port_query_by_name(const struct ofproto *, const char *devname,
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);
+ const struct ofproto_controller *, size_t n,
+ const struct ofputil_version_bitmap *allowed_versions);
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 3267fe4..f405872 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -2724,7 +2724,7 @@ bridge_configure_remotes(struct bridge *br,
n_ocs++;
}
- ofproto_set_controllers(br->ofproto, ocs, n_ocs);
+ ofproto_set_controllers(br->ofproto, ocs, n_ocs, &allowed_versions);
free(ocs[0].target); /* From bridge_ofproto_controller_for_mgmt(). */
free(ocs);
--
1.7.10.4
More information about the dev
mailing list