[ovs-dev] [PATCH 5/8] ovs-ofctl: Add option to set allowed OpenFlow versions

Simon Horman horms at verge.net.au
Mon Nov 19 05:59:32 UTC 2012


--allowed-ofp-versions allows configuration of the versions
that may be used when establishing an OpenFlow connection.

The default is 'OpenFlow10' which is consistent with
the behaviour prior to this patch.

The useful values at this time are:
'OpenFlow10', 'OpenFlow12' and 'OpenFlow10,OpenFlow12'.

Signed-off-by: Simon Horman <horms at verge.net.au>

---

v4
* Rebase
---
 lib/ofp-version-opt.c    |    5 ++---
 manpages.mk              |    2 ++
 utilities/ovs-ofctl.8.in |    1 +
 utilities/ovs-ofctl.c    |   52 ++++++++++++++++++++++++++--------------------
 4 files changed, 34 insertions(+), 26 deletions(-)

diff --git a/lib/ofp-version-opt.c b/lib/ofp-version-opt.c
index 3a3bde0..8bcd3ed 100644
--- a/lib/ofp-version-opt.c
+++ b/lib/ofp-version-opt.c
@@ -13,7 +13,7 @@ uint32_t
 get_allowed_ofp_versions(void)
 {
     if (!allowed_versions_set) {
-        return ofputil_get_allowed_versions_default();
+        return 0;
     }
     return allowed_versions;
 }
