X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-openflowd.c;h=0cd919a696f00fdf2143aa71f9b08acf6b35153b;hb=772ec52b896380f23b587bea4a5bf18edd22449d;hp=818ed79bbb4fb7d9cd23d1543e5bae0511fc7959;hpb=2696c34bfe4a804c6381859946070c40d6349209;p=openvswitch diff --git a/utilities/ovs-openflowd.c b/utilities/ovs-openflowd.c index 818ed79b..0cd919a6 100644 --- a/utilities/ovs-openflowd.c +++ b/utilities/ovs-openflowd.c @@ -57,6 +57,7 @@ struct ofsettings { struct ofproto_controller *controllers; size_t n_controllers; enum ofproto_fail_mode fail_mode; + bool run_forever; /* Continue running even with no controller? */ /* Datapath. */ uint64_t datapath_id; /* Datapath ID. */ @@ -81,6 +82,8 @@ struct ofsettings { struct svec netflow; /* NetFlow targets. */ }; +static unixctl_cb_func ovs_openflowd_exit; + static void parse_options(int argc, char *argv[], struct ofsettings *); static void usage(void) NO_RETURN; @@ -93,6 +96,7 @@ main(int argc, char *argv[]) int error; struct dpif *dpif; struct netflow_options nf_options; + bool exiting; proctitle_init(argc, argv); set_program_name(argv[0]); @@ -108,6 +112,8 @@ main(int argc, char *argv[]) exit(EXIT_FAILURE); } + unixctl_command_register("exit", ovs_openflowd_exit, &exiting); + VLOG_INFO("Open vSwitch version %s", VERSION BUILDNR); VLOG_INFO("OpenFlow protocol version 0x%02x", OFP_VERSION); @@ -122,10 +128,19 @@ main(int argc, char *argv[]) size_t i; SVEC_FOR_EACH (i, port, &s.ports) { - error = dpif_port_add(dpif, port, 0, NULL); + struct netdev *netdev; + + error = netdev_open_default(port, &netdev); + if (error) { + ovs_fatal(error, "%s: failed to open network device", port); + } + + error = dpif_port_add(dpif, netdev, NULL); if (error) { ovs_fatal(error, "failed to add %s as a port", port); } + + netdev_close(netdev); } } @@ -155,7 +170,8 @@ main(int argc, char *argv[]) daemonize_complete(); - while (ofproto_is_alive(ofproto)) { + exiting = false; + while (!exiting && (s.run_forever || ofproto_is_alive(ofproto))) { error = ofproto_run(ofproto); if (error) { ovs_fatal(error, "unrecoverable datapath error"); @@ -168,6 +184,9 @@ main(int argc, char *argv[]) unixctl_server_wait(unixctl); dp_wait(); netdev_wait(); + if (exiting) { + poll_immediate_wake(); + } poll_block(); } @@ -175,6 +194,15 @@ main(int argc, char *argv[]) return 0; } + +static void +ovs_openflowd_exit(struct unixctl_conn *conn, const char *args OVS_UNUSED, + void *exiting_) +{ + bool *exiting = exiting_; + *exiting = true; + unixctl_command_reply(conn, 200, NULL); +} /* User interface. */ @@ -459,12 +487,17 @@ parse_options(int argc, char *argv[], struct ofsettings *s) dp_parse_name(argv[0], &s->dp_name, &s->dp_type); /* Figure out controller names. */ + s->run_forever = false; if (!controllers.n) { svec_add_nocopy(&controllers, xasprintf("punix:%s/%s.mgmt", ovs_rundir(), s->dp_name)); } for (i = 1; i < argc; i++) { - svec_add(&controllers, argv[i]); + if (!strcmp(argv[i], "none")) { + s->run_forever = true; + } else { + svec_add(&controllers, argv[i]); + } } if (argc < 2) { svec_add(&controllers, "discover"); @@ -493,8 +526,9 @@ static void usage(void) { printf("%s: an OpenFlow switch implementation.\n" - "usage: %s [OPTIONS] DATAPATH [CONTROLLER...]\n" - "DATAPATH is a local datapath (e.g. \"dp0\").\n" + "usage: %s [OPTIONS] [TYPE@]DATAPATH [CONTROLLER...]\n" + "where DATAPATH is a local datapath (e.g. \"dp0\")\n" + "optionally with an explicit TYPE (default: \"system\").\n" "Each CONTROLLER is an active OpenFlow connection method. If\n" "none is given, ovs-openflowd performs controller discovery.\n", program_name, program_name);