On Mon, Nov 12, 2012 at 10:23:00AM -0800, Ben Pfaff wrote: > On Wed, Nov 07, 2012 at 05:03:05PM +0900, Simon Horman wrote: > > Versions may be configured using a comma delimited list as > > the value for 'openflow-versions' the 'other-config' column > > of the Bridge table. > > > > Currently list elements other than 'OpenFlow10' and 'OpenFlow12' will > > be ignored. > > > > If the list 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 <ho...@verge.net.au> > > This seems to me like core enough functionality that we should add a new > column for it. I suggest "protocols" as the name and that it should be > a set of strings, one protocol name per string, with a default used if > the set is empty.
That sounds reasonable to me. ---------------------------------------------------------------- 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 <ho...@verge.net.au> --- v5 * As suggested by Ben Pfaff - Use a protocols rather than other-config columb v4 * Rebase --- lib/ofp-util.c | 12 ++++++++++++ lib/ofp-util.h | 1 + vswitchd/bridge.c | 16 +++++++++++++++- vswitchd/vswitch.ovsschema | 8 ++++++-- vswitchd/vswitch.xml | 7 +++++++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 7979750..e850dd0 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -897,6 +897,18 @@ 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--) { + bitmap |= 1u << ofputil_version_from_string(s[count]); + } + + 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 0be5a39..c326ffb 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -125,6 +125,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/vswitchd/bridge.c b/vswitchd/bridge.c index 9fe7750..d7bd4f8 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" @@ -812,6 +813,18 @@ bridge_configure_datapath_id(struct bridge *br) free(dpid_string); } +/* Pick local port hardware address and datapath ID for 'br'. */ +static uint32_t +bridge_get_allowed_versions(struct bridge *br) +{ + VLOG_WARN("%s: %zd\n", __func__, br->cfg->n_protocols); + 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) @@ -2797,7 +2810,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 1234488..fd2bb4b 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 602e687..a410dd8 100644 --- a/vswitchd/vswitch.xml +++ b/vswitchd/vswitch.xml @@ -453,6 +453,13 @@ QoS configured, or if the port does not have a queue with the specified ID, the default queue is used instead. </column> + + <column name="protocols"> + List of OpenFlow protocols that may be used when negotiating + a connection with a controller. Valid element values are + 'OpenFlow10' and 'OpenFlow12'. A default value of 'OpenFlow10' + will be used if this column is empty. + </column> </group> <group title="Spanning Tree Configuration"> -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev