Config load functions updated to support 100G rates for subport and pipes. Added new parse function to convert string to unsigned long long. Added error checks.
Signed-off-by: Megha Ajmera <megha.ajm...@intel.com> --- examples/qos_sched/cfg_file.c | 180 +++++++++++++++++++++------------- examples/qos_sched/cfg_file.h | 2 + examples/qos_sched/init.c | 16 ++- 3 files changed, 128 insertions(+), 70 deletions(-) diff --git a/examples/qos_sched/cfg_file.c b/examples/qos_sched/cfg_file.c index ca871d3287..d203621fa4 100644 --- a/examples/qos_sched/cfg_file.c +++ b/examples/qos_sched/cfg_file.c @@ -25,6 +25,21 @@ uint32_t n_active_queues; struct rte_sched_cman_params cman_params; +int parse_u64(const char *entry, uint64_t *val) +{ + char *endptr; + if(!entry || !val) + return -EINVAL; + + errno = 0; + + *val = strtoull(entry, &endptr, 0); + if (errno == EINVAL || errno == ERANGE || *endptr != '\0') { + return -EINVAL; + } + return 0; +} + int cfg_load_port(struct rte_cfgfile *cfg, struct rte_sched_port_params *port_params) { @@ -47,7 +62,7 @@ cfg_load_port(struct rte_cfgfile *cfg, struct rte_sched_port_params *port_params int cfg_load_pipe(struct rte_cfgfile *cfg, struct rte_sched_pipe_params *pipe_params) { - int i, j; + int i, j, ret = 0; char *next; const char *entry; int profiles; @@ -63,68 +78,84 @@ cfg_load_pipe(struct rte_cfgfile *cfg, struct rte_sched_pipe_params *pipe_params snprintf(pipe_name, sizeof(pipe_name), "pipe profile %d", j); entry = rte_cfgfile_get_entry(cfg, pipe_name, "tb rate"); - if (entry) - pipe_params[j].tb_rate = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tb_rate); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tb size"); - if (entry) - pipe_params[j].tb_size = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tb_size); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc period"); - if (entry) - pipe_params[j].tc_period = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_period); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 0 rate"); - if (entry) - pipe_params[j].tc_rate[0] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[0]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 1 rate"); - if (entry) - pipe_params[j].tc_rate[1] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[1]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 2 rate"); - if (entry) - pipe_params[j].tc_rate[2] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[2]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 3 rate"); - if (entry) - pipe_params[j].tc_rate[3] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[3]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 4 rate"); - if (entry) - pipe_params[j].tc_rate[4] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[4]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 5 rate"); - if (entry) - pipe_params[j].tc_rate[5] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[5]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 6 rate"); - if (entry) - pipe_params[j].tc_rate[6] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[6]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 7 rate"); - if (entry) - pipe_params[j].tc_rate[7] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[7]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 8 rate"); - if (entry) - pipe_params[j].tc_rate[8] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[8]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 9 rate"); - if (entry) - pipe_params[j].tc_rate[9] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[9]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 10 rate"); - if (entry) - pipe_params[j].tc_rate[10] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[10]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 11 rate"); - if (entry) - pipe_params[j].tc_rate[11] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[11]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 12 rate"); - if (entry) - pipe_params[j].tc_rate[12] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &pipe_params[j].tc_rate[12]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, pipe_name, "tc 12 oversubscription weight"); if (entry) @@ -148,7 +179,7 @@ int cfg_load_subport_profile(struct rte_cfgfile *cfg, struct rte_sched_subport_profile_params *subport_profile) { - int i; + int i, ret = 0; const char *entry; int profiles; @@ -164,68 +195,85 @@ cfg_load_subport_profile(struct rte_cfgfile *cfg, snprintf(sec_name, sizeof(sec_name), "subport profile %d", i); entry = rte_cfgfile_get_entry(cfg, sec_name, "tb rate"); - if (entry) - subport_profile[i].tb_rate = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tb_rate); + if (ret) { + return ret; + } entry = rte_cfgfile_get_entry(cfg, sec_name, "tb size"); - if (entry) - subport_profile[i].tb_size = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tb_size); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc period"); - if (entry) - subport_profile[i].tc_period = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_period); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 0 rate"); - if (entry) - subport_profile[i].tc_rate[0] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[0]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 1 rate"); - if (entry) - subport_profile[i].tc_rate[1] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[1]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 2 rate"); - if (entry) - subport_profile[i].tc_rate[2] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[2]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 3 rate"); - if (entry) - subport_profile[i].tc_rate[3] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[3]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 4 rate"); - if (entry) - subport_profile[i].tc_rate[4] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[4]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 5 rate"); - if (entry) - subport_profile[i].tc_rate[5] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[5]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 6 rate"); - if (entry) - subport_profile[i].tc_rate[6] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[6]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 7 rate"); - if (entry) - subport_profile[i].tc_rate[7] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[7]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 8 rate"); - if (entry) - subport_profile[i].tc_rate[8] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[8]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 9 rate"); - if (entry) - subport_profile[i].tc_rate[9] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[9]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 10 rate"); - if (entry) - subport_profile[i].tc_rate[10] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[10]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 11 rate"); - if (entry) - subport_profile[i].tc_rate[11] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[11]); + if (ret) + return ret; entry = rte_cfgfile_get_entry(cfg, sec_name, "tc 12 rate"); - if (entry) - subport_profile[i].tc_rate[12] = (uint64_t)atoi(entry); + ret = parse_u64(entry, &subport_profile[i].tc_rate[12]); + if (ret) + return ret; } return 0; diff --git a/examples/qos_sched/cfg_file.h b/examples/qos_sched/cfg_file.h index 0dc458aa71..71d280718f 100644 --- a/examples/qos_sched/cfg_file.h +++ b/examples/qos_sched/cfg_file.h @@ -8,6 +8,8 @@ #include <rte_sched.h> #include <rte_cfgfile.h> +int parse_u64(const char *entry, uint64_t *val); + int cfg_load_port(struct rte_cfgfile *cfg, struct rte_sched_port_params *port); int cfg_load_pipe(struct rte_cfgfile *cfg, struct rte_sched_pipe_params *pipe); diff --git a/examples/qos_sched/init.c b/examples/qos_sched/init.c index d897fd378b..e3b0930dd0 100644 --- a/examples/qos_sched/init.c +++ b/examples/qos_sched/init.c @@ -286,10 +286,18 @@ app_load_cfg_profile(const char *profile) if (file == NULL) rte_exit(EXIT_FAILURE, "Cannot load configuration profile %s\n", profile); - cfg_load_port(file, &port_params); - cfg_load_subport(file, subport_params); - cfg_load_subport_profile(file, subport_profile); - cfg_load_pipe(file, pipe_profiles); + if (cfg_load_port(file, &port_params)) { + rte_exit(EXIT_FAILURE, "Invalid port configuration\n"); + } + if (cfg_load_subport(file, subport_params)) { + rte_exit (EXIT_FAILURE, "Invalid subport configuration\n"); + } + if (cfg_load_subport_profile(file, subport_profile)) { + rte_exit(EXIT_FAILURE, "Invalid subport profile configuration\n"); + } + if (cfg_load_pipe(file, pipe_profiles)) { + rte_exit(EXIT_FAILURE, "Invalid pipe profile configuration\n"); + } rte_cfgfile_close(file); -- 2.25.1