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 <ho...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev