From 882c2399908b0f33f73651ccfc3aaf76a7858ce4 Mon Sep 17 00:00:00 2001 From: Justin Pettit Date: Wed, 28 Jul 2010 15:18:25 -0700 Subject: [PATCH] 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. --- utilities/ovs-controller.8.in | 7 +++++++ utilities/ovs-controller.c | 25 ++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/utilities/ovs-controller.8.in b/utilities/ovs-controller.8.in index ab636772a..c5954dd00 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 bacb0b395..42431bb08 100644 --- a/utilities/ovs-controller.c +++ b/utilities/ovs-controller.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #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"); -- 2.43.0