[ovs-dev] [PATCH 13/17] ovs-ofctl: Add options to allow seting of OpenFlow version

Simon Horman horms at verge.net.au
Thu Oct 4 02:41:28 UTC 2012


--min-ofp-version allows the minimum OpenFlow version to be set.
--max-ofp-version allows the maximum OpenFlow version to be set.
The default for both is OFP10_VERSION which retains the existing
behaviour.

Signed-off-by: Simon Horman <horms at verge.net.au>
---
 manpages.mk              |    2 ++
 utilities/ovs-ofctl.8.in |    1 +
 utilities/ovs-ofctl.c    |   53 ++++++++++++++++++++++++++--------------------
 3 files changed, 33 insertions(+), 23 deletions(-)

diff --git a/manpages.mk b/manpages.mk
index 69f11de..d3ef64b 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 4f62c66..0890030 100644
--- a/utilities/ovs-ofctl.8.in
+++ b/utilities/ovs-ofctl.8.in
@@ -1423,6 +1423,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 40e8139..7388f80 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
 
@@ -245,6 +244,8 @@ parse_options(int argc, char *argv[])
         }
     }
 
+    ofp_version_check();
+
     if (n_criteria) {
         /* Always do a final sort pass based on priority. */
         add_sort_criterion(SORT_DESC, "priority");
@@ -291,6 +292,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"
@@ -336,7 +338,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, OFP10_VERSION, OFP10_VERSION, vconnp),
+    run(vconn_open_block(vconn_name, min_ofp_version, max_ofp_version, vconnp),
         "connecting to %s", vconn_name);
     free(vconn_name);
 }
@@ -360,7 +362,7 @@ open_vconn__(const char *name, const char *default_suffix,
     free(datapath_type);
 
     if (strchr(name, ':')) {
-        run(vconn_open_block(name, OFP10_VERSION, OFP10_VERSION, vconnp),
+        run(vconn_open_block(name, min_ofp_version, max_ofp_version, vconnp),
             "connecting to %s", name);
     } else if (!stat(name, &s) && S_ISSOCK(s.st_mode)) {
         open_vconn_socket(name, vconnp);
@@ -402,25 +404,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 +528,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 +548,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 +563,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 +581,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 +611,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);
 
@@ -1618,8 +1625,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);
@@ -1673,8 +1680,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