static void parse_options(int argc, char *argv[]) { char dpid_str[17]; int dpid_len; enum { OPT_MFR_DESC = UCHAR_MAX + 1, OPT_HW_DESC, OPT_SW_DESC, OPT_DP_DESC, OPT_SERIAL_NUM, OPT_BOOTSTRAP_CA_CERT, OPT_NO_LOCAL_PORT, OPT_NO_SLICING, OPT_DP_MGMT, OPT_DP_MGMT_OOB, OPT_DP_MGMT_PORT, OPT_DP_MGMT_VID, OPT_PORT_ADD_STATE }; static struct option long_options[] = { {"interfaces", required_argument, 0, 'i'}, {"local-port", required_argument, 0, 'L'}, {"no-local-port", no_argument, 0, OPT_NO_LOCAL_PORT}, {"datapath-id", required_argument, 0, 'd'}, {"mgmt-mac", required_argument, 0, 'e'}, /* for ether addr */ {"verbose", optional_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, {"no-slicing", no_argument, 0, OPT_NO_SLICING}, {"mfr-desc", required_argument, 0, OPT_MFR_DESC}, {"hw-desc", required_argument, 0, OPT_HW_DESC}, {"sw-desc", required_argument, 0, OPT_SW_DESC}, {"dp_desc", required_argument, 0, OPT_DP_DESC}, {"serial_num", required_argument, 0, OPT_SERIAL_NUM}, {"min-port", required_argument, 0, 'm'}, {"max-port", required_argument, 0, 'M'}, {"dp-mgmt", no_argument, 0, OPT_DP_MGMT}, {"dp-mgmt-oob", no_argument, 0, OPT_DP_MGMT_OOB}, {"dp-mgmt-port", required_argument, 0, OPT_DP_MGMT_PORT}, {"dp-mgmt-vid", required_argument, 0, OPT_DP_MGMT_VID}, {"add-port-state", required_argument, 0, OPT_PORT_ADD_STATE}, WATCHDOG_LONG_OPTIONS DAEMON_LONG_OPTIONS, #ifdef HAVE_OPENSSL VCONN_SSL_LONG_OPTIONS {"bootstrap-ca-cert", required_argument, 0, OPT_BOOTSTRAP_CA_CERT}, #endif {0, 0, 0, 0}, }; char *short_options = long_options_to_short_options(long_options); for (;;) { int indexptr; int c; uint8_t *ea; c = getopt_long(argc, argv, short_options, long_options, &indexptr); if (c == -1) { break; } switch (c) { case 'e': /* Management mac address */ if (str_to_mac(optarg, dp_mac) != 0) { printf("Warning: Could not parse mac address %s\n", optarg); } else { got_mac = true; } ea = dp_mac; printf("Datapath MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", ea[0], ea[1], ea[2], ea[3], ea[4], ea[5]); break; case 'd': dpid_len = strlen(optarg); if (dpid_len > 16) { /* If leading 0, truncate left; else truncate right */ if (optarg[0] == '0') { strncpy(dpid_str, &optarg[dpid_len-16], sizeof(dpid_str)); } else { strncpy(dpid_str, optarg, sizeof(dpid_str)); } dpid_str[17] = 0; printf("Warning: Truncating dpid string to %s\n", dpid_str); } else { strncpy(dpid_str, optarg, sizeof(dpid_str)); } if (strspn(dpid_str, "0123456789abcdefABCDEF") != strlen(dpid_str)) { printf("Warning: Illegal DPID string %s. Will generate\n", optarg); } else { dpid = strtoll(dpid_str, NULL, 16); if (dpid != 0) { printf("Using dpid: %s\n", dpid_str); } else { printf("DPID is 0. Will generate\n"); } } break; case 'h': usage(); case 'V': printf("%s %s compiled "__DATE__" "__TIME__"\n", program_name, VERSION BUILDNR); exit(EXIT_SUCCESS); case 'v': vlog_set_verbosity(optarg); break; case 'i': if (!port_list) { port_list = optarg; } else { port_list = xasprintf("%s,%s", port_list, optarg); } break; case 'L': local_port = optarg; break; /* Support specifying a range of ports */ case 'm': min_port = strtoul(optarg, NULL, 10); break; case 'M': max_port = strtoul(optarg, NULL, 10); max_port_set = true; break; #if defined(WATCHDOG_SUPPORT) case 'w': watchdog_active = 1; break; #endif case OPT_NO_LOCAL_PORT: local_port = NULL; break; case OPT_MFR_DESC: strncpy(mfr_desc, optarg, sizeof mfr_desc); break; case OPT_HW_DESC: hw_desc_set = true; strncpy(hw_desc, optarg, sizeof hw_desc); break; case OPT_SW_DESC: strncpy(sw_desc, optarg, sizeof sw_desc); break; case OPT_DP_DESC: dp_desc_set = true; strncpy(dp_desc, optarg, sizeof dp_desc); break; case OPT_SERIAL_NUM: strncpy(serial_num, optarg, sizeof serial_num); break; case OPT_NO_SLICING: num_queues = 0; break; case OPT_DP_MGMT: dp_mgmt = true; break; case OPT_DP_MGMT_OOB: dp_mgmt_oob = true; dp_mgmt = true; break; case OPT_DP_MGMT_PORT: dp_mgmt_port = strtoul(optarg, NULL, 10); dp_mgmt_port_fixed = true; dp_mgmt = true; break; case OPT_DP_MGMT_VID: dp_mgmt_vid = strtoul(optarg, NULL, 10); dp_mgmt_vid_fixed = true; dp_mgmt = true; break; case OPT_PORT_ADD_STATE: port_add_state = strtoul(optarg, NULL, 10); if (port_add_state == PORT_ADD_STATE_DOWN) { printf("Warning: Add port state is disabled\n"); } break; DAEMON_OPTION_HANDLERS #ifdef HAVE_OPENSSL VCONN_SSL_OPTION_HANDLERS case OPT_BOOTSTRAP_CA_CERT: vconn_ssl_set_ca_cert_file(optarg, true); break; #endif case '?': exit(EXIT_FAILURE); default: abort(); } } free(short_options); }
static void parse_options(struct datapath *dp, int argc, char *argv[]) { enum { OPT_MFR_DESC = UCHAR_MAX + 1, OPT_HW_DESC, OPT_SW_DESC, OPT_DP_DESC, OPT_SERIAL_NUM, OPT_BOOTSTRAP_CA_CERT, OPT_NO_LOCAL_PORT, OPT_NO_SLICING }; static struct option long_options[] = { {"interfaces", required_argument, 0, 'i'}, {"local-port", required_argument, 0, 'L'}, {"no-local-port", no_argument, 0, OPT_NO_LOCAL_PORT}, {"datapath-id", required_argument, 0, 'd'}, {"multiconn", no_argument, 0, 'm'}, {"verbose", optional_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, {"no-slicing", no_argument, 0, OPT_NO_SLICING}, {"mfr-desc", required_argument, 0, OPT_MFR_DESC}, {"hw-desc", required_argument, 0, OPT_HW_DESC}, {"sw-desc", required_argument, 0, OPT_SW_DESC}, {"dp_desc", required_argument, 0, OPT_DP_DESC}, {"serial_num", required_argument, 0, OPT_SERIAL_NUM}, DAEMON_LONG_OPTIONS, #ifdef HAVE_OPENSSL VCONN_SSL_LONG_OPTIONS {"bootstrap-ca-cert", required_argument, 0, OPT_BOOTSTRAP_CA_CERT}, #endif {0, 0, 0, 0}, }; char *short_options = long_options_to_short_options(long_options); for (;;) { int indexptr; int c; c = getopt_long(argc, argv, short_options, long_options, &indexptr); if (c == -1) { break; } switch (c) { case 'd': { uint64_t dpid; if (strlen(optarg) != 12 || strspn(optarg, "0123456789abcdefABCDEF") != 12) { ofp_fatal(0, "argument to -d or --datapath-id must be " "exactly 12 hex digits"); } dpid = strtoll(optarg, NULL, 16); if (!dpid) { ofp_fatal(0, "argument to -d or --datapath-id must " "be nonzero"); } dp_set_dpid(dp, dpid); break; } case 'm': { use_multiple_connections = true; break; } case 'h': usage(); case 'V': printf("%s %s compiled "__DATE__" "__TIME__"\n", program_name, VERSION BUILDNR); exit(EXIT_SUCCESS); case 'v': vlog_set_verbosity(optarg); break; case 'i': if (!port_list) { port_list = optarg; } else { port_list = xasprintf("%s,%s", port_list, optarg); } break; case 'L': local_port = optarg; break; case OPT_NO_LOCAL_PORT: local_port = NULL; break; case OPT_MFR_DESC: dp_set_mfr_desc(dp, optarg); break; case OPT_HW_DESC: dp_set_hw_desc(dp, optarg); break; case OPT_SW_DESC: dp_set_sw_desc(dp, optarg); break; case OPT_DP_DESC: dp_set_dp_desc(dp, optarg); break; case OPT_SERIAL_NUM: dp_set_serial_num(dp, optarg); break; case OPT_NO_SLICING: dp_set_max_queues(dp, 0); break; DAEMON_OPTION_HANDLERS #ifdef HAVE_OPENSSL VCONN_SSL_OPTION_HANDLERS case OPT_BOOTSTRAP_CA_CERT: vconn_ssl_set_ca_cert_file(optarg, true); break; #endif case '?': exit(EXIT_FAILURE); default: abort(); } } free(short_options); }
static void parse_options(int argc, char *argv[]) { enum { OPT_MAX_BACKOFF = UCHAR_MAX + 1, OPT_MFR_DESC, OPT_HW_DESC, OPT_SW_DESC, OPT_SERIAL_NUM, OPT_BOOTSTRAP_CA_CERT }; static struct option long_options[] = { {"interfaces", required_argument, 0, 'i'}, {"datapath-id", required_argument, 0, 'd'}, {"max-backoff", required_argument, 0, OPT_MAX_BACKOFF}, {"listen", required_argument, 0, 'l'}, {"verbose", optional_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, {"mfr-desc", required_argument, 0, OPT_MFR_DESC}, {"hw-desc", required_argument, 0, OPT_HW_DESC}, {"sw-desc", required_argument, 0, OPT_SW_DESC}, {"serial_num", required_argument, 0, OPT_SERIAL_NUM}, DAEMON_LONG_OPTIONS, #ifdef HAVE_OPENSSL VCONN_SSL_LONG_OPTIONS {"bootstrap-ca-cert", required_argument, 0, OPT_BOOTSTRAP_CA_CERT}, #endif {0, 0, 0, 0}, }; char *short_options = long_options_to_short_options(long_options); for (;;) { int indexptr; int c; c = getopt_long(argc, argv, short_options, long_options, &indexptr); if (c == -1) { break; } switch (c) { case 'd': if (strlen(optarg) != 12 || strspn(optarg, "0123456789abcdefABCDEF") != 12) { ofp_fatal(0, "argument to -d or --datapath-id must be " "exactly 12 hex digits"); } dpid = strtoll(optarg, NULL, 16); if (!dpid) { ofp_fatal(0, "argument to -d or --datapath-id must " "be nonzero"); } break; case 'h': usage(); case 'V': printf("%s %s compiled "__DATE__" "__TIME__"\n", program_name, VERSION BUILDNR); exit(EXIT_SUCCESS); case 'v': vlog_set_verbosity(optarg); break; case 'i': if (!port_list) { port_list = optarg; } else { port_list = xasprintf("%s,%s", port_list, optarg); } break; case OPT_MAX_BACKOFF: max_backoff = atoi(optarg); if (max_backoff < 1) { ofp_fatal(0, "--max-backoff argument must be at least 1"); } else if (max_backoff > 3600) { max_backoff = 3600; } break; case OPT_MFR_DESC: strncpy(mfr_desc, optarg, sizeof mfr_desc); break; case OPT_HW_DESC: strncpy(hw_desc, optarg, sizeof hw_desc); break; case OPT_SW_DESC: strncpy(sw_desc, optarg, sizeof sw_desc); break; case OPT_SERIAL_NUM: strncpy(serial_num, optarg, sizeof serial_num); break; case 'l': if (listen_pvconn_name) { ofp_fatal(0, "-l or --listen may be only specified once"); } listen_pvconn_name = optarg; break; DAEMON_OPTION_HANDLERS #ifdef HAVE_OPENSSL VCONN_SSL_OPTION_HANDLERS case OPT_BOOTSTRAP_CA_CERT: vconn_ssl_set_ca_cert_file(optarg, true); break; #endif case '?': exit(EXIT_FAILURE); default: abort(); } } free(short_options); }