static void construct_dpdk_options(const struct smap *ovs_other_config, struct svec *args) { struct dpdk_options_map { const char *ovs_configuration; const char *dpdk_option; bool default_enabled; const char *default_value; } opts[] = { {"dpdk-lcore-mask", "-c", false, NULL}, {"dpdk-hugepage-dir", "--huge-dir", false, NULL}, {"dpdk-socket-limit", "--socket-limit", false, NULL}, }; int i; /*First, construct from the flat-options (non-mutex)*/ for (i = 0; i < ARRAY_SIZE(opts); ++i) { const char *value = smap_get(ovs_other_config, opts[i].ovs_configuration); if (!value && opts[i].default_enabled) { value = opts[i].default_value; } if (value) { if (!args_contains(args, opts[i].dpdk_option)) { svec_add(args, opts[i].dpdk_option); svec_add(args, value); } else { VLOG_WARN("Ignoring database defined option '%s' due to " "dpdk-extra config", opts[i].dpdk_option); } } } }
static char * capture_vsctl_valist(const char *arg0, va_list args) { char *stdout_log, *stderr_log; enum vlog_level log_level; struct svec argv; int status; char *msg; /* Compose arguments. */ svec_init(&argv); svec_add(&argv, arg0); for (;;) { const char *arg = va_arg(args, const char *); if (!arg) { break; } svec_add(&argv, arg); } svec_terminate(&argv); /* Run process. */ if (process_run_capture(argv.names, &stdout_log, &stderr_log, SIZE_MAX, &status)) { svec_destroy(&argv); return NULL; } /* Log results. */ if (WIFEXITED(status)) { int code = WEXITSTATUS(status); log_level = code == 0 ? VLL_DBG : code == 1 ? VLL_WARN : VLL_ERR; } else { log_level = VLL_ERR; } msg = process_status_msg(status); VLOG(log_level, "ovs-vsctl exited (%s)", msg); if (stdout_log && *stdout_log) { VLOG(log_level, "ovs-vsctl wrote to stdout:\n%s\n", stdout_log); } if (stderr_log && *stderr_log) { VLOG(log_level, "ovs-vsctl wrote to stderr:\n%s\n", stderr_log); } free(msg); svec_destroy(&argv); free(stderr_log); if (WIFEXITED(status) && !WEXITSTATUS(status)) { return stdout_log; } else { free(stdout_log); return NULL; } }
void svec_diff(const struct svec *a, const struct svec *b, struct svec *a_only, struct svec *both, struct svec *b_only) { size_t i, j; assert(svec_is_sorted(a)); assert(svec_is_sorted(b)); if (a_only) { svec_init(a_only); } if (both) { svec_init(both); } if (b_only) { svec_init(b_only); } for (i = j = 0; i < a->n && j < b->n; ) { int cmp = strcmp(a->names[i], b->names[j]); if (cmp < 0) { if (a_only) { svec_add(a_only, a->names[i]); } i++; } else if (cmp > 0) { if (b_only) { svec_add(b_only, b->names[j]); } j++; } else { if (both) { svec_add(both, a->names[i]); } i++; j++; } } if (a_only) { for (; i < a->n; i++) { svec_add(a_only, a->names[i]); } } if (b_only) { for (; j < b->n; j++) { svec_add(b_only, b->names[j]); } } }
static void fetch_dbs(struct jsonrpc *rpc, struct svec *dbs) { struct jsonrpc_msg *request, *reply; size_t i; request = jsonrpc_create_request("list_dbs", json_array_create_empty(), NULL); check_txn(jsonrpc_transact_block(rpc, request, &reply), &reply); if (reply->result->type != JSON_ARRAY) { ovs_fatal(0, "list_dbs response is not array"); } for (i = 0; i < reply->result->u.array.n; i++) { const struct json *name = reply->result->u.array.elems[i]; if (name->type != JSON_STRING) { ovs_fatal(0, "list_dbs response %"PRIuSIZE" is not string", i); } svec_add(dbs, name->u.string); } jsonrpc_msg_destroy(reply); svec_sort(dbs); }
void svec_append(struct svec *svec, const struct svec *other) { size_t i; for (i = 0; i < other->n; i++) { svec_add(svec, other->names[i]); } }
void svec_unique(struct svec *svec) { assert(svec_is_sorted(svec)); if (svec->n > 1) { /* This algorithm is lazy and sub-optimal, but it's "obviously correct" * and asymptotically optimal . */ struct svec tmp; size_t i; svec_init(&tmp); svec_add(&tmp, svec->names[0]); for (i = 1; i < svec->n; i++) { if (strcmp(svec->names[i - 1], svec->names[i])) { svec_add(&tmp, svec->names[i]); } } svec_swap(&tmp, svec); svec_destroy(&tmp); } }
SVec svec_copy( SVec ov ) { int i; SVec nv; nv = svec_new( ov->fSize ); for ( i=0 ; i < ov->fEntries ; i++ ) { svec_add( nv, str_new(ov->fV[i]) ); } return nv; }
/* Breaks 'words' into words at white space, respecting shell-like quoting * conventions, and appends the words to 'svec'. */ void svec_parse_words(struct svec *svec, const char *words) { struct ds word = DS_EMPTY_INITIALIZER; const char *p, *q; for (p = words; *p != '\0'; p = q) { int quote = 0; while (isspace((unsigned char) *p)) { p++; } if (*p == '\0') { break; } ds_clear(&word); for (q = p; *q != '\0'; q++) { if (*q == quote) { quote = 0; } else if (*q == '\'' || *q == '"') { quote = *q; } else if (*q == '\\' && (!quote || quote == '"')) { q++; if (*q == '\0') { VLOG_WARN(LOG_MODULE, "%s: ends in trailing backslash", words); break; } ds_put_char(&word, *q); } else if (isspace((unsigned char) *q) && !quote) { q++; break; } else { ds_put_char(&word, *q); } } svec_add(svec, ds_cstr(&word)); if (quote) { VLOG_WARN(LOG_MODULE, "%s: word ends inside quoted string", words); } } ds_destroy(&word); }
static void construct_dpdk_mutex_options(const struct smap *ovs_other_config, struct svec *args) { char *default_dpdk_socket_mem = construct_dpdk_socket_mem(); struct dpdk_exclusive_options_map { const char *category; const char *ovs_dpdk_options[MAX_DPDK_EXCL_OPTS]; const char *eal_dpdk_options[MAX_DPDK_EXCL_OPTS]; const char *default_value; int default_option; } excl_opts[] = { {"memory type", {"dpdk-alloc-mem", "dpdk-socket-mem", NULL,}, {"-m", "--socket-mem", NULL,}, default_dpdk_socket_mem, 1 }, }; int i; for (i = 0; i < ARRAY_SIZE(excl_opts); ++i) { int found_opts = 0, scan, found_pos = -1; const char *found_value; struct dpdk_exclusive_options_map *popt = &excl_opts[i]; for (scan = 0; scan < MAX_DPDK_EXCL_OPTS && popt->ovs_dpdk_options[scan]; ++scan) { const char *value = smap_get(ovs_other_config, popt->ovs_dpdk_options[scan]); if (value && strlen(value)) { found_opts++; found_pos = scan; found_value = value; } } if (!found_opts) { if (popt->default_option) { found_pos = popt->default_option; found_value = popt->default_value; } else { continue; } } if (found_opts > 1) { VLOG_ERR("Multiple defined options for %s. Please check your" " database settings and reconfigure if necessary.", popt->category); } if (!args_contains(args, popt->eal_dpdk_options[found_pos])) { svec_add(args, popt->eal_dpdk_options[found_pos]); svec_add(args, found_value); } else { VLOG_WARN("Ignoring database defined option '%s' due to " "dpdk-extra config", popt->eal_dpdk_options[found_pos]); } } free(default_dpdk_socket_mem); }