X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=VNFs%2FDPPD-PROX%2Fprox_args.c;h=df69f979f2884b561e01c3804347a7e7920822f3;hb=48f8c3d212644a33dd0abaaa1a0c71d4decaafdf;hp=fd8ea5240c8260c29a0f54dfa9d3c27742b75713;hpb=516aad7ecf88e968940d384a1f56dca4e42a279b;p=samplevnf.git diff --git a/VNFs/DPPD-PROX/prox_args.c b/VNFs/DPPD-PROX/prox_args.c index fd8ea524..df69f979 100644 --- a/VNFs/DPPD-PROX/prox_args.c +++ b/VNFs/DPPD-PROX/prox_args.c @@ -35,6 +35,7 @@ #include "defaults.h" #include "prox_lua.h" #include "cqm.h" +#include "prox_compat.h" #define MAX_RTE_ARGV 64 #define MAX_ARG_LEN 64 @@ -241,7 +242,7 @@ const char *get_cfg_dir(void) while (end > 0 && cfg_file[end] != '/') end--; - strncpy(dir, cfg_file, end); + prox_strncpy(dir, cfg_file, end); return dir; } @@ -262,7 +263,7 @@ static int get_lua_cfg(__attribute__((unused)) unsigned sindex, __attribute__((u struct lua_State *l = prox_lua(); char str_cpy[1024]; - strncpy(str_cpy, str, sizeof(str_cpy)); + prox_strncpy(str_cpy, str, sizeof(str_cpy)); uint32_t len = strlen(str_cpy); str_cpy[len++] = '\n'; str_cpy[len++] = 0; @@ -337,6 +338,9 @@ static int get_global_cfg(__attribute__((unused))unsigned sindex, char *str, voi if (STR_EQ(str, "enable bypass")) { return parse_flag(&pset->flags, DSF_ENABLE_BYPASS, pkey); } + if (STR_EQ(str, "heartbeat timeout")) { + return parse_int(&pset->heartbeat_timeout, pkey); + } if (STR_EQ(str, "cpe table map")) { /* The config defined ports through 0, 1, 2 ... which @@ -513,7 +517,7 @@ static int get_port_cfg(unsigned sindex, char *str, void *data) } else if (STR_EQ(str, "name")) { uint32_t val; - strncpy(cfg->name, pkey, MAX_NAME_SIZE); + prox_strncpy(cfg->name, pkey, MAX_NAME_SIZE); PROX_ASSERT(cur_if < PROX_MAX_PORTS); return add_port_name(cur_if, pkey); } @@ -530,6 +534,17 @@ static int get_port_cfg(unsigned sindex, char *str, void *data) } cfg->promiscuous = val; } + else if (STR_EQ(str, "multicast")) { + uint32_t val; + if (cfg->nb_mc_addr >= NB_MCAST_ADDR) { + plog_err("too many multicast addresses\n"); + return -1; + } + if (parse_mac(&cfg->mc_addr[cfg->nb_mc_addr], pkey)) { + return -1; + } + cfg->nb_mc_addr++ ; + } else if (STR_EQ(str, "lsc")) { cfg->lsc_set_explicitely = 1; uint32_t val; @@ -538,13 +553,60 @@ static int get_port_cfg(unsigned sindex, char *str, void *data) } cfg->lsc_val = val; } +#if RTE_VERSION >= RTE_VERSION_NUM(18,8,0,1) + else if (STR_EQ(str, "disable tx offload")) { + uint32_t val; + if (parse_int(&val, pkey)) { + return -1; + } + if (val) + cfg->disabled_tx_offload = val; + } +#endif else if (STR_EQ(str, "strip crc")) { uint32_t val; if (parse_bool(&val, pkey)) { return -1; } - cfg->port_conf.rxmode.hw_strip_crc = val; + if (val) + cfg->requested_rx_offload |= DEV_RX_OFFLOAD_CRC_STRIP; + else + cfg->requested_rx_offload &= ~DEV_RX_OFFLOAD_CRC_STRIP; + } + else if (STR_EQ(str, "vlan")) { +#if RTE_VERSION >= RTE_VERSION_NUM(18,8,0,1) + uint32_t val; + if (parse_bool(&val, pkey)) { + return -1; + } + if (val) { + cfg->requested_rx_offload |= DEV_RX_OFFLOAD_VLAN_STRIP; + cfg->requested_tx_offload |= DEV_TX_OFFLOAD_VLAN_INSERT; + } else { + cfg->requested_rx_offload &= ~DEV_RX_OFFLOAD_VLAN_STRIP; + cfg->requested_tx_offload &= ~DEV_TX_OFFLOAD_VLAN_INSERT; + } +#else + plog_warn("vlan option not supported : update DPDK at least to 18.08 to support this option\n"); +#endif + } + else if (STR_EQ(str, "mtu size")) { + uint32_t val; + if (parse_int(&val, pkey)) { + return -1; + } + if (val) { + cfg->mtu = val; + // A frame of 1526 bytes (1500 bytes mtu, 14 bytes hdr, 4 bytes crc and 8 bytes vlan) + // should not be considered as a jumbo frame. However rte_ethdev.c considers that + // the max_rx_pkt_len for a non jumbo frame is 1518 + cfg->port_conf.rxmode.max_rx_pkt_len = cfg->mtu + ETHER_HDR_LEN + ETHER_CRC_LEN; + if (cfg->port_conf.rxmode.max_rx_pkt_len > ETHER_MAX_LEN) { + cfg->requested_rx_offload |= DEV_RX_OFFLOAD_JUMBO_FRAME; + } + } } + else if (STR_EQ(str, "rss")) { uint32_t val; if (parse_bool(&val, pkey)) { @@ -805,9 +867,6 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) if (STR_EQ(str, "fast path handle arp")) { return parse_flag(&targ->runtime_flags, TASK_FP_HANDLE_ARP, pkey); } - if (STR_EQ(str, "multiple arp")) { - return parse_flag(&targ->flags, TASK_MULTIPLE_MAC, pkey); - } /* Using tx port name, only a _single_ port can be assigned to a task. */ if (STR_EQ(str, "tx port")) { @@ -958,7 +1017,8 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) return -1; } if (targ->pkt_size == sizeof(targ->pkt_inline)) { - set_errf("Inline packet definition can't be longer than 1518"); + set_errf("Inline packet definition can't be longer than %u", sizeof(targ->pkt_inline)); + return -1; } targ->pkt_inline[targ->pkt_size++] = byte; @@ -1203,7 +1263,6 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) } else if (STR_EQ(str, "mbuf size")) { - targ->mbuf_size_set_explicitely = 1; return parse_int(&targ->mbuf_size, pkey); } if (STR_EQ(str, "memcache size")) { @@ -1214,6 +1273,9 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) return parse_int(&targ->byte_offset, pkey); } + if (STR_EQ(str, "realtime scheduling")) { + return parse_flag(&lconf->flags, LCONF_FLAG_SCHED_RR, pkey); + } if (STR_EQ(str, "name")) { return parse_str(lconf->name, pkey, sizeof(lconf->name)); } @@ -1252,8 +1314,10 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) } if (strcmp(sub_mode_str, "l3") == 0) { prox_cfg.flags |= DSF_CTRL_PLANE_ENABLED; - targ->task_init->flag_features |= TASK_FEATURE_L3; - strcpy(targ->task_init->sub_mode_str, "l3"); + targ->flags |= TASK_ARG_L3; + strcpy(targ->sub_mode_str, "l3"); + } else { + strcpy(targ->sub_mode_str, targ->task_init->sub_mode_str); } return 0; } @@ -1290,7 +1354,7 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) } else if (STR_EQ(pkey, "packet")) return 0; - else if (STR_EQ(pkey, "packet")) { + else if (STR_EQ(pkey, "hw")) { targ->flags |= TASK_ARG_HW_SRC_MAC; return 0; } else { @@ -1300,7 +1364,12 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) targ->flags |= TASK_ARG_SRC_MAC_SET; return 0; } + if (STR_EQ(str, "igmp ipv4")) { /* IGMP Group */ + return parse_ip(&targ->igmp_address, pkey); + } if (STR_EQ(str, "gateway ipv4")) { /* Gateway IP address used when generating */ + if ((targ->flags & TASK_ARG_L3) == 0) + plog_warn("gateway ipv4 configured but L3 sub mode not enabled\n"); return parse_ip(&targ->gateway_ipv4, pkey); } if (STR_EQ(str, "local ipv4")) { /* source IP address to be used for packets */ @@ -1312,6 +1381,10 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) if (STR_EQ(str, "local ipv6")) { /* source IPv6 address to be used for packets */ return parse_ip6(&targ->local_ipv6, pkey); } + if (STR_EQ(str, "arp timeout")) + return parse_int(&targ->arp_timeout, pkey); + if (STR_EQ(str, "arp update time")) + return parse_int(&targ->arp_update_time, pkey); if (STR_EQ(str, "number of packets")) return parse_int(&targ->n_pkts, pkey); if (STR_EQ(str, "pipes")) { @@ -1517,6 +1590,11 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) return 0; } + if (STR_EQ(str, "irq debug")) { + parse_int(&targ->irq_debug, pkey); + return 0; + } + set_errf("Option '%s' is not known", str); /* fail on unknown keys */ return -1; @@ -1568,14 +1646,14 @@ int prox_parse_args(int argc, char **argv) } } - strncpy(prox_cfg.name, cfg_file + offset, MAX_NAME_SIZE); + prox_strncpy(prox_cfg.name, cfg_file + offset, MAX_NAME_SIZE); break; case 'v': plog_set_lvl(atoi(optarg)); break; case 'l': prox_cfg.log_name_pid = 0; - strncpy(prox_cfg.log_name, optarg, MAX_NAME_SIZE); + prox_strncpy(prox_cfg.log_name, optarg, MAX_NAME_SIZE); break; case 'p': prox_cfg.log_name_pid = 1; @@ -1597,7 +1675,7 @@ int prox_parse_args(int argc, char **argv) case 'r': if (!str_is_number(optarg) || strlen(optarg) > 11) return -1; - strncpy(prox_cfg.update_interval_str, optarg, sizeof(prox_cfg.update_interval_str)); + prox_strncpy(prox_cfg.update_interval_str, optarg, sizeof(prox_cfg.update_interval_str)); break; case 'o': if (prox_cfg.flags & DSF_DAEMON) @@ -1662,7 +1740,7 @@ int prox_parse_args(int argc, char **argv) (tmp2 = strchr(tmp, '='))) { *tmp2 = 0; tmp3[0] = '$'; - strncpy(tmp3 + 1, tmp, 63); + prox_strncpy(tmp3 + 1, tmp, 63); plog_info("\tAdding variable: %s = %s\n", tmp3, tmp2 + 1); ret = add_var(tmp3, tmp2 + 1, 1); if (ret == -2) { @@ -1953,7 +2031,7 @@ int prox_setup_rte(const char *prog_name) } if (rte_cfg.no_output) { - rte_set_log_level(0); + rte_log_set_global_level(0); } /* init EAL */ plog_info("\tEAL command line:");