X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=controller%2Fcontroller.c;h=775e905c41cbc514a452d38fa9b903b1b798370c;hb=5549180a542fa7aa17a196d55b2f5eb4cbb3159a;hp=61a550a41c821a2316ef5d8bb7af152d8b765086;hpb=be25fa83e8f65d92b853bd20a3d1a594af352b92;p=sliver-openvswitch.git diff --git a/controller/controller.c b/controller/controller.c index 61a550a41..775e905c4 100644 --- a/controller/controller.c +++ b/controller/controller.c @@ -36,18 +36,20 @@ #include #include #include +#include #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" +#include "timeval.h" #include "util.h" #include "vconn-ssl.h" #include "vconn.h" @@ -89,8 +91,10 @@ main(int argc, char *argv[]) set_program_name(argv[0]); register_fault_handlers(); + time_init(); vlog_init(); parse_options(argc, argv); + signal(SIGPIPE, SIG_IGN); if (argc - optind < 1) { fatal(0, "at least one vconn argument required; use --help for usage"); @@ -129,6 +133,7 @@ main(int argc, char *argv[]) fatal(0, "no active or passive switch connections"); } + die_if_already_running(); daemonize(); while (n_switches > 0 || n_listeners > 0) { @@ -195,7 +200,7 @@ main(int argc, char *argv[]) static void new_switch(struct switch_ *sw, struct vconn *vconn, const char *name) { - sw->rconn = rconn_new_from_vconn(name, 128, vconn); + sw->rconn = rconn_new_from_vconn(name, vconn); sw->lswitch = lswitch_create(sw->rconn, learn_macs, setup_flows ? max_idle : -1); } @@ -204,14 +209,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); @@ -227,6 +232,7 @@ parse_options(int argc, char *argv[]) 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}, @@ -256,6 +262,10 @@ parse_options(int argc, char *argv[]) set_pidfile(optarg); break; + case 'f': + ignore_existing_pidfile(); + break; + case 'H': learn_macs = false; break; @@ -310,6 +320,7 @@ usage(void) 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"