@@ -23,8 +23,7 @@ ofp_version_usage(void)
 {
     struct ds msg = DS_EMPTY_INITIALIZER;
 
-    ofputil_format_version_bitmap_names(&msg,
-                                        ofputil_get_allowed_versions_default());
+    ofputil_format_version_bitmap_names(&msg, OFPUTIL_DEFAULT_VERSIONS);
     printf(
         "\nOpen Flow Version options:\n"
         "  -V, --version           display version information\n"
diff --git a/manpages.mk b/manpages.mk
index c878144..925912d 100644
--- a/manpages.mk
+++ b/manpages.mk
@@ -134,12 +134,14 @@ utilities/ovs-ofctl.8: \
 	utilities/ovs-ofctl.8.in \
 	lib/common.man \
 	lib/daemon.man \
+	lib/ofp-version.man \
 	lib/ssl.man \
 	lib/vconn-active.man \
 	lib/vlog.man
 utilities/ovs-ofctl.8.in:
 lib/common.man:
 lib/daemon.man:
+lib/ofp-version.man:
 lib/ssl.man:
 lib/vconn-active.man:
 lib/vlog.man:
diff --git a/utilities/ovs-ofctl.8.in b/utilities/ovs-ofctl.8.in
index 7b6939f..b2c189e 100644
--- a/utilities/ovs-ofctl.8.in
+++ b/utilities/ovs-ofctl.8.in
@@ -1459,6 +1459,7 @@ These options currently affect only \fBdump\-flows\fR output.
 .so lib/ssl.man
 .so lib/vlog.man
 .so lib/common.man
+.so lib/ofp-version.man
 .
 .SH "RUNTIME MANAGEMENT COMMANDS"
 \fBovs\-appctl\fR(8) can send commands to a running \fBovs\-ofctl\fR
diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
index 6564bdb..b5b5e24 100644
--- a/utilities/ovs-ofctl.c
+++ b/utilities/ovs-ofctl.c
@@ -44,6 +44,7 @@
 #include "ofp-parse.h"
 #include "ofp-print.h"
 #include "ofp-util.h"
+#include "ofp-version-opt.h"
 #include "ofpbuf.h"
 #include "ofproto/ofproto.h"
 #include "openflow/nicira-ext.h"
@@ -146,6 +147,7 @@ parse_options(int argc, char *argv[])
         OPT_SORT,
         OPT_RSORT,
         DAEMON_OPTION_ENUMS,
+        OFP_VERSION_OPTION_ENUMS,
         VLOG_OPTION_ENUMS
     };
     static struct option long_options[] = {
@@ -159,8 +161,8 @@ parse_options(int argc, char *argv[])
         {"sort", optional_argument, NULL, OPT_SORT},
         {"rsort", optional_argument, NULL, OPT_RSORT},
         {"help", no_argument, NULL, 'h'},
-        {"version", no_argument, NULL, 'V'},
         DAEMON_LONG_OPTIONS,
+        OFP_VERSION_LONG_OPTIONS,
         VLOG_LONG_OPTIONS,
         STREAM_SSL_LONG_OPTIONS,
         {NULL, 0, NULL, 0},
@@ -209,10 +211,6 @@ parse_options(int argc, char *argv[])
         case 'h':
             usage();
 
-        case 'V':
-            ovs_print_version(OFP10_VERSION, OFP10_VERSION);
-            exit(EXIT_SUCCESS);
-
         case OPT_STRICT:
             strict = true;
             break;
@@ -234,6 +232,7 @@ parse_options(int argc, char *argv[])
             break;
 
         DAEMON_OPTION_HANDLERS
+        OFP_VERSION_OPTION_HANDLERS
         VLOG_OPTION_HANDLERS
         STREAM_SSL_OPTION_HANDLERS
 
@@ -291,6 +290,7 @@ usage(void)
            program_name, program_name);
     vconn_usage(true, false, false);
     daemon_usage();
+    ofp_version_usage();
     vlog_usage();
     printf("\nOther options:\n"
            "  --strict                    use strict match for flow commands\n"
@@ -337,7 +337,7 @@ open_vconn_socket(const char *name, struct vconn **vconnp)
 {
     char *vconn_name = xasprintf("unix:%s", name);
     VLOG_DBG("connecting to %s", vconn_name);
-    run(vconn_open_block(vconn_name, 0, vconnp),
+    run(vconn_open_block(vconn_name, get_allowed_ofp_versions(),  vconnp),
         "connecting to %s", vconn_name);
     free(vconn_name);
 }
@@ -361,7 +361,8 @@ open_vconn__(const char *name, const char *default_suffix,
     free(datapath_type);
 
     if (strchr(name, ':')) {
-        run(vconn_open_block(name, 0, vconnp), "connecting to %s", name);
+        run(vconn_open_block(name, get_allowed_ofp_versions(), vconnp),
+            "connecting to %s", name);
     } else if (!stat(name, &s) && S_ISSOCK(s.st_mode)) {
         open_vconn_socket(name, vconnp);
     } else if (!stat(bridge_path, &s) && S_ISSOCK(s.st_mode)) {
@@ -402,25 +403,27 @@ send_openflow_buffer(struct vconn *vconn, struct ofpbuf *buffer)
 }
 
 static void
-dump_transaction(const char *vconn_name, struct ofpbuf *request)
+dump_transaction(struct vconn *vconn, struct ofpbuf *request)
 {
-    struct vconn *vconn;
     struct ofpbuf *reply;
 
     ofpmsg_update_length(request);
-    open_vconn(vconn_name, &vconn);
-    run(vconn_transact(vconn, request, &reply), "talking to %s", vconn_name);
+    run(vconn_transact(vconn, request, &reply), "talking to %s",
+        vconn_get_name(vconn));
     ofp_print(stdout, reply->data, reply->size, verbosity + 1);
     ofpbuf_delete(reply);
-    vconn_close(vconn);
 }
 
 static void
 dump_trivial_transaction(const char *vconn_name, enum ofpraw raw)
 {
     struct ofpbuf *request;
-    request = ofpraw_alloc(raw, OFP10_VERSION, 0);
-    dump_transaction(vconn_name, request);
+    struct vconn *vconn;
+
+    open_vconn(vconn_name, &vconn);
+    request = ofpraw_alloc(raw, vconn_get_version(vconn), 0);
+    dump_transaction(vconn, request);
+    vconn_close(vconn);
 }
 
 static void
@@ -524,7 +527,8 @@ fetch_switch_config(struct vconn *vconn, struct ofp_switch_config *config_)
     struct ofpbuf *reply;
     enum ofptype type;
 
-    request = ofpraw_alloc(OFPRAW_OFPT_GET_CONFIG_REQUEST, OFP10_VERSION, 0);
+    request = ofpraw_alloc(OFPRAW_OFPT_GET_CONFIG_REQUEST,
+                           vconn_get_version(vconn), 0);
     run(vconn_transact(vconn, request, &reply),
         "talking to %s", vconn_get_name(vconn));
 
@@ -543,7 +547,7 @@ set_switch_config(struct vconn *vconn, const struct ofp_switch_config *config)
 {
     struct ofpbuf *request;
 
-    request = ofpraw_alloc(OFPRAW_OFPT_SET_CONFIG, OFP10_VERSION, 0);
+    request = ofpraw_alloc(OFPRAW_OFPT_SET_CONFIG, vconn_get_version(vconn), 0);
     ofpbuf_put(request, config, sizeof *config);
 
     transact_noreply(vconn, request);
@@ -558,15 +562,15 @@ ofctl_show(int argc OVS_UNUSED, char *argv[])
     struct ofpbuf *reply;
     bool trunc;
 
-    request = ofpraw_alloc(OFPRAW_OFPT_FEATURES_REQUEST, OFP10_VERSION, 0);
     open_vconn(vconn_name, &vconn);
+    request = ofpraw_alloc(OFPRAW_OFPT_FEATURES_REQUEST,
+                           vconn_get_version(vconn), 0);
     run(vconn_transact(vconn, request, &reply), "talking to %s", vconn_name);
 
     trunc = ofputil_switch_features_ports_trunc(reply);
     ofp_print(stdout, reply->data, reply->size, verbosity + 1);
 
     ofpbuf_delete(reply);
-    vconn_close(vconn);
 
     if (trunc) {
         /* The Features Reply may not contain all the ports, so send a
@@ -576,6 +580,7 @@ ofctl_show(int argc OVS_UNUSED, char *argv[])
                                        OFPRAW_OFPST_PORT_DESC_REQUEST);
     }
     dump_trivial_transaction(vconn_name, OFPRAW_OFPT_GET_CONFIG_REQUEST);
+    vconn_close(vconn);
 }
 
 static void
@@ -605,8 +610,9 @@ fetch_port_by_features(const char *vconn_name,
     bool found = false;
 
     /* Fetch the switch's ofp_switch_features. */
-    request = ofpraw_alloc(OFPRAW_OFPT_FEATURES_REQUEST, OFP10_VERSION, 0);
     open_vconn(vconn_name, &vconn);
+    request = ofpraw_alloc(OFPRAW_OFPT_FEATURES_REQUEST,
+                           vconn_get_version(vconn), 0);
     run(vconn_transact(vconn, request, &reply), "talking to %s", vconn_name);
     vconn_close(vconn);
 
@@ -1615,8 +1621,8 @@ ofctl_ping(int argc, char *argv[])
         const struct ofp_header *rpy_hdr;
         enum ofptype type;
 
-        request = ofpraw_alloc(OFPRAW_OFPT_ECHO_REQUEST, OFP10_VERSION,
-                               payload);
+        request = ofpraw_alloc(OFPRAW_OFPT_ECHO_REQUEST,
+                               vconn_get_version(vconn), payload);
         random_bytes(ofpbuf_put_uninit(request, payload), payload);
 
         xgettimeofday(&start);
@@ -1670,8 +1676,8 @@ ofctl_benchmark(int argc OVS_UNUSED, char *argv[])
     for (i = 0; i < count; i++) {
         struct ofpbuf *request, *reply;
 
-        request = ofpraw_alloc(OFPRAW_OFPT_ECHO_REQUEST, OFP10_VERSION,
-                               payload_size);
+        request = ofpraw_alloc(OFPRAW_OFPT_ECHO_REQUEST,
+                               vconn_get_version(vconn), payload_size);
         ofpbuf_put_zeros(request, payload_size);
         run(vconn_transact(vconn, request, &reply), "transact");
         ofpbuf_delete(reply);
-- 
1.7.10.4




More information about the dev mailing list