aboutsummaryrefslogtreecommitdiff
path: root/utilities
diff options
context:
space:
mode:
authorSimon Horman <horms@verge.net.au>2012-11-19 14:59:32 +0900
committerBen Pfaff <blp@nicira.com>2012-11-29 08:02:25 -0800
commita53a8efa2f88d1e1d44617b6c037144c6eadd2c7 (patch)
treeeb24b48d52b2b6c72727220e8b8e5447b6f8d386 /utilities
parentb060d38039759f71391c27ba251b663404163283 (diff)
ovs-ofctl: Add option to set allowed OpenFlow versions
--protocols 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', 'OpenFlow13', Values may be combined in a comma delimited list. e.g.: --protocols 'OpenFlow10,OpenFlow12,OpenFlow13' Signed-off-by: Simon Horman <horms@verge.net.au> Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'utilities')
-rw-r--r--utilities/ovs-ofctl.8.in2
-rw-r--r--utilities/ovs-ofctl.c53
2 files changed, 32 insertions, 23 deletions
diff --git a/utilities/ovs-ofctl.8.in b/utilities/ovs-ofctl.8.in
index 7b6939f2..5e70dba5 100644
--- a/utilities/ovs-ofctl.8.in
+++ b/utilities/ovs-ofctl.8.in
@@ -1343,6 +1343,8 @@ passing through the flow.
\fB\-\-strict\fR
Uses strict matching when running flow modification commands.
.
+.so lib/ofp-version.man
+.
.IP "\fB\-F \fIformat\fR[\fB,\fIformat\fR...]"
.IQ "\fB\-\-flow\-format=\fIformat\fR[\fB,\fIformat\fR...]"
\fBovs\-ofctl\fR supports the following individual flow formats, any
diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
index 50373986..101ce807 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"
@@ -147,6 +148,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[] = {
@@ -160,8 +162,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},
@@ -210,10 +212,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;
@@ -235,6 +233,7 @@ parse_options(int argc, char *argv[])
break;
DAEMON_OPTION_HANDLERS
+ OFP_VERSION_OPTION_HANDLERS
VLOG_OPTION_HANDLERS
STREAM_SSL_OPTION_HANDLERS
@@ -292,6 +291,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"
@@ -339,7 +339,8 @@ open_vconn_socket(const char *name, struct vconn **vconnp)
char *vconn_name = xasprintf("unix:%s", name);
int error;
- error = vconn_open(vconn_name, 0, vconnp, DSCP_DEFAULT);
+ error = vconn_open(vconn_name, get_allowed_ofp_versions(), vconnp,
+ DSCP_DEFAULT);
if (error && error != ENOENT) {
ovs_fatal(0, "%s: failed to open socket (%s)", name,
strerror(error));
@@ -368,7 +369,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 (!open_vconn_socket(name, vconnp)) {
/* Fall Through. */
} else if (!open_vconn_socket(bridge_path, vconnp)) {
@@ -412,25 +414,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
@@ -534,7 +538,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));
@@ -553,7 +558,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);
@@ -568,15 +573,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
@@ -586,6 +591,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
@@ -615,8 +621,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);
@@ -1621,8 +1628,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);
@@ -1676,8 +1683,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);