Support for xtesting
[samplevnf.git] / VNFs / DPPD-PROX / parse_utils.c
index 84ff8cc..8d846fd 100644 (file)
 
 #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];
@@ -923,12 +995,12 @@ int parse_kmg(uint32_t* val, const char *str2)
                if (*val >> 22)
                        return -2;
                *val <<= 10;
-                __attribute__ ((fallthrough));
+               // __attribute__ ((fallthrough));
        case 'M':
                if (*val >> 22)
                        return -2;
                *val <<= 10;
-                __attribute__ ((fallthrough));
+               // __attribute__ ((fallthrough));
        case 'K':
                if (*val >> 22)
                        return -2;