aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Pettit <jpettit@nicira.com>2010-07-28 15:18:25 -0700
committerJustin Pettit <jpettit@nicira.com>2010-07-30 00:05:33 -0700
commit882c2399908b0f33f73651ccfc3aaf76a7858ce4 (patch)
tree2d0b515ac09b8dd1d1d182737ce0eaa9e804347f
parentaaaa7553a9b7fef47436e96fb0177981b09e4a83 (diff)
ovs-controller: Add ability to define default flows
Add support for the --with-flows option, which allows default flows to be read from a file and pushed to connecting switches.
-rw-r--r--utilities/ovs-controller.8.in7
-rw-r--r--utilities/ovs-controller.c25
2 files changed, 31 insertions, 1 deletions
diff --git a/utilities/ovs-controller.8.in b/utilities/ovs-controller.8.in
index ab636772..c5954dd0 100644
--- a/utilities/ovs-controller.8.in
+++ b/utilities/ovs-controller.8.in
@@ -100,6 +100,12 @@ instead use that specific queue.
.IP
This option may be useful for debugging quality of service setups.
.
+.IP "\fB\-\-with\-flows \fIfile\fR"
+When a switch connects, push the flow entries as described in
+\fIfile\fR. Each line in \fIfile\fR is a flow entry in the format
+described for the \fBadd\-flows\fR command in the \fBFlow Syntax\fR
+section of the \fBovs\-ofctl\fR(8) man page.
+.
.SS "Public Key Infrastructure Options"
.so lib/ssl.man
.so lib/ssl-peer-ca-cert.man
@@ -133,4 +139,5 @@ connection and set the controller, e.g.:
.
.BR ovs\-openflowd (8),
.BR ovs\-appctl (8),
+.BR ovs\-ofctl (8),
.BR ovs\-dpctl (8)
diff --git a/utilities/ovs-controller.c b/utilities/ovs-controller.c
index bacb0b39..42431bb0 100644
--- a/utilities/ovs-controller.c
+++ b/utilities/ovs-controller.c
@@ -21,6 +21,7 @@
#include <limits.h>
#include <signal.h>
#include <stdlib.h>
+#include <stdio.h>
#include <string.h>
#include "command-line.h"
@@ -70,6 +71,10 @@ static bool mute = false;
/* -q, --queue: OpenFlow queue to use, or the default queue if UINT32_MAX. */
static uint32_t queue_id = UINT32_MAX;
+/* --with-flows: File with flows to send to switch, or null to not load
+ * any default flows. */
+static FILE *flow_file = NULL;
+
/* --unixctl: Name of unixctl socket, or null to use the default. */
static char *unixctl_path = NULL;
@@ -213,9 +218,17 @@ new_switch(struct switch_ *sw, struct vconn *vconn)
{
sw->rconn = rconn_create(60, 0);
rconn_connect_unreliably(sw->rconn, vconn, NULL);
+
+ /* If it was set, rewind 'flow_file' to the beginning, since a
+ * previous call to lswitch_create() will leave the stream at the
+ * end. */
+ if (flow_file) {
+ rewind(flow_file);
+ }
sw->lswitch = lswitch_create(sw->rconn, learn_macs, exact_flows,
set_up_flows ? max_idle : -1,
- action_normal, NULL);
+ action_normal, flow_file);
+
lswitch_set_queue(sw->lswitch, queue_id);
}
@@ -248,6 +261,7 @@ parse_options(int argc, char *argv[])
OPT_MAX_IDLE = UCHAR_MAX + 1,
OPT_PEER_CA_CERT,
OPT_MUTE,
+ OPT_WITH_FLOWS,
OPT_UNIXCTL,
VLOG_OPTION_ENUMS
};
@@ -259,6 +273,7 @@ parse_options(int argc, char *argv[])
{"max-idle", required_argument, 0, OPT_MAX_IDLE},
{"mute", no_argument, 0, OPT_MUTE},
{"queue", required_argument, 0, 'q'},
+ {"with-flows", required_argument, 0, OPT_WITH_FLOWS},
{"unixctl", required_argument, 0, OPT_UNIXCTL},
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'V'},
@@ -318,6 +333,13 @@ parse_options(int argc, char *argv[])
queue_id = atoi(optarg);
break;
+ case OPT_WITH_FLOWS:
+ flow_file = fopen(optarg, "r");
+ if (flow_file == NULL) {
+ ovs_fatal(errno, "%s: open", optarg);
+ }
+ break;
+
case OPT_UNIXCTL:
unixctl_path = optarg;
break;
@@ -367,6 +389,7 @@ usage(void)
" -N, --normal use OFPAT_NORMAL action\n"
" -w, --wildcard use wildcards, not exact-match rules\n"
" -q, --queue=QUEUE OpenFlow queue ID to use for output\n"
+ " --with-flows FILE use the flows from FILE\n"
" --unixctl=SOCKET override default control socket name\n"
" -h, --help display this help message\n"
" -V, --version display version information\n");