Add initial support for DPDK 21.11 25/73225/4
authorXavier Simonart <simonartxavier@gmail.com>
Sun, 20 Feb 2022 00:50:56 +0000 (00:50 +0000)
committerPatrice Buriez <patrice.buriez@chenapan.org>
Mon, 26 Dec 2022 09:40:40 +0000 (09:40 +0000)
Note that this patch simplistically removes some PROX features, because
they are not directly supported anymore by DPDK, since rte_eth_devices
is now private:
- reading and writing NIC register through PROX command line
- querying ixgbe HW statistics instead of getting them from DPDK

Also adjusted to following DPDK changes:
* struct rte_ether_hdr fields renamed:
  - d_addr -> dst_addr
  - s_addr -> src_addr
* struct rte_eth_rxmode field renamed:
  - max_rx_pkt_len -> mtu
* --master-lcore -> --main-lcore

Signed-off-by: Xavier Simonart <simonartxavier@gmail.com>
Signed-off-by: Patrice Buriez <patrice.buriez@chenapan.org>
Change-Id: I08445b3dd0f7fe471d9bc7cfb557bd3aeb2f50be

VNFs/DPPD-PROX/commands.c
VNFs/DPPD-PROX/defaults.c
VNFs/DPPD-PROX/meson.build
VNFs/DPPD-PROX/prox_args.c
VNFs/DPPD-PROX/prox_compat.h

