X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=controller%2Fcontroller.c;h=df8ca16bbeac6cf8406dab5172111bca0c10023c;hb=b50bbdf27daa89240b164dd65bcfa21962c2072a;hp=e894cf41535d2be42bd3a44f62586b35c965b592;hpb=9c1b16772cfd8d346be89963ddf6a6d6a87f0cc9;p=sliver-openvswitch.git diff --git a/controller/controller.c b/controller/controller.c index e894cf415..df8ca16bb 100644 --- a/controller/controller.c +++ b/controller/controller.c @@ -40,12 +40,12 @@ #include #include -#include "buffer.h" #include "command-line.h" #include "compiler.h" #include "daemon.h" #include "fault.h" #include "learning-switch.h" +#include "ofpbuf.h" #include "openflow.h" #include "poll-loop.h" #include "rconn.h" @@ -97,12 +97,13 @@ main(int argc, char *argv[]) signal(SIGPIPE, SIG_IGN); if (argc - optind < 1) { - fatal(0, "at least one vconn argument required; use --help for usage"); + ofp_fatal(0, "at least one vconn argument required; " + "use --help for usage"); } retval = vlog_server_listen(NULL, NULL); if (retval) { - fatal(retval, "Could not listen for vlog connections"); + ofp_fatal(retval, "Could not listen for vlog connections"); } n_switches = n_listeners = 0; @@ -114,7 +115,7 @@ main(int argc, char *argv[]) retval = vconn_open(name, OFP_VERSION, &vconn); if (!retval) { if (n_switches >= MAX_SWITCHES) { - fatal(0, "max %d switch connections", n_switches); + ofp_fatal(0, "max %d switch connections", n_switches); } new_switch(&switches[n_switches++], vconn, name); continue; @@ -123,7 +124,7 @@ main(int argc, char *argv[]) retval = pvconn_open(name, &pvconn); if (!retval) { if (n_listeners >= MAX_LISTENERS) { - fatal(0, "max %d passive connections", n_listeners); + ofp_fatal(0, "max %d passive connections", n_listeners); } listeners[n_listeners++] = pvconn; } @@ -133,7 +134,7 @@ main(int argc, char *argv[]) } } if (n_switches == 0 && n_listeners == 0) { - fatal(0, "no active or passive switch connections"); + ofp_fatal(0, "no active or passive switch connections"); } die_if_already_running(); @@ -173,8 +174,8 @@ main(int argc, char *argv[]) } i++; } else { - lswitch_destroy(this->lswitch); rconn_destroy(this->rconn); + lswitch_destroy(this->lswitch); switches[i] = switches[--n_switches]; } } @@ -182,6 +183,10 @@ main(int argc, char *argv[]) break; } } + for (i = 0; i < n_switches; i++) { + struct switch_ *this = &switches[i]; + lswitch_run(this->lswitch, this->rconn); + } /* Wait for something to happen. */ if (n_switches < MAX_SWITCHES) { @@ -193,6 +198,7 @@ main(int argc, char *argv[]) struct switch_ *sw = &switches[i]; rconn_run_wait(sw->rconn); rconn_recv_wait(sw->rconn); + lswitch_wait(sw->lswitch); } poll_block(); } @@ -212,14 +218,14 @@ static int do_switching(struct switch_ *sw) { unsigned int packets_sent; - struct buffer *msg; + struct ofpbuf *msg; packets_sent = rconn_packets_sent(sw->rconn); msg = rconn_recv(sw->rconn); if (msg) { lswitch_process_packet(sw->lswitch, sw->rconn, msg); - buffer_delete(msg); + ofpbuf_delete(msg); } rconn_run(sw->rconn); @@ -231,18 +237,22 @@ do_switching(struct switch_ *sw) static void parse_options(int argc, char *argv[]) { - enum { OPT_MAX_IDLE = UCHAR_MAX + 1 }; + enum { + OPT_MAX_IDLE = UCHAR_MAX + 1, + OPT_PEER_CA_CERT + }; static struct option long_options[] = { - {"detach", no_argument, 0, 'D'}, - {"pidfile", optional_argument, 0, 'P'}, - {"force", no_argument, 0, 'f'}, {"hub", no_argument, 0, 'H'}, {"noflow", no_argument, 0, 'n'}, {"max-idle", required_argument, 0, OPT_MAX_IDLE}, {"verbose", optional_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, + DAEMON_LONG_OPTIONS, +#ifdef HAVE_OPENSSL VCONN_SSL_LONG_OPTIONS + {"peer-ca-cert", required_argument, 0, OPT_PEER_CA_CERT}, +#endif {0, 0, 0, 0}, }; char *short_options = long_options_to_short_options(long_options); @@ -257,18 +267,6 @@ parse_options(int argc, char *argv[]) } switch (c) { - case 'D': - set_detach(); - break; - - case 'P': - set_pidfile(optarg); - break; - - case 'f': - ignore_existing_pidfile(); - break; - case 'H': learn_macs = false; break; @@ -283,8 +281,8 @@ parse_options(int argc, char *argv[]) } else { max_idle = atoi(optarg); if (max_idle < 1 || max_idle > 65535) { - fatal(0, "--max-idle argument must be between 1 and " - "65535 or the word 'permanent'"); + ofp_fatal(0, "--max-idle argument must be between 1 and " + "65535 or the word 'permanent'"); } } break; @@ -300,8 +298,16 @@ parse_options(int argc, char *argv[]) vlog_set_verbosity(optarg); break; + DAEMON_OPTION_HANDLERS + +#ifdef HAVE_OPENSSL VCONN_SSL_OPTION_HANDLERS + case OPT_PEER_CA_CERT: + vconn_ssl_set_peer_ca_cert_file(optarg); + break; +#endif + case '?': exit(EXIT_FAILURE); @@ -319,18 +325,15 @@ usage(void) "usage: %s [OPTIONS] METHOD\n" "where METHOD is any OpenFlow connection method.\n", program_name, program_name); - vconn_usage(true, true); + vconn_usage(true, true, false); + daemon_usage(); printf("\nOther options:\n" - " -D, --detach run in background as daemon\n" - " -P, --pidfile[=FILE] create pidfile (default: %s/controller.pid)\n" - " -f, --force with -P, start even if already running\n" " -H, --hub act as hub instead of learning switch\n" " -n, --noflow pass traffic, but don't add flows\n" " --max-idle=SECS max idle time for new flows\n" " -v, --verbose=MODULE[:FACILITY[:LEVEL]] set logging levels\n" " -v, --verbose set maximum verbosity level\n" " -h, --help display this help message\n" - " -V, --version display version information\n", - RUNDIR); + " -V, --version display version information\n"); exit(EXIT_SUCCESS); }