#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
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;
match->name, match->val);
return -1;
}
- strncpy(val, match->val, len);
+ prox_strncpy(val, match->val, len);
return 0;
}
else {
{
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;
break;
}
}
- strncpy(val, result, len);
+ prox_strncpy(val, result, len);
return 0;
}
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;
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)
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);
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];
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");
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;
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;
return -2;
}
- strncpy(dst, str, max_len);
+ prox_strncpy(dst, str, max_len);
return 0;
}
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) {
}
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;
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++;
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;