Add warning in case of wrong configuration (missing l3 submode)
[samplevnf.git] / VNFs / DPPD-PROX / prox_args.c
index 2703c22..0b9a7bc 100644 (file)
@@ -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
@@ -538,13 +539,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)) {
@@ -958,7 +1006,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;
@@ -1063,6 +1112,15 @@ static int get_core_cfg(unsigned sindex, char *str, void *data)
                                set_errf("Master core can only have one task\n");
                                return -1;
                        }
+                       // Initialize number of tasks to 1 for master, even if no task specified
+                       lconf->n_tasks_all = 1;
+                       lconf->active_task = 0;
+                       lconf->targs[lconf->active_task].task = 0;
+                       struct task_init* task_init = to_task_init(mode, "");
+                       if (task_init) {
+                               targ->mode = task_init->mode;
+                       }
+                       targ->task_init = task_init;
                        return 0;
                }
 
@@ -1194,7 +1252,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")) {
@@ -1231,8 +1288,22 @@ static int get_core_cfg(unsigned sindex, char *str, void *data)
 
                targ->task_init = to_task_init(mode_str, sub_mode_str);
                if (!targ->task_init) {
-                       set_errf("sub mode %s not supported for mode %s", sub_mode_str, mode_str);
-                       return -1;
+                       if (strcmp(sub_mode_str, "l3") != 0) {
+                               set_errf("sub mode %s not supported for mode %s", sub_mode_str, mode_str);
+                               return -1;
+                       }
+                       targ->task_init = to_task_init(mode_str, "");
+                       if (!targ->task_init) {
+                               set_errf("sub mode %s not supported for mode %s", sub_mode_str, mode_str);
+                               return -1;
+                       }
+               }
+               if (strcmp(sub_mode_str, "l3") == 0) {
+                       prox_cfg.flags |= DSF_CTRL_PLANE_ENABLED;
+                       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;
        }
@@ -1269,7 +1340,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 {
@@ -1280,11 +1351,10 @@ static int get_core_cfg(unsigned sindex, char *str, void *data)
                return 0;
        }
        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, "number of ip")) { /* Gateway IP address used when generating */
-               return parse_int(&targ->number_gen_ip, pkey);
-       }
        if (STR_EQ(str, "local ipv4")) { /* source IP address to be used for packets */
                return parse_ip(&targ->local_ipv4, pkey);
        }
@@ -1294,6 +1364,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")) {
@@ -1499,6 +1573,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;
@@ -1935,7 +2014,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:");