From 7beaa082d7f422dda337780d6dd457b9a5ffe7d5 Mon Sep 17 00:00:00 2001 From: Simon Horman Date: Mon, 19 Nov 2012 14:59:30 +0900 Subject: [PATCH] vswitchd: Configuration of allowed OpenFlow versions Versions may be configured using the protocols column of the bridge table. The protocols column is a set which accepts zero or more of the values: 'OpenFlow10' and 'OpenFlow12'. If the protocols column is empty, then OpenFlow10 is used. This default is consistent with the behaviour of ovs-vswtichd prior to this patch. Signed-off-by: Simon Horman [blp@nicira.com adjusted comments and documentation] Signed-off-by: Ben Pfaff --- lib/ofp-util.c | 26 +++++++++++++++++++++++--- lib/ofp-util.h | 1 + tests/ovs-vsctl.at | 2 ++ vswitchd/bridge.c | 16 +++++++++++++++- vswitchd/vswitch.ovsschema | 8 ++++++-- vswitchd/vswitch.xml | 6 ++++++ 6 files changed, 53 insertions(+), 6 deletions(-) diff --git a/lib/ofp-util.c b/lib/ofp-util.c index d4c240da..1a9d6110 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -847,7 +847,7 @@ ofputil_protocols_from_string(const char *s) return protocols; } -static enum ofp_version +static int ofputil_version_from_string(const char *s) { if (!strcasecmp(s, "OpenFlow10")) { @@ -859,7 +859,7 @@ ofputil_version_from_string(const char *s) if (!strcasecmp(s, "OpenFlow12")) { return OFP12_VERSION; } - VLOG_FATAL("Unknown OpenFlow version: \"%s\"", s); + return 0; } static bool @@ -876,7 +876,7 @@ ofputil_versions_from_string(const char *s) while (s[i]) { size_t j; - enum ofp_version version; + int version; char *key; if (is_delimiter(s[i])) { @@ -889,6 +889,9 @@ ofputil_versions_from_string(const char *s) } key = xmemdup0(s + i, j); version = ofputil_version_from_string(key); + if (!version) { + VLOG_FATAL("Unknown OpenFlow version: \"%s\"", key); + } free(key); bitmap |= 1u << version; i += j; @@ -897,6 +900,23 @@ ofputil_versions_from_string(const char *s) return bitmap; } +uint32_t +ofputil_versions_from_strings(char ** const s, size_t count) +{ + uint32_t bitmap = 0; + + while (count--) { + int version = ofputil_version_from_string(s[count]); + if (!version) { + VLOG_WARN("Unknown OpenFlow version: \"%s\"", s[count]); + } else { + bitmap |= 1u << version; + } + } + + return bitmap; +} + const char * ofputil_version_to_string(enum ofp_version ofp_version) { diff --git a/lib/ofp-util.h b/lib/ofp-util.h index d87554de..053cd843 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -140,6 +140,7 @@ enum ofputil_protocol ofputil_protocols_from_string(const char *s); const char *ofputil_version_to_string(enum ofp_version ofp_version); uint32_t ofputil_versions_from_string(const char *s); +uint32_t ofputil_versions_from_strings(char ** const s, size_t count); bool ofputil_decode_hello(const struct ofp_header *, uint32_t *allowed_versions); diff --git a/tests/ovs-vsctl.at b/tests/ovs-vsctl.at index cc1fd4e8..4d4ce10b 100644 --- a/tests/ovs-vsctl.at +++ b/tests/ovs-vsctl.at @@ -587,6 +587,7 @@ name : "br0" netflow : [] other_config : {} ports : [] +protocols : [] sflow : [] status : {} stp_enable : false @@ -1042,6 +1043,7 @@ name : "br0" netflow : [] other_config : {} ports : [] +protocols : [] sflow : [] status : {} stp_enable : false diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 316ecc75..d1e24d0e 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -36,6 +36,7 @@ #include "meta-flow.h" #include "netdev.h" #include "ofp-print.h" +#include "ofp-util.h" #include "ofpbuf.h" #include "ofproto/ofproto.h" #include "poll-loop.h" @@ -814,6 +815,18 @@ bridge_configure_datapath_id(struct bridge *br) free(dpid_string); } +/* Returns a bitmap of "enum ofputil_protocol"s that are allowed for use with + * 'br'. */ +static uint32_t +bridge_get_allowed_versions(struct bridge *br) +{ + if (!br->cfg->n_protocols) + return 0; + + return ofputil_versions_from_strings(br->cfg->protocols, + br->cfg->n_protocols); +} + /* Set NetFlow configuration on 'br'. */ static void bridge_configure_netflow(struct bridge *br) @@ -2800,7 +2813,8 @@ bridge_configure_remotes(struct bridge *br, n_ocs++; } - ofproto_set_controllers(br->ofproto, ocs, n_ocs, 0); + 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); diff --git a/vswitchd/vswitch.ovsschema b/vswitchd/vswitch.ovsschema index 12344889..fd2bb4bf 100644 --- a/vswitchd/vswitch.ovsschema +++ b/vswitchd/vswitch.ovsschema @@ -1,6 +1,6 @@ {"name": "Open_vSwitch", - "version": "6.11.0", - "cksum": "3699219253 17163", + "version": "6.11.1", + "cksum": "2684374538 17324", "tables": { "Open_vSwitch": { "columns": { @@ -74,6 +74,10 @@ "type": {"key": {"type": "uuid", "refTable": "Controller"}, "min": 0, "max": "unlimited"}}, + "protocols": { + "type": {"key": {"type": "string", + "enum": ["set", ["OpenFlow10", "OpenFlow12"]]}, + "min": 0, "max": "unlimited"}}, "fail_mode": { "type": {"key": {"type": "string", "enum": ["set", ["standalone", "secure"]]}, diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index 602e6871..c9d0dc43 100644 --- a/vswitchd/vswitch.xml +++ b/vswitchd/vswitch.xml @@ -453,6 +453,12 @@ QoS configured, or if the port does not have a queue with the specified ID, the default queue is used instead. + + + List of OpenFlow protocols that may be used when negotiating a + connection with a controller. A default value of + OpenFlow10 will be used if this column is empty. + -- 2.30.2