index c5ffed8..1c4d702 100644 (file)
@@ -935,6 +935,7 @@ void cmd_portinfo(int port_id, char *dst, size_t max_len)
 
 void cmd_read_reg(uint8_t port_id, unsigned int id)
 {
+#if RTE_VERSION < RTE_VERSION_NUM(21,11,0,0)
        unsigned int val, rc;
        if (!port_is_active(port_id)) {
                return ;
@@ -946,6 +947,9 @@ void cmd_read_reg(uint8_t port_id, unsigned int id)
        else {
                plog_info("Register 0x%08X : %08X \n", id, val);
        }
+#else
+       plog_err("cmd_read_reg(%d, %d) not supported on this dpdk version\n", port_id, id);
+#endif
 }
 
 void cmd_reset_port(uint8_t portid)
@@ -989,12 +993,16 @@ void cmd_multicast(uint8_t port_id, unsigned int val, prox_rte_ether_addr *mac)
 
 void cmd_write_reg(uint8_t port_id, unsigned int id, unsigned int val)
 {
+#if RTE_VERSION < RTE_VERSION_NUM(21,11,0,0)
        if (!port_is_active(port_id)) {
                return ;
        }
 
        plog_info("writing 0x%08X %08X\n", id, val);
        write_reg(port_id, id, val);
+#else
+       plog_err("cmd_write_reg(%d, %d, %d) not supported on this dpdk version\n", port_id, id, val);
+#endif
 }
 
 void cmd_set_vlan_offload(uint8_t port_id, unsigned int val)
index b93b727..77582c7 100644 (file)
 static const struct rte_eth_conf default_port_conf = {
        .rxmode = {
                .mq_mode        = 0,
+#if RTE_VERSION < RTE_VERSION_NUM(21,11,0,0)
                .max_rx_pkt_len = PROX_MTU + PROX_RTE_ETHER_HDR_LEN + PROX_RTE_ETHER_CRC_LEN
+#else
+               .mtu = PROX_MTU
+#endif
        },
        .rx_adv_conf = {
                .rss_conf = {
index 564e5b5..4a37ad5 100644 (file)
@@ -26,6 +26,10 @@ project('dppd-prox', 'C',
 cc = meson.get_compiler('c')
 
 # Configure options for prox
+# Grab the DPDK version here "manually" as it is not available in the dpdk_dep
+# object
+dpdk_version = run_command('pkg-config', '--modversion', 'libdpdk').stdout()
+
 if get_option('bng_qinq').enabled()
        add_project_arguments('-DUSE_QINQ', language: 'c')
 endif
@@ -39,7 +43,11 @@ if get_option('prox_stats').enabled()
 endif
 
 if get_option('hw_direct_stats').enabled()
+if dpdk_version.version_compare('<21.11.0')
        add_project_arguments('-DPROX_HW_DIRECT_STATS',  language: 'c')
+else
+       warning('hw_direct_stats not supported on this dpdk version')
+endif
 endif
 
 if get_option('dbg')
@@ -132,10 +140,6 @@ deps = [dpdk_dep,
        dl_dep,
        lua_dep]
 
-# Grab the DPDK version here "manually" as it is not available in the dpdk_dep
-# object
-dpdk_version = run_command('pkg-config', '--modversion', 'libdpdk').stdout()
-
 # Explicitly add these to the dependency list
 deps += [cc.find_library('rte_bus_pci', required: true)]
 deps += [cc.find_library('rte_bus_vdev', required: true)]
@@ -150,7 +154,7 @@ sources = files(
        'task_init.c', 'handle_aggregator.c', 'handle_nop.c', 'handle_irq.c',
        'handle_arp.c', 'handle_impair.c', 'handle_lat.c', 'handle_qos.c',
        'handle_qinq_decap4.c', 'handle_routing.c', 'handle_untag.c',
-       'handle_mplstag.c', 'handle_qinq_decap6.c', 'rw_reg.c',
+       'handle_mplstag.c', 'handle_qinq_decap6.c',
        'handle_lb_qinq.c', 'handle_lb_pos.c', 'handle_lb_net.c',
        'handle_qinq_encap4.c', 'handle_qinq_encap6.c', 'handle_classify.c',
        'handle_l2fwd.c', 'handle_swap.c', 'handle_police.c', 'handle_acl.c',
@@ -175,6 +179,10 @@ sources = files(
        'stats_cons_cli.c', 'stats_parser.c', 'hash_set.c', 'prox_lua.c',
        'prox_malloc.c', 'prox_ipv6.c', 'prox_compat.c', 'handle_nsh.c')
 
+if dpdk_version.version_compare('<21.11.0')
+sources += files('rw_reg.c')
+endif
+
 # Include a couple of source files depending on DPDK support
 if cc.find_library('rte_pmd_aesni', required: false).found()
        sources += files('handle_esp.c')
index 0ef1f8b..09e903b 100644 (file)
@@ -655,10 +655,14 @@ static int get_port_cfg(unsigned sindex, char *str, void *data)
                        // 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
+#if RTE_VERSION < RTE_VERSION_NUM(21,11,0,0)
                        cfg->port_conf.rxmode.max_rx_pkt_len = cfg->mtu + PROX_RTE_ETHER_HDR_LEN + PROX_RTE_ETHER_CRC_LEN;
-                       if (cfg->port_conf.rxmode.max_rx_pkt_len > PROX_RTE_ETHER_MAX_LEN) {
+                       if (cfg->port_conf.rxmode.max_rx_pkt_len > PROX_RTE_ETHER_MAX_LEN)
+#else
+                       cfg->port_conf.rxmode.mtu = cfg->mtu;
+                       if (cfg->port_conf.rxmode.mtu > PROX_RTE_ETHER_MAX_LEN - PROX_RTE_ETHER_HDR_LEN - PROX_RTE_ETHER_CRC_LEN)
+#endif
                                cfg->requested_rx_offload |= DEV_RX_OFFLOAD_JUMBO_FRAME;
-                       }
                }
        }
 
@@ -2296,10 +2300,14 @@ int prox_setup_rte(const char *prog_name)
        sprintf(rte_arg[++argc], "-c%s", tmp);
        rte_argv[argc] = rte_arg[argc];
 #if RTE_VERSION >= RTE_VERSION_NUM(1,8,0,0)
+       uint32_t master_core = prox_cfg.master;
        if (prox_cfg.flags & DSF_USE_DUMMY_CPU_TOPO)
-               sprintf(rte_arg[++argc], "--master-lcore=%u", 0);
-       else
-               sprintf(rte_arg[++argc], "--master-lcore=%u", prox_cfg.master);
+               master_core = 0;
+#if RTE_VERSION < RTE_VERSION_NUM(21,11,0,0)
+       sprintf(rte_arg[++argc], "--master-lcore=%u", master_core);
+#else
+       sprintf(rte_arg[++argc], "--main-lcore=%u", master_core);
+#endif
        rte_argv[argc] = rte_arg[argc];
 #else
        /* For old DPDK versions, the master core had to be the first
index 404ce9e..4f5fa32 100644 (file)
@@ -210,7 +210,7 @@ typedef struct icmp_hdr prox_rte_icmp_hdr;
 #define PROX_RTE_IS_IPV4_MCAST IS_IPV4_MCAST
 #define prox_rte_is_same_ether_addr is_same_ether_addr
 #define prox_rte_is_zero_ether_addr is_zero_ether_addr
-#else
+#else //  >= 19.08
 
 #define PROX_RTE_ETHER_CRC_LEN RTE_ETHER_CRC_LEN
 #define PROX_RTE_ETHER_MIN_LEN RTE_ETHER_MIN_LEN
@@ -229,7 +229,16 @@ typedef struct icmp_hdr prox_rte_icmp_hdr;
 typedef struct rte_ipv6_hdr prox_rte_ipv6_hdr;
 typedef struct rte_ipv4_hdr prox_rte_ipv4_hdr;
 typedef struct rte_ether_addr prox_rte_ether_addr;
+#if RTE_VERSION < RTE_VERSION_NUM(21,11,0,0)
 typedef struct rte_ether_hdr prox_rte_ether_hdr;
+#else
+typedef struct prox_rte_ether_hdr
+{
+       struct rte_ether_addr d_addr; /**< Destination address. */
+       struct rte_ether_addr s_addr; /**< Source address. */
+       rte_be16_t ether_type; /**< Frame type. */
+} __rte_aligned(2) prox_rte_ether_hdr;
+#endif
 typedef struct rte_vlan_hdr prox_rte_vlan_hdr;
 typedef struct rte_vxlan_gpe_hdr prox_rte_vxlan_gpe_hdr;
 typedef struct rte_udp_hdr prox_rte_udp_hdr;