X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fovs-openflowd.c;h=0cd919a696f00fdf2143aa71f9b08acf6b35153b;hb=c18ea70d06e980dc768166881c5aeac0b3491561;hp=5ed32683929bdb443b9fce76be02759855a5f044;hpb=6de8d6bbd063e3a9b2649c854f23461547dd9c03;p=openvswitch diff --git a/utilities/ovs-openflowd.c b/utilities/ovs-openflowd.c index 5ed32683..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");