X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=utilities%2Fovs-controller.c;h=f487d8ce02c41e0a513ec39d2c86771178cfd81d;hb=918f2b827076f3af4ae6c3f0c20b93233947cf4c;hp=b1ba7c32ad0af3fcbaa51f6a09038a18e8c2cd3f;hpb=7a25bd99246a548891427d62ccefb65f765bbc48;p=sliver-openvswitch.git diff --git a/utilities/ovs-controller.c b/utilities/ovs-controller.c index b1ba7c32a..f487d8ce0 100644 --- a/utilities/ovs-controller.c +++ b/utilities/ovs-controller.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ #include "daemon.h" #include "learning-switch.h" #include "ofp-parse.h" +#include "ofp-version-opt.h" #include "ofpbuf.h" #include "openflow/openflow.h" #include "poll-loop.h" @@ -82,6 +83,7 @@ static struct simap port_queues = SIMAP_INITIALIZER(&port_queues); /* --with-flows: Flows to send to switch. */ static struct ofputil_flow_mod *default_flows; static size_t n_default_flows; +static enum ofputil_protocol usable_protocols; /* --unixctl: Name of unixctl socket, or null to use the default. */ static char *unixctl_path = NULL; @@ -115,7 +117,8 @@ main(int argc, char *argv[]) const char *name = argv[i]; struct vconn *vconn; - retval = vconn_open(name, 0, &vconn, DSCP_DEFAULT); + retval = vconn_open(name, get_allowed_ofp_versions(), DSCP_DEFAULT, + &vconn); if (!retval) { if (n_switches >= MAX_SWITCHES) { ovs_fatal(0, "max %d switch connections", n_switches); @@ -124,7 +127,8 @@ main(int argc, char *argv[]) continue; } else if (retval == EAFNOSUPPORT) { struct pvconn *pvconn; - retval = pvconn_open(name, 0, &pvconn, DSCP_DEFAULT); + retval = pvconn_open(name, get_allowed_ofp_versions(), + DSCP_DEFAULT, &pvconn); if (!retval) { if (n_listeners >= MAX_LISTENERS) { ovs_fatal(0, "max %d passive connections", n_listeners); @@ -133,7 +137,7 @@ main(int argc, char *argv[]) } } if (retval) { - VLOG_ERR("%s: connect: %s", name, strerror(retval)); + VLOG_ERR("%s: connect: %s", name, ovs_strerror(retval)); } } if (n_switches == 0 && n_listeners == 0) { @@ -203,7 +207,7 @@ new_switch(struct switch_ *sw, struct vconn *vconn) struct lswitch_config cfg; struct rconn *rconn; - rconn = rconn_create(60, 0, DSCP_DEFAULT); + rconn = rconn_create(60, 0, DSCP_DEFAULT, get_allowed_ofp_versions()); rconn_connect_unreliably(rconn, vconn, NULL); cfg.mode = (action_normal ? LSW_NORMAL @@ -213,6 +217,7 @@ new_switch(struct switch_ *sw, struct vconn *vconn) cfg.max_idle = set_up_flows ? max_idle : -1; cfg.default_flows = default_flows; cfg.n_default_flows = n_default_flows; + cfg.usable_protocols = usable_protocols; cfg.default_queue = default_queue; cfg.port_queues = &port_queues; cfg.mute = mute; @@ -249,9 +254,10 @@ parse_options(int argc, char *argv[]) OPT_WITH_FLOWS, OPT_UNIXCTL, VLOG_OPTION_ENUMS, - DAEMON_OPTION_ENUMS + DAEMON_OPTION_ENUMS, + OFP_VERSION_OPTION_ENUMS }; - static struct option long_options[] = { + static const struct option long_options[] = { {"hub", no_argument, NULL, 'H'}, {"noflow", no_argument, NULL, 'n'}, {"normal", no_argument, NULL, 'N'}, @@ -263,8 +269,8 @@ parse_options(int argc, char *argv[]) {"with-flows", required_argument, NULL, OPT_WITH_FLOWS}, {"unixctl", required_argument, NULL, OPT_UNIXCTL}, {"help", no_argument, NULL, 'h'}, - {"version", no_argument, NULL, 'V'}, DAEMON_LONG_OPTIONS, + OFP_VERSION_LONG_OPTIONS, VLOG_LONG_OPTIONS, STREAM_SSL_LONG_OPTIONS, {"peer-ca-cert", required_argument, NULL, OPT_PEER_CA_CERT}, @@ -274,6 +280,7 @@ parse_options(int argc, char *argv[]) for (;;) { int indexptr; + char *error; int c; c = getopt_long(argc, argv, short_options, long_options, &indexptr); @@ -323,8 +330,12 @@ parse_options(int argc, char *argv[]) break; case OPT_WITH_FLOWS: - parse_ofp_flow_mod_file(optarg, OFPFC_ADD, &default_flows, - &n_default_flows); + error = parse_ofp_flow_mod_file(optarg, OFPFC_ADD, &default_flows, + &n_default_flows, + &usable_protocols); + if (error) { + ovs_fatal(0, "%s", error); + } break; case OPT_UNIXCTL: @@ -334,11 +345,8 @@ parse_options(int argc, char *argv[]) case 'h': usage(); - case 'V': - ovs_print_version(OFP10_VERSION, OFP10_VERSION); - exit(EXIT_SUCCESS); - VLOG_OPTION_HANDLERS + OFP_VERSION_OPTION_HANDLERS DAEMON_OPTION_HANDLERS STREAM_SSL_OPTION_HANDLERS @@ -380,6 +388,7 @@ usage(void) program_name, program_name); vconn_usage(true, true, false); daemon_usage(); + ofp_version_usage(); vlog_usage(); printf("\nOther options:\n" " -H, --hub act as hub instead of learning switch\n"