[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