int main(int argc, char *argv[]) { struct rconn *rconn; int error; set_program_name(argv[0]); register_fault_handlers(); time_init(); vlog_init(); parse_options(argc, argv); signal(SIGPIPE, SIG_IGN); if (argc - optind != 1) { ofp_fatal(0, "missing controller argument; use --help for usage"); } rconn = rconn_create(60, max_backoff); error = rconn_connect(rconn, argv[optind]); if (error == EAFNOSUPPORT) { ofp_fatal(0, "no support for %s vconn", argv[optind]); } error = dp_new(&dp, dpid, rconn); if (listen_pvconn_name) { struct pvconn *listen_pvconn; int retval; retval = pvconn_open(listen_pvconn_name, &listen_pvconn); if (retval && retval != EAGAIN) { ofp_fatal(retval, "opening %s", listen_pvconn_name); } dp_add_listen_pvconn(dp, listen_pvconn); } if (error) { ofp_fatal(error, "could not create datapath"); } if (port_list) { add_ports(dp, port_list); } die_if_already_running(); daemonize(); error = vlog_server_listen(NULL, NULL); if (error) { ofp_fatal(error, "could not listen for vlog connections"); } for (;;) { dp_run(dp); dp_wait(dp); poll_block(); } return 0; }
int udatapath_cmd(int argc, char *argv[]) { int n_listeners; int error; int i; set_program_name(argv[0]); register_fault_handlers(); time_init(); vlog_init(); dp = dp_new(); parse_options(dp, argc, argv); signal(SIGPIPE, SIG_IGN); if (argc - optind < 1) { OFP_FATAL(0, "at least one listener argument is required; " "use --help for usage"); } if (use_multiple_connections && (argc - optind) % 2 != 0) OFP_FATAL(0, "when using multiple connections, you must specify an even number of listeners"); n_listeners = 0; for (i = optind; i < argc; i += 2) { const char *pvconn_name = argv[i]; const char *pvconn_name_aux = NULL; if (use_multiple_connections) pvconn_name_aux = argv[i + 1]; struct pvconn *pvconn, *pvconn_aux = NULL; int retval, retval_aux; retval = pvconn_open(pvconn_name, &pvconn); if (!retval || retval == EAGAIN) { // Get another listener if we are using auxiliary connections if (use_multiple_connections) { retval_aux = pvconn_open(pvconn_name_aux, &pvconn_aux); if (retval_aux && retval_aux != EAGAIN) { ofp_error(retval_aux, "opening auxiliary %s", pvconn_name_aux); pvconn_aux = NULL; } } dp_add_pvconn(dp, pvconn, pvconn_aux); n_listeners++; } else { ofp_error(retval, "opening %s", pvconn_name); } } if (n_listeners == 0) { OFP_FATAL(0, "could not listen for any connections"); } if (port_list != NULL) { add_ports(dp, port_list); } if (local_port != NULL) { error = dp_ports_add_local(dp, local_port); if (error) { OFP_FATAL(error, "failed to add local port %s", local_port); } } error = vlog_server_listen(NULL, NULL); if (error) { OFP_FATAL(error, "could not listen for vlog connections"); } die_if_already_running(); daemonize(); for (;;) { dp_run(dp); dp_wait(dp); poll_block(); } return 0; }
int udatapath_cmd(int argc, char *argv[]) { int n_listeners; int error; int i; set_program_name(argv[0]); register_fault_handlers(); time_init(); vlog_init(); parse_options(argc, argv); signal(SIGPIPE, SIG_IGN); if (argc - optind < 1) { OFP_FATAL(0, "at least one listener argument is required; " "use --help for usage"); } error = dp_new(&dp, dpid); n_listeners = 0; for (i = optind; i < argc; i++) { const char *pvconn_name = argv[i]; struct pvconn *pvconn; int retval; retval = pvconn_open(pvconn_name, &pvconn); if (!retval || retval == EAGAIN) { dp_add_pvconn(dp, pvconn); n_listeners++; } else { ofp_error(retval, "opening %s", pvconn_name); } } if (!n_listeners) { OFP_FATAL(0, "could not listen for any connections"); } if (port_list) { add_ports(dp, port_list); } if (local_port) { error = dp_add_local_port(dp, local_port, 0); if (error) { OFP_FATAL(error, "failed to add local port %s", local_port); } } error = vlog_server_listen(NULL, NULL); if (error) { OFP_FATAL(error, "could not listen for vlog connections"); } die_if_already_running(); daemonize(); for (;;) { dp_run(dp); dp_wait(dp); poll_block(); } return 0; }
int udatapath_cmd(int argc, char *argv[]) { int n_listeners; int error; int i; set_program_name(argv[0]); register_fault_handlers(); time_init(); vlog_init(); parse_options(argc, argv); signal(SIGPIPE, SIG_IGN); if (argc - optind < 1) { OFP_FATAL(0, "at least one listener argument is required; " "use --help for usage"); } error = dp_new(&dp, dpid); if (error) { OFP_FATAL(error, "Failed to create datapath. Exiting."); } #if defined(OF_HW_PLAT) if (got_mac) { memcpy(dp->dp_mgmt.mac, dp_mac, ETH_ADDR_LEN); } else { /* Use OF OUI and 3 bytes of DPID */ dp->dp_mgmt.mac[0] = 0; dp->dp_mgmt.mac[1] = 0x26; dp->dp_mgmt.mac[2] = 0xe1; dp->dp_mgmt.mac[3] = dp->id & 0xff; dp->dp_mgmt.mac[4] = (dp->id >> 8) & 0xff; dp->dp_mgmt.mac[5] = (dp->id >> 16) & 0xff; } dp_port_add_state_set(dp, port_add_state); dp->dp_mgmt.enabled = dp_mgmt; dp->dp_mgmt.port_fixed = dp_mgmt_port_fixed; dp->dp_mgmt.port = dp_mgmt_port; dp->dp_mgmt.vid_fixed = dp_mgmt_vid_fixed; dp->dp_mgmt.vid = dp_mgmt_vid; if (dp_mgmt_oob) { if (!dp->dp_mgmt.vid_fixed && !dp->dp_mgmt.port_fixed) { printf("WARNING: dp_mgmt misconfig: OOB requires fixed port\n"); printf("WARNING: Removing OOB management\n"); fprintf(stderr, "WARNING: dp_mgmt misconfig: OOB requires " "fixed port\n"); fprintf(stderr, "WARNING: Removing OOB management\n"); dp_mgmt_oob = false; } } dp->dp_mgmt.oob = dp_mgmt_oob; dp_mgmt_set(dp); /* Get hw_desc/dp_desc from hw-lib if not set by command args */ if (!hw_desc_set && dp->hw_drv != NULL && dp->hw_drv->hw_desc != NULL) { strncpy(hw_desc, dp->hw_drv->hw_desc, sizeof(hw_desc) - 1); } if (!dp_desc_set && dp->hw_drv != NULL && dp->hw_drv->dp_desc != NULL) { strncpy(dp->dp_desc, dp->hw_drv->dp_desc, sizeof(dp->dp_desc) - 1); } #endif n_listeners = 0; for (i = optind; i < argc; i++) { const char *pvconn_name = argv[i]; struct pvconn *pvconn; int retval; retval = pvconn_open(pvconn_name, &pvconn); if (!retval || retval == EAGAIN) { dp_add_pvconn(dp, pvconn); n_listeners++; } else { ofp_error(retval, "opening %s", pvconn_name); } } if (!n_listeners) { OFP_FATAL(0, "could not listen for any connections"); } if (port_list) { add_ports(dp, port_list); } if (max_port_set) { printf("Adding port range %d to %d\n", min_port, max_port); add_ports_range(dp, min_port, max_port); } if (local_port) { printf("Adding local port\n"); error = dp_add_local_port(dp, local_port, 0); if (error) { OFP_FATAL(error, "failed to add local port %s", local_port); } } error = vlog_server_listen(NULL, NULL); if (error) { OFP_FATAL(error, "could not listen for vlog connections"); } die_if_already_running(); daemonize(); WATCHDOG_START; dp->rx_enabled = 1; system("touch /tmp/ofswd-ready"); printf("Entering event loop"); for (;;) { WATCHDOG_STROKE; dp_run(dp); dp_wait(dp); poll_block(); } WATCHDOG_STOP; return 0; }