X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-controller.c;h=022b1a4db98df0895ca7bcfce4b53e5f60402c13;hb=7286b1e13dbf358ea6071d04b311474208308ad6;hp=26a1fc3f5609fab76449afe22dbcda479f88648e;hpb=d4cdc6b4c45e5ca6a44bccf90f856b76ef936fac;p=openvswitch diff --git a/utilities/ovs-controller.c b/utilities/ovs-controller.c index 26a1fc3f..022b1a4d 100644 --- a/utilities/ovs-controller.c +++ b/utilities/ovs-controller.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,7 +41,7 @@ #include "vconn.h" #include "vlog.h" -VLOG_DEFINE_THIS_MODULE(controller) +VLOG_DEFINE_THIS_MODULE(controller); #define MAX_SWITCHES 16 #define MAX_LISTENERS 16 @@ -61,8 +61,9 @@ static bool set_up_flows = true; /* -N, --normal: Use "NORMAL" action instead of explicit port? */ static bool action_normal = false; -/* -w, --wildcard: Set up exact match or wildcard flow entries? */ -static bool exact_flows = true; +/* -w, --wildcard: 0 to disable wildcard flow entries, a OFPFW_* bitmask to + * enable specific wildcards, or UINT32_MAX to use the default wildcards. */ +static uint32_t wildcards = 0; /* --max-idle: Maximum idle time, in seconds, before flows expire. */ static int max_idle = 60; @@ -77,9 +78,9 @@ static uint32_t default_queue = UINT32_MAX; /* -Q, --port-queue: map from port name to port number (cast to void *). */ static struct shash port_queues = SHASH_INITIALIZER(&port_queues); -/* --with-flows: File with flows to send to switch, or null to not load - * any default flows. */ -static struct ovs_queue default_flows = OVS_QUEUE_INITIALIZER; +/* --with-flows: Flows to send to switch, or an empty list not to send any + * default flows. */ +static struct list default_flows = LIST_INITIALIZER(&default_flows); /* --unixctl: Name of unixctl socket, or null to use the default. */ static char *unixctl_path = NULL; @@ -139,7 +140,6 @@ main(int argc, char *argv[]) ovs_fatal(0, "no active or passive switch connections"); } - die_if_already_running(); daemonize_start(); retval = unixctl_server_create(unixctl_path, &unixctl); @@ -228,8 +228,9 @@ new_switch(struct switch_ *sw, struct vconn *vconn) cfg.mode = (action_normal ? LSW_NORMAL : learn_macs ? LSW_LEARN : LSW_FLOOD); + cfg.wildcards = wildcards; cfg.max_idle = set_up_flows ? max_idle : -1; - cfg.default_flows = default_flows.head; + cfg.default_flows = &default_flows; cfg.default_queue = default_queue; cfg.port_queues = &port_queues; sw->lswitch = lswitch_create(sw->rconn, &cfg); @@ -260,7 +261,8 @@ do_switching(struct switch_ *sw) static void read_flow_file(const char *name) { - struct ofpbuf *b; + enum nx_flow_format flow_format; + bool flow_mod_table_id; FILE *stream; stream = fopen(optarg, "r"); @@ -268,8 +270,12 @@ read_flow_file(const char *name) ovs_fatal(errno, "%s: open", name); } - while ((b = parse_ofp_add_flow_file(stream)) != NULL) { - queue_push_tail(&default_flows, b); + flow_format = NXFF_OPENFLOW10; + flow_mod_table_id = false; + while (parse_ofp_flow_mod_file(&default_flows, + &flow_format, &flow_mod_table_id, + stream, OFPFC_ADD)) { + continue; } fclose(stream); @@ -305,28 +311,27 @@ parse_options(int argc, char *argv[]) OPT_MUTE, OPT_WITH_FLOWS, OPT_UNIXCTL, - VLOG_OPTION_ENUMS + VLOG_OPTION_ENUMS, + DAEMON_OPTION_ENUMS }; static struct option long_options[] = { - {"hub", no_argument, 0, 'H'}, - {"noflow", no_argument, 0, 'n'}, - {"normal", no_argument, 0, 'N'}, - {"wildcard", no_argument, 0, 'w'}, - {"max-idle", required_argument, 0, OPT_MAX_IDLE}, - {"mute", no_argument, 0, OPT_MUTE}, - {"queue", required_argument, 0, 'q'}, - {"port-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'}, + {"hub", no_argument, NULL, 'H'}, + {"noflow", no_argument, NULL, 'n'}, + {"normal", no_argument, NULL, 'N'}, + {"wildcards", optional_argument, NULL, 'w'}, + {"max-idle", required_argument, NULL, OPT_MAX_IDLE}, + {"mute", no_argument, NULL, OPT_MUTE}, + {"queue", required_argument, NULL, 'q'}, + {"port-queue", required_argument, NULL, 'Q'}, + {"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, VLOG_LONG_OPTIONS, -#ifdef HAVE_OPENSSL - STREAM_SSL_LONG_OPTIONS - {"peer-ca-cert", required_argument, 0, OPT_PEER_CA_CERT}, -#endif - {0, 0, 0, 0}, + STREAM_SSL_LONG_OPTIONS, + {"peer-ca-cert", required_argument, NULL, OPT_PEER_CA_CERT}, + {NULL, 0, NULL, 0}, }; char *short_options = long_options_to_short_options(long_options); @@ -357,7 +362,7 @@ parse_options(int argc, char *argv[]) break; case 'w': - exact_flows = false; + wildcards = optarg ? strtol(optarg, NULL, 16) : UINT32_MAX; break; case OPT_MAX_IDLE: @@ -398,13 +403,11 @@ parse_options(int argc, char *argv[]) VLOG_OPTION_HANDLERS DAEMON_OPTION_HANDLERS -#ifdef HAVE_OPENSSL STREAM_SSL_OPTION_HANDLERS case OPT_PEER_CA_CERT: stream_ssl_set_peer_ca_cert_file(optarg); break; -#endif case '?': exit(EXIT_FAILURE); @@ -445,7 +448,7 @@ usage(void) " -n, --noflow pass traffic, but don't add flows\n" " --max-idle=SECS max idle time for new flows\n" " -N, --normal use OFPP_NORMAL action\n" - " -w, --wildcard use wildcards, not exact-match rules\n" + " -w, --wildcards[=MASK] wildcard (specified) bits in flows\n" " -q, --queue=QUEUE-ID OpenFlow queue ID to use for output\n" " -Q PORT-NAME:QUEUE-ID use QUEUE-ID for frames from PORT-NAME\n" " --with-flows FILE use the flows from FILE\n"