Skip to content

Commit

Permalink
ovs-ofctl: Add option to set allowed OpenFlow versions
Browse files Browse the repository at this point in the history
--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 <[email protected]>
Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
horms authored and blp committed Nov 29, 2012
1 parent b060d38 commit a53a8ef
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 23 deletions.
2 changes: 2 additions & 0 deletions manpages.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 2 additions & 0 deletions utilities/ovs-ofctl.8.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
53 changes: 30 additions & 23 deletions utilities/ovs-ofctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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[] = {
Expand All @@ -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},
Expand Down Expand Up @@ -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;
Expand All @@ -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

Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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));

Expand All @@ -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);
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit a53a8ef

Please sign in to comment.