/** * Parse device parameters. * * @param devargs * Device arguments structure. * * @return * 0 on success, negative errno value otherwise and rte_errno is set. */ static int mlx4_args(struct rte_devargs *devargs, struct mlx4_conf *conf) { struct rte_kvargs *kvlist; unsigned int arg_count; int ret = 0; int i; if (devargs == NULL) return 0; kvlist = rte_kvargs_parse(devargs->args, pmd_mlx4_init_params); if (kvlist == NULL) { rte_errno = EINVAL; ERROR("failed to parse kvargs"); return -rte_errno; } /* Process parameters. */ for (i = 0; pmd_mlx4_init_params[i]; ++i) { arg_count = rte_kvargs_count(kvlist, MLX4_PMD_PORT_KVARG); while (arg_count-- > 0) { ret = rte_kvargs_process(kvlist, MLX4_PMD_PORT_KVARG, (int (*)(const char *, const char *, void *)) mlx4_arg_parse, conf); if (ret != 0) goto free_kvlist; } } free_kvlist: rte_kvargs_free(kvlist); return ret; }
/* test a valid case */ static int test_valid_kvargs(void) { struct rte_kvargs *kvlist; const char *args; const char *valid_keys_list[] = { "foo", "check", NULL }; const char **valid_keys; /* empty args is valid */ args = ""; valid_keys = NULL; kvlist = rte_kvargs_parse(args, valid_keys); if (kvlist == NULL) { printf("rte_kvargs_parse() error"); goto fail; } rte_kvargs_free(kvlist); /* first test without valid_keys */ args = "foo=1234,check=value0,check=value1"; valid_keys = NULL; kvlist = rte_kvargs_parse(args, valid_keys); if (kvlist == NULL) { printf("rte_kvargs_parse() error"); goto fail; } /* call check_handler() for all entries with key="check" */ count = 0; if (rte_kvargs_process(kvlist, "check", check_handler, NULL) < 0) { printf("rte_kvargs_process() error\n"); rte_kvargs_free(kvlist); goto fail; } if (count != 2) { printf("invalid count value %d after rte_kvargs_process(check)\n", count); rte_kvargs_free(kvlist); goto fail; } count = 0; /* call check_handler() for all entries with key="unexistant_key" */ if (rte_kvargs_process(kvlist, "unexistant_key", check_handler, NULL) < 0) { printf("rte_kvargs_process() error\n"); rte_kvargs_free(kvlist); goto fail; } if (count != 0) { printf("invalid count value %d after rte_kvargs_process(unexistant_key)\n", count); rte_kvargs_free(kvlist); goto fail; } /* count all entries with key="foo" */ count = rte_kvargs_count(kvlist, "foo"); if (count != 1) { printf("invalid count value %d after rte_kvargs_count(foo)\n", count); rte_kvargs_free(kvlist); goto fail; } /* count all entries */ count = rte_kvargs_count(kvlist, NULL); if (count != 3) { printf("invalid count value %d after rte_kvargs_count(NULL)\n", count); rte_kvargs_free(kvlist); goto fail; } /* count all entries with key="unexistant_key" */ count = rte_kvargs_count(kvlist, "unexistant_key"); if (count != 0) { printf("invalid count value %d after rte_kvargs_count(unexistant_key)\n", count); rte_kvargs_free(kvlist); goto fail; } rte_kvargs_free(kvlist); /* second test using valid_keys */ args = "foo=droids,check=value0,check=value1,check=wrong_value"; valid_keys = valid_keys_list; kvlist = rte_kvargs_parse(args, valid_keys); if (kvlist == NULL) { printf("rte_kvargs_parse() error"); goto fail; } /* call check_handler() on all entries with key="check", it * should fail as the value is not recognized by the handler */ if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0) { printf("rte_kvargs_process() is success bu should not\n"); rte_kvargs_free(kvlist); goto fail; } count = rte_kvargs_count(kvlist, "check"); if (count != 3) { printf("invalid count value %d after rte_kvargs_count(check)\n", count); rte_kvargs_free(kvlist); goto fail; } rte_kvargs_free(kvlist); return 0; fail: printf("while processing <%s>", args); if (valid_keys != NULL && *valid_keys != NULL) { printf(" using valid_keys=<%s", *valid_keys); while (*(++valid_keys) != NULL) printf(",%s", *valid_keys); printf(">"); } printf("\n"); return -1; }