X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=VNFs%2FDPPD-PROX%2Fparse_utils.c;h=9ceb1c5979e29100253ff48a13536195e690d17a;hb=e37df4aac0c175b0ee30cbbf4325cb3e8774204b;hp=d258c5913e8bdaab1366161b3051bce8eed60149;hpb=7286b2518ec8e4398b512ce95def9166a7af2e4a;p=samplevnf.git diff --git a/VNFs/DPPD-PROX/parse_utils.c b/VNFs/DPPD-PROX/parse_utils.c index d258c591..9ceb1c59 100644 --- a/VNFs/DPPD-PROX/parse_utils.c +++ b/VNFs/DPPD-PROX/parse_utils.c @@ -27,13 +27,14 @@ #include "quit.h" #include "cfgfile.h" -#include "ip6_addr.h" #include "parse_utils.h" #include "prox_globals.h" #include "prox_cfg.h" #include "log.h" #include "prox_lua.h" #include "prox_lua_types.h" +#include "prox_ipv6.h" +#include "prox_compat.h" #define MAX_NB_PORT_NAMES PROX_MAX_PORTS #define MAX_LEN_PORT_NAME 24 @@ -106,7 +107,7 @@ static struct var *var_lookup(const char *name) return NULL; } -static int parse_single_var(char *val, size_t len, const char *name) +int parse_single_var(char *val, size_t len, const char *name) { struct var *match; @@ -117,7 +118,7 @@ static int parse_single_var(char *val, size_t len, const char *name) match->name, match->val); return -1; } - strncpy(val, match->val, len); + prox_strncpy(val, match->val, len); return 0; } else { @@ -135,7 +136,7 @@ int parse_vars(char *val, size_t len, const char *name) { static char result[MAX_CFG_STRING_LEN]; static char cur_var[MAX_CFG_STRING_LEN]; - char parsed[2048]; + char parsed[MAX_CFG_STRING_LEN]; size_t name_len = strlen(name); enum parse_vars_state {NO_VAR, WHOLE_VAR, INLINE_VAR} state = NO_VAR; size_t result_len = 0; @@ -195,7 +196,7 @@ int parse_vars(char *val, size_t len, const char *name) break; } } - strncpy(val, result, len); + prox_strncpy(val, result, len); return 0; } @@ -310,7 +311,7 @@ int parse_ip(uint32_t *addr, const char *str2) return 0; } -int parse_ip4_cidr(struct ip4_subnet *val, const char *str2) +int parse_ip4_and_prefix(struct ip4_subnet *val, const char *str2) { char str[MAX_STR_LEN_PROC]; char *slash; @@ -340,10 +341,16 @@ int parse_ip4_cidr(struct ip4_subnet *val, const char *str2) if (parse_ip(&val->ip, str)) return -2; + return 0; +} + +int parse_ip4_cidr(struct ip4_subnet *val, const char *str2) +{ + int rc = parse_ip4_and_prefix(val, str2); /* Apply mask making all bits outside the prefix zero */ - val->ip &= ((int)(1 << 31)) >> (prefix - 1); + val->ip &= ((int)(1 << 31)) >> (val->prefix - 1); - return 0; + return rc; } int parse_ip6_cidr(struct ip6_subnet *val, const char *str2) @@ -405,12 +412,12 @@ int parse_ip6(struct ipv6_addr *addr, const char *str2) for (uint8_t i = 0, j = 0; i < ret; ++i, ++j) { if (*addr_parts[i] == 0) { - if (omitted == 0) { + if (omitted) { set_errf("Can only omit zeros once"); return -1; } omitted = 1; - j += 8 - ret; + j += 2 * (8 - ret) + 1; } else { uint16_t w = strtoll(addr_parts[i], NULL, 16); @@ -421,7 +428,7 @@ int parse_ip6(struct ipv6_addr *addr, const char *str2) return 0; } -int parse_mac(struct ether_addr *ether_addr, const char *str2) +int parse_mac(prox_rte_ether_addr *ether_addr, const char *str2) { char str[MAX_STR_LEN_PROC]; char *addr_parts[7]; @@ -430,6 +437,8 @@ int parse_mac(struct ether_addr *ether_addr, const char *str2) return -1; uint8_t ret = rte_strsplit(str, strlen(str), addr_parts, 7, ':'); + if (ret != 6) + ret = rte_strsplit(str, strlen(str), addr_parts, 7, ' '); if (ret != 6) { set_errf("Invalid MAC address format"); @@ -895,7 +904,7 @@ int parse_list_set(uint32_t *list, const char *str2, uint32_t max_list) effective_core = cur_core; if (list_count >= max_list) { - set_errf("Too many elements in list\n"); + set_errf("Too many elements in list"); return -1; } list[list_count++] = effective_core; @@ -920,10 +929,12 @@ int parse_kmg(uint32_t* val, const char *str2) if (*val >> 22) return -2; *val <<= 10; + // __attribute__ ((fallthrough)); case 'M': if (*val >> 22) return -2; *val <<= 10; + // __attribute__ ((fallthrough)); case 'K': if (*val >> 22) return -2; @@ -1046,7 +1057,7 @@ int parse_str(char* dst, const char *str2, size_t max_len) return -2; } - strncpy(dst, str, max_len); + prox_strncpy(dst, str, max_len); return 0; } @@ -1120,7 +1131,7 @@ int parse_remap(uint8_t *mapping, const char *str) set_errf("String too long (max supported: %d)", MAX_STR_LEN_PROC); return -2; } - strncpy(str_cpy, str, MAX_STR_LEN_PROC); + prox_strncpy(str_cpy, str, MAX_STR_LEN_PROC); ret = rte_strsplit(str_cpy, strlen(str_cpy), elements, PROX_MAX_PORTS + 1, ','); if (ret <= 0) { @@ -1177,7 +1188,7 @@ int add_port_name(uint32_t val, const char *str2) } pn = &port_names[nb_port_names]; - strncpy(pn->name, str, sizeof(pn->name)); + prox_strncpy(pn->name, str, sizeof(pn->name)); pn->id = val; ++nb_port_names; @@ -1195,7 +1206,7 @@ int set_self_var(const char *str) struct var *v = &vars[nb_vars]; - strncpy(v->name, "$self", strlen("$self")); + prox_strncpy(v->name, "$self", strlen("$self") + 1); sprintf(v->val, "%s", str); nb_vars++; @@ -1243,8 +1254,8 @@ int add_var(const char* name, const char *str2, uint8_t cli) v = &vars[nb_vars]; PROX_PANIC(strlen(name) > sizeof(v->name), "\tUnable to parse var %s: too long\n", name); PROX_PANIC(strlen(str) > sizeof(v->val), "\tUnable to parse var %s=%s: too long\n", name,str); - strncpy(v->name, name, sizeof(v->name)); - strncpy(v->val, str, sizeof(v->val)); + prox_strncpy(v->name, name, sizeof(v->name)); + prox_strncpy(v->val, str, sizeof(v->val)); v->cli = cli; ++nb_vars;