X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=VNFs%2FDPPD-PROX%2Fparse_utils.c;h=8d846fd376682f22f7354cd4d29c9507f9ca505e;hb=9abafd4bbe0c1b92ceaa01a49b77f7e40c4f57e7;hp=af98ec2bc430defca27d4d0021100c80216c468b;hpb=67560734daab81c050a13d3b435d7eca4442c199;p=samplevnf.git diff --git a/VNFs/DPPD-PROX/parse_utils.c b/VNFs/DPPD-PROX/parse_utils.c index af98ec2b..8d846fd3 100644 --- a/VNFs/DPPD-PROX/parse_utils.c +++ b/VNFs/DPPD-PROX/parse_utils.c @@ -27,13 +27,13 @@ #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 @@ -175,7 +175,7 @@ int parse_vars(char *val, size_t len, const char *name) return -1; } - prox_strncpy(&cur_var[1], &name[start_var], var_len); + strncpy(&cur_var[1], &name[start_var], var_len); cur_var[1 + var_len] = 0; if (parse_single_var(parsed, sizeof(parsed), cur_var)) { return -1; @@ -311,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; @@ -341,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) @@ -406,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); @@ -422,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]; @@ -840,6 +846,72 @@ int parse_task_set(struct core_task_set *cts, const char *str2) return 0; } +int parse_ip_set(struct ip4_subnet *list, const char *str2, uint32_t max_list) +{ + char str[MAX_STR_LEN_PROC]; + char *parts[MAX_STR_LEN_PROC]; + int n = 0, rc; + + if (parse_vars(str, sizeof(str), str2)) + return -1; + int n_parts = rte_strsplit(str, strlen(str), parts, MAX_STR_LEN_PROC, ','); + for (int i = 0; i < n_parts; i++) { + if ((rc = parse_ip4_and_prefix(&list[i], parts[i])) < 0) { + set_errf("Unable to parse ip4/prefix"); + return -1; + } + } + return 0; +} + +int parse_int_set(uint32_t *list, const char *str2, uint32_t max_list) +{ + char str[MAX_STR_LEN_PROC]; + char *parts[MAX_STR_LEN_PROC]; + uint32_t n = 0; + + if (parse_vars(str, sizeof(str), str2)) + return -1; + + int n_parts = rte_strsplit(str, strlen(str), parts, MAX_STR_LEN_PROC, ','); + for (int i = 0; i < n_parts; i++) { + char *cur_part = parts[i]; + char *sub_parts[3]; + int n_sub_parts = rte_strsplit(cur_part, strlen(cur_part), sub_parts, 3, '-'); + uint32_t n1, n2; + int ret = 0; + + if (n_sub_parts == 1) { + if (n >= max_list - 1) { + set_errf("Too many entries\n"); + return -1; + } + if (parse_int(&list[n], sub_parts[0])) + return -1; + n++; + } else if (n_sub_parts == 2) { + if (parse_int(&n1, sub_parts[0])) + return -1; + if (parse_int(&n2, sub_parts[1])) + return -1; + if (n + n2 - n1 >= max_list) { + set_errf("Too many entries\n"); + return -1; + } + for (uint32_t j = n1; j < n2; j++) { + list[n++] = j; + } + } else if (n_sub_parts >= 3) { + set_errf("Multiple '-' characters in range syntax found"); + return -1; + } else { + set_errf("Invalid list syntax"); + return -1; + } + } + return 0; +} + int parse_list_set(uint32_t *list, const char *str2, uint32_t max_list) { char str[MAX_STR_LEN_PROC];