From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id CB497DE0 for ; Thu, 28 Jan 2016 16:55:55 +0100 (CET) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga101.jf.intel.com with ESMTP; 28 Jan 2016 07:55:54 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.22,358,1449561600"; d="scan'208";a="891158719" Received: from sie-lab-212-033.ir.intel.com (HELO silpixa00383881.ir.intel.com) ([10.237.212.33]) by fmsmga001.fm.intel.com with ESMTP; 28 Jan 2016 07:55:54 -0800 From: Fan Zhang To: dev@dpdk.org Date: Thu, 28 Jan 2016 15:55:51 +0000 Message-Id: <1453996551-11190-1-git-send-email-roy.fan.zhang@intel.com> X-Mailer: git-send-email 2.5.0 Subject: [dpdk-dev] [PATCH] examples/ip_pipeline: config parser clean-up X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Jan 2016 15:55:56 -0000 This patch updates the pipelne configuration file parser, cleans up nesting if/else conditions, and add clearer error message display. Signed-off-by: Fan Zhang --- examples/ip_pipeline/config_parse.c | 798 ++++++++++++++++++++---------------- examples/ip_pipeline/pipeline_be.h | 48 +++ 2 files changed, 494 insertions(+), 352 deletions(-) diff --git a/examples/ip_pipeline/config_parse.c b/examples/ip_pipeline/config_parse.c index 1bedbe4..6575e31 100644 --- a/examples/ip_pipeline/config_parse.c +++ b/examples/ip_pipeline/config_parse.c @@ -291,34 +291,7 @@ parser_read_arg_bool(const char *p) return result; } -#define PARSE_ERROR(exp, section, entry) \ -APP_CHECK(exp, "Parse error in section \"%s\": entry \"%s\"\n", section, entry) - -#define PARSE_ERROR_MALLOC(exp) \ -APP_CHECK(exp, "Parse error: no free memory\n") - -#define PARSE_ERROR_SECTION(exp, section) \ -APP_CHECK(exp, "Parse error in section \"%s\"", section) - -#define PARSE_ERROR_SECTION_NO_ENTRIES(exp, section) \ -APP_CHECK(exp, "Parse error in section \"%s\": no entries\n", section) - -#define PARSE_WARNING_IGNORED(exp, section, entry) \ -do \ -if (!(exp)) \ - fprintf(stderr, "Parse warning in section \"%s\": " \ - "entry \"%s\" is ignored\n", section, entry); \ -while (0) - -#define PARSE_ERROR_INVALID(exp, section, entry) \ -APP_CHECK(exp, "Parse error in section \"%s\": unrecognized entry \"%s\"\n",\ - section, entry) - -#define PARSE_ERROR_DUPLICATE(exp, section, entry) \ -APP_CHECK(exp, "Parse error in section \"%s\": duplicate entry \"%s\"\n",\ - section, entry) - -static int +int parser_read_uint64(uint64_t *value, const char *p) { char *next; @@ -358,7 +331,7 @@ parser_read_uint64(uint64_t *value, const char *p) return 0; } -static int +int parser_read_uint32(uint32_t *value, const char *p) { uint64_t val = 0; @@ -935,6 +908,7 @@ parse_pipeline_pktq_in(struct app_params *app, while (*next != '\0') { enum app_pktq_in_type type; + int name_validated = 0; int id; end = strchr(next, ' '); @@ -955,24 +929,41 @@ parse_pipeline_pktq_in(struct app_params *app, if (validate_name(name, "RXQ", 2) == 0) { type = APP_PKTQ_IN_HWQ; id = APP_PARAM_ADD(app->hwq_in_params, name); - } else if (validate_name(name, "SWQ", 1) == 0) { + if (id < 0) + return id; + name_validated = 1; + } + + if (validate_name(name, "SWQ", 1) == 0) { type = APP_PKTQ_IN_SWQ; id = APP_PARAM_ADD(app->swq_params, name); - } else if (validate_name(name, "TM", 1) == 0) { + if (id < 0) + return id; + name_validated = 1; + } + + if (validate_name(name, "TM", 1) == 0) { type = APP_PKTQ_IN_TM; id = APP_PARAM_ADD(app->tm_params, name); - } else if (validate_name(name, "SOURCE", 1) == 0) { + if (id < 0) + return id; + name_validated = 1; + } + + if (validate_name(name, "SOURCE", 1) == 0) { type = APP_PKTQ_IN_SOURCE; id = APP_PARAM_ADD(app->source_params, name); + if (id < 0) + return id; + name_validated = 1; + } + + if (name_validated == 1) { + p->pktq_in[p->n_pktq_in].type = type; + p->pktq_in[p->n_pktq_in].id = (uint32_t) id; + p->n_pktq_in++; } else return -EINVAL; - - if (id < 0) - return id; - - p->pktq_in[p->n_pktq_in].type = type; - p->pktq_in[p->n_pktq_in].id = (uint32_t) id; - p->n_pktq_in++; } return 0; @@ -990,6 +981,7 @@ parse_pipeline_pktq_out(struct app_params *app, while (*next != '\0') { enum app_pktq_out_type type; + int name_validated = 0; int id; end = strchr(next, ' '); @@ -1010,24 +1002,41 @@ parse_pipeline_pktq_out(struct app_params *app, if (validate_name(name, "TXQ", 2) == 0) { type = APP_PKTQ_OUT_HWQ; id = APP_PARAM_ADD(app->hwq_out_params, name); - } else if (validate_name(name, "SWQ", 1) == 0) { + if (id < 0) + return id; + name_validated = 1; + } + + if (validate_name(name, "SWQ", 1) == 0) { type = APP_PKTQ_OUT_SWQ; id = APP_PARAM_ADD(app->swq_params, name); - } else if (validate_name(name, "TM", 1) == 0) { + if (id < 0) + return id; + name_validated = 1; + } + + if (validate_name(name, "TM", 1) == 0) { type = APP_PKTQ_OUT_TM; id = APP_PARAM_ADD(app->tm_params, name); - } else if (validate_name(name, "SINK", 1) == 0) { + if (id < 0) + return id; + name_validated = 1; + } + + if (validate_name(name, "SINK", 1) == 0) { type = APP_PKTQ_OUT_SINK; id = APP_PARAM_ADD(app->sink_params, name); + if (id < 0) + return id; + name_validated = 1; + } + + if (name_validated == 1) { + p->pktq_out[p->n_pktq_out].type = type; + p->pktq_out[p->n_pktq_out].id = id; + p->n_pktq_out++; } else return -EINVAL; - - if (id < 0) - return id; - - p->pktq_out[p->n_pktq_out].type = type; - p->pktq_out[p->n_pktq_out].id = id; - p->n_pktq_out++; } return 0; @@ -1125,7 +1134,7 @@ parse_pipeline(struct app_params *app, struct app_pipeline_params *param; struct rte_cfgfile_entry *entries; ssize_t param_idx; - int n_entries, ret, i; + int n_entries, i; n_entries = rte_cfgfile_section_num_entries(cfg, section_name); PARSE_ERROR_SECTION_NO_ENTRIES((n_entries > 0), section_name); @@ -1139,60 +1148,88 @@ parse_pipeline(struct app_params *app, PARSER_PARAM_ADD_CHECK(param_idx, app->pipeline_params, section_name); param = &app->pipeline_params[param_idx]; - param->parsed = 1; for (i = 0; i < n_entries; i++) { struct rte_cfgfile_entry *ent = &entries[i]; if (strcmp(ent->name, "type") == 0) { - ret = snprintf(param->type, - RTE_DIM(param->type), - "%s", - ent->value); - if ((ret > 0) && (ret < (int)RTE_DIM(param->type))) - ret = 0; - else - ret = -EINVAL; - } else if (strcmp(ent->name, "core") == 0) - ret = parse_pipeline_core(¶m->socket_id, - ¶m->core_id, - ¶m->hyper_th_id, + int w_size = snprintf(param->type, RTE_DIM(param->type), + "%s", ent->value); + + PARSE_ERROR(((w_size > 0) && + (w_size < (int)RTE_DIM(param->type))), + section_name, + ent->name); + continue; + } + + if (strcmp(ent->name, "core") == 0) { + int status = parse_pipeline_core(¶m->socket_id, + ¶m->core_id, ¶m->hyper_th_id, ent->value); - else if (strcmp(ent->name, "pktq_in") == 0) - ret = parse_pipeline_pktq_in(app, param, ent->value); - else if (strcmp(ent->name, "pktq_out") == 0) - ret = parse_pipeline_pktq_out(app, param, ent->value); - else if (strcmp(ent->name, "msgq_in") == 0) - ret = parse_pipeline_msgq_in(app, param, ent->value); - else if (strcmp(ent->name, "msgq_out") == 0) - ret = parse_pipeline_msgq_out(app, param, ent->value); - else if (strcmp(ent->name, "timer_period") == 0) - ret = parser_read_uint32(¶m->timer_period, + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "pktq_in") == 0) { + int status = parse_pipeline_pktq_in(app, + param, ent->value); + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "pktq_out") == 0) { + int status = parse_pipeline_pktq_out(app, + param, ent->value); + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "msgq_in") == 0) { + int status = parse_pipeline_msgq_in(app, + param, ent->value); + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "msgq_out") == 0) { + int status = parse_pipeline_msgq_out(app, + param, ent->value); + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "timer_period") == 0) { + int status = parser_read_uint32(¶m->timer_period, ent->value); - else { - APP_CHECK((param->n_args < APP_MAX_PIPELINE_ARGS), + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + /* pipeline type specific items */ + APP_CHECK((param->n_args < APP_MAX_PIPELINE_ARGS), "CFG: [%s] out of memory", section_name); - param->args_name[param->n_args] = strdup(ent->name); - param->args_value[param->n_args] = strdup(ent->value); + param->args_name[param->n_args] = strdup(ent->name); + param->args_value[param->n_args] = strdup(ent->value); - APP_CHECK((param->args_name[param->n_args] != NULL) && + APP_CHECK((param->args_name[param->n_args] != NULL) && (param->args_value[param->n_args] != NULL), "CFG: [%s] out of memory", section_name); - param->n_args++; - ret = 0; - } - - APP_CHECK(ret == 0, - "CFG: [%s] entry '%s': Invalid value '%s'\n", - section_name, - ent->name, - ent->value); + param->n_args++; } + param->parsed = 1; + snprintf(name, sizeof(name), "MSGQ-REQ-%s", section_name); param_idx = APP_PARAM_ADD(app->msgq_params, name); PARSER_IMPLICIT_PARAM_ADD_CHECK(param_idx, name); @@ -1232,7 +1269,7 @@ parse_mempool(struct app_params *app, struct app_mempool_params *param; struct rte_cfgfile_entry *entries; ssize_t param_idx; - int n_entries, ret, i; + int n_entries, i; n_entries = rte_cfgfile_section_num_entries(cfg, section_name); PARSE_ERROR_SECTION_NO_ENTRIES((n_entries > 0), section_name); @@ -1246,36 +1283,44 @@ parse_mempool(struct app_params *app, PARSER_PARAM_ADD_CHECK(param_idx, app->mempool_params, section_name); param = &app->mempool_params[param_idx]; - param->parsed = 1; for (i = 0; i < n_entries; i++) { struct rte_cfgfile_entry *ent = &entries[i]; - ret = -ESRCH; - if (strcmp(ent->name, "buffer_size") == 0) - ret = parser_read_uint32(¶m->buffer_size, - ent->value); - else if (strcmp(ent->name, "pool_size") == 0) - ret = parser_read_uint32(¶m->pool_size, + if (strcmp(ent->name, "buffer_size") == 0) { + int status = parser_read_uint32(¶m->buffer_size, + ent->value); + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "pool_size") == 0) { + int status = parser_read_uint32(¶m->pool_size, ent->value); - else if (strcmp(ent->name, "cache_size") == 0) - ret = parser_read_uint32(¶m->cache_size, + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "cache_size") == 0) { + int status = parser_read_uint32(¶m->cache_size, ent->value); - else if (strcmp(ent->name, "cpu") == 0) - ret = parser_read_uint32(¶m->cpu_socket_id, + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "cpu") == 0) { + int status = parser_read_uint32(¶m->cpu_socket_id, ent->value); + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } - APP_CHECK(ret != -ESRCH, - "CFG: [%s] entry '%s': unknown entry\n", - section_name, - ent->name); - APP_CHECK(ret == 0, - "CFG: [%s] entry '%s': Invalid value '%s'\n", - section_name, - ent->name, - ent->value); + /* unrecognized */ + PARSE_ERROR_INVALID(0, section_name, ent->name); } + param->parsed = 1; + free(entries); } @@ -1286,7 +1331,7 @@ parse_link(struct app_params *app, { struct app_link_params *param; struct rte_cfgfile_entry *entries; - int n_entries, ret, i; + int n_entries, i; ssize_t param_idx; n_entries = rte_cfgfile_section_num_entries(cfg, section_name); @@ -1301,48 +1346,73 @@ parse_link(struct app_params *app, PARSER_PARAM_ADD_CHECK(param_idx, app->link_params, section_name); param = &app->link_params[param_idx]; - param->parsed = 1; for (i = 0; i < n_entries; i++) { struct rte_cfgfile_entry *ent = &entries[i]; - ret = -ESRCH; if (strcmp(ent->name, "promisc") == 0) { - ret = parser_read_arg_bool(ent->value); - if (ret >= 0) { - param->promisc = ret; - ret = 0; - } - } else if (strcmp(ent->name, "arp_q") == 0) - ret = parser_read_uint32(¶m->arp_q, + int status = parser_read_arg_bool(ent->value); + + PARSE_ERROR((status >= 0), section_name, ent->name); + param->promisc = status; + continue; + } + + if (strcmp(ent->name, "arp_q") == 0) { + int status = parser_read_uint32(¶m->arp_q, ent->value); - else if (strcmp(ent->name, "tcp_syn_q") == 0) - ret = parser_read_uint32(¶m->tcp_syn_local_q, + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "tcp_syn_q") == 0) { + int status = parser_read_uint32(¶m->tcp_syn_local_q, ent->value); - else if (strcmp(ent->name, "ip_local_q") == 0) - ret = parser_read_uint32(¶m->ip_local_q, + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "ip_local_q") == 0) { + int status = parser_read_uint32(¶m->ip_local_q, ent->value); - else if (strcmp(ent->name, "tcp_local_q") == 0) - ret = parser_read_uint32(¶m->tcp_local_q, + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + + if (strcmp(ent->name, "tcp_local_q") == 0) { + int status = parser_read_uint32(¶m->tcp_local_q, ent->value); - else if (strcmp(ent->name, "udp_local_q") == 0) - ret = parser_read_uint32(¶m->udp_local_q, + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "udp_local_q") == 0) { + int status = parser_read_uint32(¶m->udp_local_q, ent->value); - else if (strcmp(ent->name, "sctp_local_q") == 0) - ret = parser_read_uint32(¶m->sctp_local_q, + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "sctp_local_q") == 0) { + int status = parser_read_uint32(¶m->sctp_local_q, ent->value); - APP_CHECK(ret != -ESRCH, - "CFG: [%s] entry '%s': unknown entry\n", - section_name, - ent->name); - APP_CHECK(ret == 0, - "CFG: [%s] entry '%s': Invalid value '%s'\n", - section_name, - ent->name, - ent->value); + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + /* unrecognized */ + PARSE_ERROR_INVALID(0, section_name, ent->name); } + param->parsed = 1; + free(entries); } @@ -1353,7 +1423,7 @@ parse_rxq(struct app_params *app, { struct app_pktq_hwq_in_params *param; struct rte_cfgfile_entry *entries; - int n_entries, ret, i; + int n_entries, i; ssize_t param_idx; n_entries = rte_cfgfile_section_num_entries(cfg, section_name); @@ -1368,43 +1438,40 @@ parse_rxq(struct app_params *app, PARSER_PARAM_ADD_CHECK(param_idx, app->hwq_in_params, section_name); param = &app->hwq_in_params[param_idx]; - param->parsed = 1; for (i = 0; i < n_entries; i++) { struct rte_cfgfile_entry *ent = &entries[i]; - ret = -ESRCH; if (strcmp(ent->name, "mempool") == 0) { int status = validate_name(ent->value, "MEMPOOL", 1); ssize_t idx; - - APP_CHECK((status == 0), - "CFG: [%s] entry '%s': invalid mempool\n", - section_name, - ent->name); - + PARSE_ERROR((status == 0), section_name, ent->name); idx = APP_PARAM_ADD(app->mempool_params, ent->value); PARSER_IMPLICIT_PARAM_ADD_CHECK(idx, section_name); param->mempool_id = idx; - ret = 0; - } else if (strcmp(ent->name, "size") == 0) - ret = parser_read_uint32(¶m->size, + continue; + } + + if (strcmp(ent->name, "size") == 0) { + int status = parser_read_uint32(¶m->size, ent->value); - else if (strcmp(ent->name, "burst") == 0) - ret = parser_read_uint32(¶m->burst, + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "burst") == 0) { + int status = parser_read_uint32(¶m->burst, ent->value); + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } - APP_CHECK(ret != -ESRCH, - "CFG: [%s] entry '%s': unknown entry\n", - section_name, - ent->name); - APP_CHECK(ret == 0, - "CFG: [%s] entry '%s': Invalid value '%s'\n", - section_name, - ent->name, - ent->value); + /* unrecognized */ + PARSE_ERROR_INVALID(0, section_name, ent->name); } + param->parsed = 1; + free(entries); } @@ -1415,7 +1482,7 @@ parse_txq(struct app_params *app, { struct app_pktq_hwq_out_params *param; struct rte_cfgfile_entry *entries; - int n_entries, ret, i; + int n_entries, i; ssize_t param_idx; n_entries = rte_cfgfile_section_num_entries(cfg, section_name); @@ -1430,35 +1497,40 @@ parse_txq(struct app_params *app, PARSER_PARAM_ADD_CHECK(param_idx, app->hwq_out_params, section_name); param = &app->hwq_out_params[param_idx]; - param->parsed = 1; for (i = 0; i < n_entries; i++) { struct rte_cfgfile_entry *ent = &entries[i]; - ret = -ESRCH; - if (strcmp(ent->name, "size") == 0) - ret = parser_read_uint32(¶m->size, ent->value); - else if (strcmp(ent->name, "burst") == 0) - ret = parser_read_uint32(¶m->burst, ent->value); - else if (strcmp(ent->name, "dropless") == 0) { - ret = parser_read_arg_bool(ent->value); - if (ret >= 0) { - param->dropless = ret; - ret = 0; - } + if (strcmp(ent->name, "size") == 0) { + int status = parser_read_uint32(¶m->size, + ent->value); + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; } - APP_CHECK(ret != -ESRCH, - "CFG: [%s] entry '%s': unknown entry\n", - section_name, - ent->name); - APP_CHECK(ret == 0, - "CFG: [%s] entry '%s': Invalid value '%s'\n", - section_name, - ent->name, - ent->value); + if (strcmp(ent->name, "burst") == 0) { + int status = parser_read_uint32(¶m->burst, + ent->value); + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "dropless") == 0) { + int status = parser_read_arg_bool(ent->value); + + PARSE_ERROR((status >= 0), section_name, ent->name); + param->dropless = status; + continue; + } + + /* unrecognized */ + PARSE_ERROR_INVALID(0, section_name, ent->name); } + param->parsed = 1; + free(entries); } @@ -1469,7 +1541,7 @@ parse_swq(struct app_params *app, { struct app_pktq_swq_params *param; struct rte_cfgfile_entry *entries; - int n_entries, ret, i; + int n_entries, i; unsigned frag_entries = 0; ssize_t param_idx; @@ -1485,108 +1557,138 @@ parse_swq(struct app_params *app, PARSER_PARAM_ADD_CHECK(param_idx, app->swq_params, section_name); param = &app->swq_params[param_idx]; - param->parsed = 1; for (i = 0; i < n_entries; i++) { struct rte_cfgfile_entry *ent = &entries[i]; - ret = -ESRCH; - if (strcmp(ent->name, "size") == 0) - ret = parser_read_uint32(¶m->size, + if (strcmp(ent->name, "size") == 0) { + int status = parser_read_uint32(¶m->size, ent->value); - else if (strcmp(ent->name, "burst_read") == 0) - ret = parser_read_uint32(¶m->burst_read, + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "burst_read") == 0) { + int status = parser_read_uint32(¶m->burst_read, ent->value); - else if (strcmp(ent->name, "burst_write") == 0) - ret = parser_read_uint32(¶m->burst_write, + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "burst_write") == 0) { + int status = parser_read_uint32(¶m->burst_write, ent->value); - else if (strcmp(ent->name, "dropless") == 0) { - ret = parser_read_arg_bool(ent->value); - if (ret >= 0) { - param->dropless = ret; - ret = 0; - } - } else if (strcmp(ent->name, "n_retries") == 0) - ret = parser_read_uint64(¶m->n_retries, + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "dropless") == 0) { + int status = parser_read_arg_bool(ent->value); + + PARSE_ERROR((status >= 0), section_name, ent->name); + param->dropless = status; + continue; + } + + if (strcmp(ent->name, "n_retries") == 0) { + int status = parser_read_uint64(¶m->n_retries, ent->value); - else if (strcmp(ent->name, "cpu") == 0) - ret = parser_read_uint32(¶m->cpu_socket_id, + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "cpu") == 0) { + int status = parser_read_uint32(¶m->cpu_socket_id, ent->value); - else if (strcmp(ent->name, "ipv4_frag") == 0) { - ret = parser_read_arg_bool(ent->value); - if (ret >= 0) { - param->ipv4_frag = ret; - if (param->mtu == 0) - param->mtu = 1500; - ret = 0; - } - } else if (strcmp(ent->name, "ipv6_frag") == 0) { - ret = parser_read_arg_bool(ent->value); - if (ret >= 0) { - param->ipv6_frag = ret; - if (param->mtu == 0) - param->mtu = 1320; - ret = 0; - } - } else if (strcmp(ent->name, "ipv4_ras") == 0) { - ret = parser_read_arg_bool(ent->value); - if (ret >= 0) { - param->ipv4_ras = ret; - ret = 0; - } - } else if (strcmp(ent->name, "ipv6_ras") == 0) { - ret = parser_read_arg_bool(ent->value); - if (ret >= 0) { - param->ipv6_ras = ret; - ret = 0; - } - } else if (strcmp(ent->name, "mtu") == 0) { + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "ipv4_frag") == 0) { + int status = parser_read_arg_bool(ent->value); + + PARSE_ERROR((status >= 0), section_name, ent->name); + param->ipv4_frag = status; + if (param->mtu == 0) + param->mtu = 1500; + continue; + } + + if (strcmp(ent->name, "ipv6_frag") == 0) { + int status = parser_read_arg_bool(ent->value); + + PARSE_ERROR((status >= 0), section_name, ent->name); + param->ipv6_frag = status; + if (param->mtu == 0) + param->mtu = 1320; + continue; + } + + if (strcmp(ent->name, "ipv4_ras") == 0) { + int status = parser_read_arg_bool(ent->value); + + PARSE_ERROR((status >= 0), section_name, ent->name); + param->ipv4_ras = status; + continue; + } + + if (strcmp(ent->name, "ipv6_ras") == 0) { + int status = parser_read_arg_bool(ent->value); + + PARSE_ERROR((status >= 0), section_name, ent->name); + param->ipv6_ras = status; + continue; + } + + if (strcmp(ent->name, "mtu") == 0) { + int status = parser_read_uint32(¶m->mtu, + ent->value); + + PARSE_ERROR((status == 0), section_name, ent->name); frag_entries = 1; - ret = parser_read_uint32(¶m->mtu, - ent->value); - } else if (strcmp(ent->name, "metadata_size") == 0) { + continue; + } + + if (strcmp(ent->name, "metadata_size") == 0) { frag_entries = 1; - ret = parser_read_uint32(¶m->metadata_size, - ent->value); - } else if (strcmp(ent->name, "mempool_direct") == 0) { + int status = parser_read_uint32(¶m->metadata_size, + ent->value); + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "mempool_direct") == 0) { int status = validate_name(ent->value, "MEMPOOL", 1); ssize_t idx; - APP_CHECK((status == 0), - "CFG: [%s] entry '%s': invalid mempool\n", - section_name, - ent->name); - + PARSE_ERROR((status == 0), section_name, ent->name); idx = APP_PARAM_ADD(app->mempool_params, ent->value); PARSER_IMPLICIT_PARAM_ADD_CHECK(idx, section_name); param->mempool_direct_id = idx; frag_entries = 1; - ret = 0; - } else if (strcmp(ent->name, "mempool_indirect") == 0) { + continue; + } + + if (strcmp(ent->name, "mempool_indirect") == 0) { int status = validate_name(ent->value, "MEMPOOL", 1); ssize_t idx; - APP_CHECK((status == 0), - "CFG: [%s] entry '%s': invalid mempool\n", - section_name, - ent->name); - + PARSE_ERROR((status == 0), section_name, ent->name); idx = APP_PARAM_ADD(app->mempool_params, ent->value); PARSER_IMPLICIT_PARAM_ADD_CHECK(idx, section_name); param->mempool_indirect_id = idx; frag_entries = 1; - ret = 0; - } - - APP_CHECK(ret != -ESRCH, - "CFG: [%s] entry '%s': unknown entry\n", - section_name, - ent->name); - APP_CHECK(ret == 0, - "CFG: [%s] entry '%s': Invalid value '%s'\n", - section_name, - ent->name, - ent->value); + continue; + } + + /* unrecognized */ + PARSE_ERROR_INVALID(0, section_name, ent->name); } if (frag_entries == 1) { @@ -1596,6 +1698,8 @@ parse_swq(struct app_params *app, section_name); } + param->parsed = 1; + free(entries); } @@ -1606,7 +1710,7 @@ parse_tm(struct app_params *app, { struct app_pktq_tm_params *param; struct rte_cfgfile_entry *entries; - int n_entries, ret, i; + int n_entries, i; ssize_t param_idx; n_entries = rte_cfgfile_section_num_entries(cfg, section_name); @@ -1621,41 +1725,38 @@ parse_tm(struct app_params *app, PARSER_PARAM_ADD_CHECK(param_idx, app->tm_params, section_name); param = &app->tm_params[param_idx]; - param->parsed = 1; for (i = 0; i < n_entries; i++) { struct rte_cfgfile_entry *ent = &entries[i]; - ret = -ESRCH; if (strcmp(ent->name, "cfg") == 0) { param->file_name = strdup(ent->value); - if (param->file_name == NULL) - ret = -EINVAL; - else - ret = 0; - } else if (strcmp(ent->name, "burst_read") == 0) - ret = parser_read_uint32(¶m->burst_read, + PARSE_ERROR_MALLOC(param->file_name != NULL); + continue; + } + + if (strcmp(ent->name, "burst_read") == 0) { + int status = parser_read_uint32(¶m->burst_read, ent->value); - else if (strcmp(ent->name, "burst_write") == 0) - ret = parser_read_uint32(¶m->burst_write, + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "burst_write") == 0) { + int status = parser_read_uint32(¶m->burst_write, ent->value); - APP_CHECK(ret != -ESRCH, - "CFG: [%s] entry '%s': unknown entry\n", - section_name, - ent->name); - APP_CHECK(ret != -EBADF, - "CFG: [%s] entry '%s': TM cfg parse error '%s'\n", - section_name, - ent->name, - ent->value); - APP_CHECK(ret == 0, - "CFG: [%s] entry '%s': Invalid value '%s'\n", - section_name, - ent->name, - ent->value); + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + /* unrecognized */ + PARSE_ERROR_INVALID(0, section_name, ent->name); } + param->parsed = 1; + free(entries); } @@ -1666,7 +1767,7 @@ parse_source(struct app_params *app, { struct app_pktq_source_params *param; struct rte_cfgfile_entry *entries; - int n_entries, ret, i; + int n_entries, i; ssize_t param_idx; n_entries = rte_cfgfile_section_num_entries(cfg, section_name); @@ -1681,39 +1782,35 @@ parse_source(struct app_params *app, PARSER_PARAM_ADD_CHECK(param_idx, app->source_params, section_name); param = &app->source_params[param_idx]; - param->parsed = 1; for (i = 0; i < n_entries; i++) { struct rte_cfgfile_entry *ent = &entries[i]; - ret = -ESRCH; if (strcmp(ent->name, "mempool") == 0) { int status = validate_name(ent->value, "MEMPOOL", 1); ssize_t idx; - APP_CHECK((status == 0), - "CFG: [%s] entry '%s': invalid mempool\n", - section_name, - ent->name); - + PARSE_ERROR((status == 0), section_name, ent->name); idx = APP_PARAM_ADD(app->mempool_params, ent->value); PARSER_IMPLICIT_PARAM_ADD_CHECK(idx, section_name); param->mempool_id = idx; - ret = 0; - } else if (strcmp(ent->name, "burst") == 0) - ret = parser_read_uint32(¶m->burst, ent->value); - - APP_CHECK(ret != -ESRCH, - "CFG: [%s] entry '%s': unknown entry\n", - section_name, - ent->name); - APP_CHECK(ret == 0, - "CFG: [%s] entry '%s': Invalid value '%s'\n", - section_name, - ent->name, - ent->value); + continue; + } + + if (strcmp(ent->name, "burst") == 0) { + int status = parser_read_uint32(¶m->burst, + ent->value); + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + /* unrecognized */ + PARSE_ERROR_INVALID(0, section_name, ent->name); } + param->parsed = 1; + free(entries); } @@ -1724,7 +1821,7 @@ parse_msgq_req_pipeline(struct app_params *app, { struct app_msgq_params *param; struct rte_cfgfile_entry *entries; - int n_entries, ret, i; + int n_entries, i; ssize_t param_idx; n_entries = rte_cfgfile_section_num_entries(cfg, section_name); @@ -1739,26 +1836,23 @@ parse_msgq_req_pipeline(struct app_params *app, PARSER_PARAM_ADD_CHECK(param_idx, app->msgq_params, section_name); param = &app->msgq_params[param_idx]; - param->parsed = 1; for (i = 0; i < n_entries; i++) { struct rte_cfgfile_entry *ent = &entries[i]; - ret = -ESRCH; - if (strcmp(ent->name, "size") == 0) - ret = parser_read_uint32(¶m->size, ent->value); - - APP_CHECK(ret != -ESRCH, - "CFG: [%s] entry '%s': unknown entry\n", - section_name, - ent->name); - APP_CHECK(ret == 0, - "CFG: [%s] entry '%s': Invalid value '%s'\n", - section_name, - ent->name, - ent->value); + if (strcmp(ent->name, "size") == 0) { + int status = parser_read_uint32(¶m->size, + ent->value); + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + /* unrecognized */ + PARSE_ERROR_INVALID(0, section_name, ent->name); } + param->parsed = 1; free(entries); } @@ -1769,7 +1863,7 @@ parse_msgq_rsp_pipeline(struct app_params *app, { struct app_msgq_params *param; struct rte_cfgfile_entry *entries; - int n_entries, ret, i; + int n_entries, i; ssize_t param_idx; n_entries = rte_cfgfile_section_num_entries(cfg, section_name); @@ -1784,26 +1878,24 @@ parse_msgq_rsp_pipeline(struct app_params *app, PARSER_PARAM_ADD_CHECK(param_idx, app->msgq_params, section_name); param = &app->msgq_params[param_idx]; - param->parsed = 1; for (i = 0; i < n_entries; i++) { struct rte_cfgfile_entry *ent = &entries[i]; - ret = -ESRCH; - if (strcmp(ent->name, "size") == 0) - ret = parser_read_uint32(¶m->size, ent->value); - - APP_CHECK(ret != -ESRCH, - "CFG: [%s] entry '%s': unknown entry\n", - section_name, - ent->name); - APP_CHECK(ret == 0, - "CFG: [%s] entry '%s': Invalid value '%s'\n", - section_name, - ent->name, - ent->value); + if (strcmp(ent->name, "size") == 0) { + int status = parser_read_uint32(¶m->size, + ent->value); + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + /* unrecognized */ + PARSE_ERROR_INVALID(0, section_name, ent->name); } + param->parsed = 1; + free(entries); } @@ -1814,7 +1906,7 @@ parse_msgq(struct app_params *app, { struct app_msgq_params *param; struct rte_cfgfile_entry *entries; - int n_entries, ret, i; + int n_entries, i; ssize_t param_idx; n_entries = rte_cfgfile_section_num_entries(cfg, section_name); @@ -1829,30 +1921,32 @@ parse_msgq(struct app_params *app, PARSER_PARAM_ADD_CHECK(param_idx, app->msgq_params, section_name); param = &app->msgq_params[param_idx]; - param->parsed = 1; for (i = 0; i < n_entries; i++) { struct rte_cfgfile_entry *ent = &entries[i]; - ret = -ESRCH; - if (strcmp(ent->name, "size") == 0) - ret = parser_read_uint32(¶m->size, + if (strcmp(ent->name, "size") == 0) { + int status = parser_read_uint32(¶m->size, ent->value); - else if (strcmp(ent->name, "cpu") == 0) - ret = parser_read_uint32(¶m->cpu_socket_id, + + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + if (strcmp(ent->name, "cpu") == 0) { + int status = parser_read_uint32(¶m->cpu_socket_id, ent->value); - APP_CHECK(ret != -ESRCH, - "CFG: [%s] entry '%s': unknown entry\n", - section_name, - ent->name); - APP_CHECK(ret == 0, - "CFG: [%s] entry '%s': Invalid value '%s'\n", - section_name, - ent->name, - ent->value); + PARSE_ERROR((status == 0), section_name, ent->name); + continue; + } + + /* unrecognized */ + PARSE_ERROR_INVALID(0, section_name, ent->name); } + param->parsed = 1; + free(entries); } diff --git a/examples/ip_pipeline/pipeline_be.h b/examples/ip_pipeline/pipeline_be.h index 0ba00f6..619fdc2 100644 --- a/examples/ip_pipeline/pipeline_be.h +++ b/examples/ip_pipeline/pipeline_be.h @@ -271,6 +271,54 @@ struct pipeline_be_ops { pipeline_be_op_track f_track; }; +/* Global parameter parsing check and display */ +#define PARSER_ERR_CHECK(exp, fmt, ...) \ +do { \ + if (!(exp)) { \ + fprintf(stderr, fmt "\n", ## __VA_ARGS__);\ + abort(); \ + } \ +} while (0) + +#define PARSE_ERROR(exp, section, entry) \ +PARSER_ERR_CHECK(exp, "Parse error in section \"%s\": entry \"%s\"\n",\ + section, entry) + +#define PARSE_ERROR_MALLOC(exp) \ +PARSER_ERR_CHECK(exp, "Parse error: no free memory\n") + +#define PARSE_ERROR_SECTION(exp, section) \ +PARSER_ERR_CHECK(exp, "Parse error in section \"%s\"", section) + +#define PARSE_ERROR_SECTION_NO_ENTRIES(exp, section) \ +PARSER_ERR_CHECK(exp, "Parse error in section \"%s\": no entries\n",\ + section) + +#define PARSE_WARNING_IGNORED(exp, section, entry) \ +do { \ + if (!(exp)) \ + fprintf(stderr, "Parse warning in section \"%s\": " \ + "entry \"%s\" is ignored\n", section, entry); \ +} while (0) + +#define PARSE_ERROR_INVALID(exp, section, entry) \ +PARSER_ERR_CHECK(exp, \ + "Parse error in section \"%s\": unrecognized entry \"%s\"\n",\ + section, entry) + +#define PARSE_ERROR_DUPLICATE(exp, section, entry) \ +PARSER_ERR_CHECK(exp, \ + "Parse error in section \"%s\": duplicate entry \"%s\"\n",\ + section, entry) + +/* Parse 64-bit integer string to value */ +int +parser_read_uint64(uint64_t *value, const char *p); + +/* Parse 32-bit integer string to value */ +int +parser_read_uint32(uint32_t *value, const char *p); + /* Parse hex string to uint8_t array */ int parse_hex_string(char *src, uint8_t *dst, uint32_t *size); -- 2.5.0