[ovs-dev] [PATCH 3/9] vswitchd: Configuration of allowed OpenFlow versions

Simon Horman horms at verge.net.au
Fri Nov 16 02:22:43 UTC 2012


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 <horms at verge.net.au>

---

v5
* As suggested by Ben Pfaff
  - Use a protocols rather than other-config column

v4
* Rebase
---
 lib/ofp-util.c             |   12 ++++++++++++
 lib/ofp-util.h             |    1 +
 tests/ovs-vsctl.at         |    2 ++
 vswitchd/bridge.c          |   16 +++++++++++++++-
 vswitchd/vswitch.ovsschema |    8 ++++++--
 vswitchd/vswitch.xml       |    7 +++++++
 6 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 32244ce..113932c 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 063df09..3ed3465 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -128,6 +128,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 cc1fd4e..4d4ce10 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 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




More information about the dev mailing list