From bbb97803a36a5de0bb6ca6ce0518a6ef0666a22b Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Mon, 15 Jan 2024 09:37:20 +0800
Subject: [PATCH] adpat dpdk 23.11

---
 src/common/dpdk_common.c                   | 171 +++++++++++----------
 src/common/gazelle_parse_config.c          |   1 +
 src/lstack/Makefile                        |  50 +++---
 src/lstack/core/lstack_dpdk.c              |  34 ++--
 src/lstack/core/lstack_init.c              |   2 +
 src/lstack/core/lstack_protocol_stack.c    |  12 +-
 src/lstack/include/lstack_ethdev.h         |   8 +
 src/lstack/include/lstack_protocol_stack.h |   1 -
 src/lstack/netif/lstack_ethdev.c           |   8 +
 src/lstack/netif/lstack_vdev.c             |   4 +-
 src/ltran/CMakeLists.txt                   |  33 +++-
 src/ltran/ltran_dfx.c                      |  20 +--
 src/ltran/ltran_ethdev.c                   |  29 +++-
 src/ltran/ltran_forward.c                  |  14 ++
 src/ltran/ltran_stack.c                    |   1 +
 src/ltran/ltran_timer.c                    |   1 +
 src/ltran/main.c                           |   6 +
 17 files changed, 254 insertions(+), 141 deletions(-)

diff --git a/src/common/dpdk_common.c b/src/common/dpdk_common.c
index 62278c2..c0c4f63 100644
--- a/src/common/dpdk_common.c
+++ b/src/common/dpdk_common.c
@@ -10,18 +10,21 @@
 * See the Mulan PSL v2 for more details.
 */
 
-#include <rte_kni.h>
+#include <securec.h>
 #include <rte_bus_pci.h>
 #include <rte_ethdev.h>
 #include <rte_bus_pci.h>
 #include <rte_mbuf.h>
 #include <rte_ethdev.h>
-#include <securec.h>
+#include <rte_version.h>
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
+#include <rte_kni.h>
+#endif
+
+#include <lwip/dpdk_version.h>
 
 #include "dpdk_common.h"
 
-#define GAZELLE_KNI_IFACES_NUM               1
-#define GAZELLE_KNI_READ_SIZE                32
 #define GAZELLE_MAX_PKT_SZ                   2048
 
 #ifdef LTRAN_COMPILE
@@ -34,6 +37,9 @@
 #define  COMMON_INFO(fmt, ...)   LSTACK_LOG(INFO, LSTACK, fmt, ##__VA_ARGS__)
 #endif
 
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
+#define GAZELLE_KNI_IFACES_NUM               1
+#define GAZELLE_KNI_READ_SIZE                32
 struct rte_kni *g_pkni = NULL;
 static volatile bool g_kni_started = false;
 
@@ -79,84 +85,6 @@ static int32_t kni_config_network_interface(uint16_t port_id, uint8_t if_up)
     return ret;
 }
 
-void eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info)
-{
-    uint64_t rx_ol = 0;
-    uint64_t tx_ol = 0;
-    uint64_t rx_ol_capa = dev_info->rx_offload_capa;
-    uint64_t tx_ol_capa = dev_info->tx_offload_capa;
-
-    // rx ip
-    if (rx_ol_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {
-        rx_ol |= DEV_RX_OFFLOAD_IPV4_CKSUM;
-        COMMON_INFO("DEV_RX_OFFLOAD_IPV4_CKSUM\n");
-    }
-
-    // rx tcp
-    if (rx_ol_capa & DEV_RX_OFFLOAD_TCP_CKSUM) {
-        rx_ol |= DEV_RX_OFFLOAD_TCP_CKSUM;
-        COMMON_INFO("DEV_RX_OFFLOAD_TCP_CKSUM\n");
-    }
-
-    // rx udp
-    if (rx_ol_capa & DEV_RX_OFFLOAD_UDP_CKSUM) {
-        rx_ol |= DEV_RX_OFFLOAD_UDP_CKSUM;
-        COMMON_INFO("DEV_RX_OFFLOAD_UDP_CKSUM\n");
-    }
-
-    // rx vlan
-    if (rx_ol_capa & DEV_RX_OFFLOAD_VLAN_STRIP) {
-        rx_ol |= DEV_RX_OFFLOAD_VLAN_STRIP;
-        COMMON_INFO("DEV_RX_OFFLOAD_VLAN_STRIP\n");
-    }
-
-    // tx ip
-    if (tx_ol_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {
-        tx_ol |= DEV_TX_OFFLOAD_IPV4_CKSUM;
-        COMMON_INFO("DEV_TX_OFFLOAD_IPV4_CKSUM\n");
-    }
-
-    // tx tcp
-    if (tx_ol_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {
-        tx_ol |= DEV_TX_OFFLOAD_TCP_CKSUM;
-        COMMON_INFO("DEV_TX_OFFLOAD_TCP_CKSUM\n");
-    }
-
-    // tx udp
-    if (tx_ol_capa & DEV_TX_OFFLOAD_UDP_CKSUM) {
-        tx_ol |= DEV_TX_OFFLOAD_UDP_CKSUM;
-        COMMON_INFO("DEV_TX_OFFLOAD_UDP_CKSUM\n");
-    }
-
-    // tx tso
-    if (tx_ol_capa & DEV_TX_OFFLOAD_TCP_TSO) {
-        tx_ol |= (DEV_TX_OFFLOAD_TCP_TSO | DEV_TX_OFFLOAD_MULTI_SEGS);
-        COMMON_INFO("DEV_TX_OFFLOAD_TCP_TSO\n");
-    }
-
-    // tx vlan
-    if (tx_ol_capa & DEV_TX_OFFLOAD_VLAN_INSERT) {
-        tx_ol |= DEV_TX_OFFLOAD_VLAN_INSERT;
-        COMMON_INFO("DEV_TX_OFFLOAD_VLAN_INSERT\n");
-    }
-
-    if (!(rx_ol & DEV_RX_OFFLOAD_UDP_CKSUM) ||
-        !(rx_ol & DEV_RX_OFFLOAD_TCP_CKSUM) ||
-        !(rx_ol & DEV_RX_OFFLOAD_IPV4_CKSUM)) {
-        rx_ol = 0;
-    }
-    if (!(tx_ol & DEV_TX_OFFLOAD_UDP_CKSUM) ||
-        !(tx_ol & DEV_TX_OFFLOAD_TCP_CKSUM) ||
-        !(tx_ol & DEV_TX_OFFLOAD_IPV4_CKSUM)) {
-        tx_ol = 0;
-    }
-
-    conf->rxmode.offloads = rx_ol;
-    conf->txmode.offloads = tx_ol;
-
-    COMMON_INFO("Set checksum offloads\n");
-}
-
 int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool)
 {
     int32_t ret;
@@ -262,3 +190,82 @@ void kni_process_rx(uint16_t port)
         }
     }
 }
+#endif
+
+void eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info)
+{
+    uint64_t rx_ol = 0;
+    uint64_t tx_ol = 0;
+    uint64_t rx_ol_capa = dev_info->rx_offload_capa;
+    uint64_t tx_ol_capa = dev_info->tx_offload_capa;
+
+    // rx ip
+    if (rx_ol_capa & RTE_ETH_RX_OFFLOAD_IPV4_CKSUM) {
+        rx_ol |= RTE_ETH_RX_OFFLOAD_IPV4_CKSUM;
+        COMMON_INFO("RTE_ETH_RX_OFFLOAD_IPV4_CKSUM\n");
+    }
+
+    // rx tcp
+    if (rx_ol_capa & RTE_ETH_RX_OFFLOAD_TCP_CKSUM) {
+        rx_ol |= RTE_ETH_RX_OFFLOAD_TCP_CKSUM;
+        COMMON_INFO("RTE_ETH_RX_OFFLOAD_TCP_CKSUM\n");
+    }
+
+    // rx udp
+    if (rx_ol_capa & RTE_ETH_RX_OFFLOAD_UDP_CKSUM) {
+        rx_ol |= RTE_ETH_RX_OFFLOAD_UDP_CKSUM;
+        COMMON_INFO("RTE_ETH_RX_OFFLOAD_UDP_CKSUM\n");
+    }
+
+    // rx vlan
+    if (rx_ol_capa & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) {
+        rx_ol |= RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
+        COMMON_INFO("RTE_ETH_RX_OFFLOAD_VLAN_STRIP\n");
+    }
+
+    // tx ip
+    if (tx_ol_capa & RTE_ETH_TX_OFFLOAD_IPV4_CKSUM) {
+        tx_ol |= RTE_ETH_TX_OFFLOAD_IPV4_CKSUM;
+        COMMON_INFO("RTE_ETH_TX_OFFLOAD_IPV4_CKSUM\n");
+    }
+
+    // tx tcp
+    if (tx_ol_capa & RTE_ETH_TX_OFFLOAD_TCP_CKSUM) {
+        tx_ol |= RTE_ETH_TX_OFFLOAD_TCP_CKSUM;
+        COMMON_INFO("RTE_ETH_TX_OFFLOAD_TCP_CKSUM\n");
+    }
+
+    // tx udp
+    if (tx_ol_capa & RTE_ETH_TX_OFFLOAD_UDP_CKSUM) {
+        tx_ol |= RTE_ETH_TX_OFFLOAD_UDP_CKSUM;
+        COMMON_INFO("RTE_ETH_TX_OFFLOAD_UDP_CKSUM\n");
+    }
+
+    // tx tso
+    if (tx_ol_capa & RTE_ETH_TX_OFFLOAD_TCP_TSO) {
+        tx_ol |= (RTE_ETH_TX_OFFLOAD_TCP_TSO | RTE_ETH_TX_OFFLOAD_MULTI_SEGS);
+        COMMON_INFO("RTE_ETH_TX_OFFLOAD_TCP_TSO\n");
+    }
+
+    // tx vlan
+    if (tx_ol_capa & RTE_ETH_TX_OFFLOAD_VLAN_INSERT) {
+        tx_ol |= RTE_ETH_TX_OFFLOAD_VLAN_INSERT;
+        COMMON_INFO("RTE_ETH_TX_OFFLOAD_VLAN_INSERT\n");
+    }
+
+    if (!(rx_ol & RTE_ETH_RX_OFFLOAD_UDP_CKSUM) ||
+        !(rx_ol & RTE_ETH_RX_OFFLOAD_TCP_CKSUM) ||
+        !(rx_ol & RTE_ETH_RX_OFFLOAD_IPV4_CKSUM)) {
+        rx_ol = 0;
+    }
+    if (!(tx_ol & RTE_ETH_TX_OFFLOAD_UDP_CKSUM) ||
+        !(tx_ol & RTE_ETH_TX_OFFLOAD_TCP_CKSUM) ||
+        !(tx_ol & RTE_ETH_TX_OFFLOAD_IPV4_CKSUM)) {
+        tx_ol = 0;
+    }
+
+    conf->rxmode.offloads = rx_ol;
+    conf->txmode.offloads = tx_ol;
+
+    COMMON_INFO("Set checksum offloads\n");
+}
diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c
index 1adce78..0553f0d 100644
--- a/src/common/gazelle_parse_config.c
+++ b/src/common/gazelle_parse_config.c
@@ -15,6 +15,7 @@
 #include <limits.h>
 #include <stdint.h>
 #include <unistd.h>
+#include <ctype.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 
diff --git a/src/lstack/Makefile b/src/lstack/Makefile
index d585040..df1ddaa 100644
--- a/src/lstack/Makefile
+++ b/src/lstack/Makefile
@@ -7,17 +7,17 @@
 # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
 # PURPOSE.
 # See the Mulan PSL v2 for more details.
-
 LSTACK_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
 ROOT_DIR := $(dir $(abspath $(LSTACK_DIR)))
 
 LWIP_INCLUDE_FILE ?= /usr/include/lwip
 LIB_PATH ?= /usr/lib64
 
-ifeq ($(DPDK_VERSION_1911), 1)
-	DPDK_INCLUDE_FILE ?= /usr/include/dpdk
+DPDK_VERSION := $(shell rpm -q --queryformat '%{VERSION}' dpdk)
+ifeq ($(DPDK_VERSION),21.11)
+    DPDK_INCLUDE_FILE := /usr/local/include
 else
-	DPDK_INCLUDE_FILE ?= /usr/local/include/
+    DPDK_INCLUDE_FILE := /usr/include/dpdk
 endif
 
 AR = ar
@@ -77,34 +77,36 @@ LIBRTE_LIB = $(LIB_PATH)/librte_pci.so \
              $(LIB_PATH)/librte_gro.so \
              $(LIB_PATH)/librte_ring.so \
              $(LIB_PATH)/librte_mbuf.so \
-             $(LIB_PATH)/librte_kni.so \
              $(LIB_PATH)/librte_kvargs.so \
              $(LIB_PATH)/librte_bus_vdev.so \
              $(LIB_PATH)/librte_net.so \
              $(LIB_PATH)/librte_ethdev.so \
-             $(LIB_PATH)/librte_pdump.so \
+             $(LIB_PATH)/librte_pdump.so
+
+ifeq ($(shell expr $(DPDK_VERSION) \< 23.11), 1)
+	LIBRTE_LIB += $(LIB_PATH)/librte_kni.so
+endif
 
-ifeq ($(DPDK_VERSION_1911), 1)
-	CFLAGS += -DDPDK_VERSION_1911=1
+ifeq ($(DPDK_VERSION), 19.11)
 	LIBRTE_LIB += $(LIB_PATH)/librte_pmd_pcap.so \
-	              $(LIB_PATH)/librte_pmd_bond.so \
-	              $(LIB_PATH)/librte_pmd_hinic.so \
-	              $(LIB_PATH)/librte_pmd_ixgbe.so \
-	              $(LIB_PATH)/librte_pmd_virtio.so
-	ifneq ($(ARCH), loongarch64)
-		LIBRTE_LIB += $(LIB_PATH)/librte_pmd_i40e.so
-	endif
+                  $(LIB_PATH)/librte_pmd_bond.so \
+                  $(LIB_PATH)/librte_pmd_hinic.so \
+                  $(LIB_PATH)/librte_pmd_ixgbe.so \
+                  $(LIB_PATH)/librte_pmd_virtio.so
+    ifneq ($(ARCH), loongarch64)
+	LIBRTE_LIB += $(LIB_PATH)/librte_pmd_i40e.so
+    endif
 else
 	LIBRTE_LIB += $(LIB_PATH)/librte_net_pcap.so \
-	              $(LIB_PATH)/librte_net_bond.so \
-	              $(LIB_PATH)/librte_net_hinic.so \
-	              $(LIB_PATH)/librte_net_ixgbe.so \
-	              $(LIB_PATH)/librte_net_virtio.so \
-	              $(LIB_PATH)/librte_telemetry.so \
-	              $(LIB_PATH)/librte_pcapng.so
-	ifneq ($(ARCH), loongarch64)
-		LIBRTE_LIB += $(LIB_PATH)/librte_net_i40e.so
-	endif
+                      $(LIB_PATH)/librte_net_bond.so \
+                      $(LIB_PATH)/librte_net_hinic.so \
+                      $(LIB_PATH)/librte_net_ixgbe.so \
+                      $(LIB_PATH)/librte_net_virtio.so \
+                      $(LIB_PATH)/librte_telemetry.so \
+                      $(LIB_PATH)/librte_pcapng.so
+    ifneq ($(ARCH), loongarch64)
+	LIBRTE_LIB += $(LIB_PATH)/librte_net_i40e.so
+    endif
 endif
 
 DEP_LIBS = $(LWIP_LIB) $(LIBRTE_LIB)
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index 630b043..7f1ceb8 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -27,7 +27,10 @@
 #include <rte_malloc.h>
 #include <rte_bus.h>
 #include <rte_errno.h>
+#include <rte_version.h>
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
 #include <rte_kni.h>
+#endif
 #include <rte_pdump.h>
 #include <rte_thash.h>
 #include <lwip/posix_api.h>
@@ -35,6 +38,7 @@
 #include <lwip/pbuf.h>
 #include <lwip/reg_sock.h>
 #include <lwip/priv/tcp_priv.h>
+
 #include <rte_eth_bond_8023ad.h>
 #include <rte_eth_bond.h>
 #include <rte_ethdev.h>
@@ -59,8 +63,10 @@ struct eth_params {
     struct rte_eth_rxconf rx_conf;
     struct rte_eth_txconf tx_conf;
 };
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
 struct rte_kni;
 static struct rte_bus *g_pci_bus = NULL;
+#endif
 
 #define RSS_HASH_KEY_LEN    40
 static uint8_t g_default_rss_key[] = {
@@ -368,9 +374,9 @@ static struct eth_params *alloc_eth_params(uint16_t port_id, uint16_t nb_queues)
     eth_params->nb_queues = nb_queues;
     eth_params->nb_rx_desc = get_global_cfg_params()->nic.rxqueue_size;
     eth_params->nb_tx_desc = get_global_cfg_params()->nic.txqueue_size;
-    eth_params->conf.link_speeds = ETH_LINK_SPEED_AUTONEG;
-    eth_params->conf.txmode.mq_mode = ETH_MQ_TX_NONE;
-    eth_params->conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
+    eth_params->conf.link_speeds = RTE_ETH_LINK_SPEED_AUTONEG;
+    eth_params->conf.txmode.mq_mode = RTE_ETH_MQ_TX_NONE;
+    eth_params->conf.rxmode.mq_mode = RTE_ETH_MQ_RX_NONE;
 
     return eth_params;
 }
@@ -388,7 +394,7 @@ uint64_t get_eth_params_tx_ol(void)
 static int eth_params_rss(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info)
 {
     int rss_enable = 0;
-    uint64_t def_rss_hf = ETH_RSS_TCP | ETH_RSS_UDP | ETH_RSS_IP;
+    uint64_t def_rss_hf = RTE_ETH_RSS_TCP | RTE_ETH_RSS_UDP | RTE_ETH_RSS_IP;
     struct rte_eth_rss_conf rss_conf = {
         g_default_rss_key,
         RSS_HASH_KEY_LEN,
@@ -404,7 +410,7 @@ static int eth_params_rss(struct rte_eth_conf *conf, struct rte_eth_dev_info *de
     if (rss_conf.rss_hf) {
         rss_enable = 1;
         conf->rx_adv_conf.rss_conf = rss_conf;
-        conf->rxmode.mq_mode = ETH_MQ_RX_RSS;
+        conf->rxmode.mq_mode = RTE_ETH_MQ_RX_RSS;
 
         LSTACK_LOG(INFO, LSTACK, "set rss_hf: %lx\n", rss_conf.rss_hf);
     }
@@ -427,8 +433,8 @@ static void rss_setup(const int port_id, const uint16_t nb_queues)
         return;
     }
 
-    reta_conf_size = dev_info.reta_size / RTE_RETA_GROUP_SIZE;
-    if (dev_info.reta_size % RTE_RETA_GROUP_SIZE) {
+    reta_conf_size = dev_info.reta_size / RTE_ETH_RETA_GROUP_SIZE;
+    if (dev_info.reta_size % RTE_ETH_RETA_GROUP_SIZE) {
         reta_conf_size += 1;
     }
 
@@ -438,8 +444,8 @@ static void rss_setup(const int port_id, const uint16_t nb_queues)
     }
     for (i = 0; i < dev_info.reta_size; i++) {
         struct rte_eth_rss_reta_entry64 *one_reta_conf =
-            &reta_conf[i / RTE_RETA_GROUP_SIZE];
-        one_reta_conf->reta[i % RTE_RETA_GROUP_SIZE] = i % nb_queues;
+            &reta_conf[i / RTE_ETH_RETA_GROUP_SIZE];
+        one_reta_conf->reta[i % RTE_ETH_RETA_GROUP_SIZE] = i % nb_queues;
     }
 
     for (i = 0; i < reta_conf_size; i++) {
@@ -518,7 +524,11 @@ int32_t dpdk_ethdev_init(int port_id, bool bond_port)
                 return -1;
             }
 
+#if RTE_VERSION >= RTE_VERSION_NUM(23, 11, 0, 0)
+            ret = rte_eth_bond_member_add(port_id, slave_port_id[i]);
+#else
             ret = rte_eth_bond_slave_add(port_id, slave_port_id[i]);
+#endif
             if (ret != 0) {
                 LSTACK_LOG(ERR, LSTACK, "dpdk add slave port failed ret = %d\n", ret);
                 return -1;
@@ -671,6 +681,7 @@ int32_t dpdk_init_lstack_kni(void)
     return 0;
 }
 
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
 void dpdk_skip_nic_init(void)
 {
     /* when lstack init nic again, ltran can't read pkts from nic. unregister pci_bus to avoid init nic in lstack */
@@ -686,6 +697,7 @@ void dpdk_restore_pci(void)
         rte_bus_register(g_pci_bus);
     }
 }
+#endif
 
 int32_t init_dpdk_ethdev(void)
 {
@@ -849,7 +861,11 @@ void dpdk_nic_xstats_get(struct gazelle_stack_dfx_data *dfx, uint16_t port_id)
     if (strcmp(dev_info.driver_name, "net_bonding") == 0) {
         uint16_t slaves[RTE_MAX_ETHPORTS];
         int slave_count;
+#if RTE_VERSION >= RTE_VERSION_NUM(23, 11, 0, 0)
+        slave_count = rte_eth_bond_members_get(port_id, slaves, RTE_MAX_ETHPORTS);
+#else
         slave_count = rte_eth_bond_slaves_get(port_id, slaves, RTE_MAX_ETHPORTS);
+#endif
         if (slave_count <= 0) {
             LSTACK_LOG(ERR, LSTACK, "rte_eth_bond_slaves_get failed.\n");
             return;
diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c
index fef2942..31fd91d 100644
--- a/src/lstack/core/lstack_init.c
+++ b/src/lstack/core/lstack_init.c
@@ -116,7 +116,9 @@ void gazelle_exit(void)
         stack_group_exit();
     }
     if (!use_ltran()) {
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
         dpdk_kni_release();
+#endif
     }
 }
 
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 1fa7373..a24fc4c 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -13,8 +13,6 @@
 #include <pthread.h>
 #include <stdatomic.h>
 
-#include <rte_kni.h>
-
 #include <lwip/sockets.h>
 #include <lwip/tcpip.h>
 #include <lwip/tcp.h>
@@ -38,6 +36,10 @@
 #include "lstack_stack_stat.h"
 #include "lstack_protocol_stack.h"
 
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
+#include <rte_kni.h>
+#endif
+
 #define KERNEL_EVENT_10us               10
 
 static PER_THREAD struct protocol_stack *g_stack_p = NULL;
@@ -453,7 +455,9 @@ int stack_polling(uint32_t wakeup_tick)
     int force_quit;
     struct cfg_params *cfg = get_global_cfg_params();
     uint8_t use_ltran_flag = cfg->use_ltran;
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
     bool kni_switch = cfg->kni_switch;
+#endif
     bool use_sockmap = cfg->use_sockmap;
     bool stack_mode_rtc = cfg->stack_mode_rtc;
     uint32_t rpc_number = cfg->rpc_number;
@@ -486,6 +490,7 @@ int stack_polling(uint32_t wakeup_tick)
         }
     }
 
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
     /* run to completion mode currently does not support kni */
     /* KNI requests are generally low-rate I/Os,
     * so processing KNI requests only in the thread with queue_id No.0 is sufficient. */
@@ -495,6 +500,7 @@ int stack_polling(uint32_t wakeup_tick)
             kni_handle_rx(stack->port_id);
         }
     }
+#endif
     return force_quit;
 }
 
@@ -950,7 +956,9 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack
         return;
     }
     copy_mbuf(mbuf_copy, mbuf);
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
     kni_handle_tx(mbuf_copy);
+#endif
     return;
 }
 
diff --git a/src/lstack/include/lstack_ethdev.h b/src/lstack/include/lstack_ethdev.h
index 326bd1b..3252906 100644
--- a/src/lstack/include/lstack_ethdev.h
+++ b/src/lstack/include/lstack_ethdev.h
@@ -13,6 +13,9 @@
 #ifndef __GAZELLE_ETHDEV_H__
 #define __GAZELLE_ETHDEV_H__
 
+#include <rte_eal.h>
+#include <rte_version.h>
+
 #define INVAILD_PROCESS_IDX 255
 
 enum port_type {
@@ -46,7 +49,12 @@ void eth_dev_recv(struct rte_mbuf *mbuf, struct protocol_stack *stack);
 
 int recv_pkts_from_other_process(int process_index, void* arg);
 int32_t check_params_from_primary(void);
+
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
 void kni_handle_rx(uint16_t port_id);
+void kni_handle_tx(struct rte_mbuf *mbuf);
+#endif
+
 void delete_user_process_port(uint16_t dst_port, enum port_type type);
 void add_user_process_port(uint16_t dst_port, uint8_t process_idx, enum port_type type);
 void delete_flow_director(uint32_t dst_ip, uint16_t src_port, uint16_t dst_port);
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index 8e2e807..c681547 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -181,5 +181,4 @@ void stack_recvlist_count(struct rpc_msg *msg);
 void stack_exit_by_rpc(struct rpc_msg *msg);
 
 int stack_polling(uint32_t wakeup_tick);
-void kni_handle_tx(struct rte_mbuf *mbuf);
 #endif
diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c
index 2e11670..5b0f83e 100644
--- a/src/lstack/netif/lstack_ethdev.c
+++ b/src/lstack/netif/lstack_ethdev.c
@@ -13,7 +13,11 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 
+#include <rte_eal.h>
+#include <rte_version.h>
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
 #include <rte_kni.h>
+#endif
 #include <rte_ethdev.h>
 #include <rte_malloc.h>
 #include <rte_ether.h>
@@ -755,6 +759,7 @@ int distribute_pakages(struct rte_mbuf *mbuf)
     return TRANSFER_KERNEL;
 }
 
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
 void kni_handle_rx(uint16_t port_id)
 {
     struct rte_mbuf *pkts_burst[PACKET_READ_SIZE];
@@ -793,6 +798,7 @@ void kni_handle_tx(struct rte_mbuf *mbuf)
         rte_pktmbuf_free(mbuf);
     }
 }
+#endif
 
 /* optimized eth_dev_poll() in lstack */
 int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, uint8_t use_ltran_flag, uint32_t nic_read_number)
@@ -835,7 +841,9 @@ int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, uint8_t use_ltran_fla
         if (likely(transfer_type == TRANSFER_CURRENT_THREAD)) {
             eth_dev_recv(stack->pkts[i], stack);
         } else if (transfer_type == TRANSFER_KERNEL) {
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
             kni_handle_tx(stack->pkts[i]);
+#endif
         } else {
             /* transfer to other thread */
         }
diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c
index c845f7a..fe17f59 100644
--- a/src/lstack/netif/lstack_vdev.c
+++ b/src/lstack/netif/lstack_vdev.c
@@ -22,6 +22,8 @@
 #include <rte_net.h>
 #include <netif/ethernet.h>
 
+#include <lwip/dpdk_version.h>
+
 #include "lstack_cfg.h"
 #include "lstack_dpdk.h"
 #include "lstack_ethdev.h"
@@ -85,7 +87,7 @@ static uint32_t vdev_rx_poll(struct protocol_stack *stack, struct rte_mbuf **pkt
 
     /* skip gro when tcp/ip cksum offloads disable */
     if (get_protocol_stack_group()->rx_offload == 0 || (get_global_cfg_params()->nic.vlan_mode >= 0
-            && !(get_protocol_stack_group()->rx_offload & DEV_RX_OFFLOAD_VLAN_STRIP))) {
+            && !(get_protocol_stack_group()->rx_offload & RTE_ETH_RX_OFFLOAD_VLAN_STRIP))) {
         return pkt_num;
     }
 
diff --git a/src/ltran/CMakeLists.txt b/src/ltran/CMakeLists.txt
index e098a77..f739ceb 100644
--- a/src/ltran/CMakeLists.txt
+++ b/src/ltran/CMakeLists.txt
@@ -27,22 +27,38 @@ if($ENV{GAZELLE_COVERAGE_ENABLE})
 	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ftest-coverage -fprofile-arcs")
 endif($ENV{GAZELLE_COVERAGE_ENABLE})
 
-if($ENV{DPDK_VERSION_1911})
+execute_process(
+    COMMAND rpm -qa dpdk
+    OUTPUT_VARIABLE DPDK_VERSION_FULL
+    OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+string(REGEX MATCH "[0-9]+\\.[0-9]+" DPDK_VERSION ${DPDK_VERSION_FULL})
+
+if (DPDK_VERSION STREQUAL "21.11")
+    set(DPDK_DIR /usr/local/include/)
+else()
     set(DPDK_DIR /usr/include/dpdk)
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DDPDK_VERSION_1911=1")
+endif()
+
+if (DPDK_VERSION STREQUAL "19.11")
     set(DPDK_LINK_FLAGS "-Wl,-lrte_pmd_bond -Wl,-lrte_pmd_hinic -Wl,-lrte_pmd_ixgbe \
     -Wl,-lrte_pmd_pcap -Wl,-lrte_pmd_virtio")
     if(NOT CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "loongarch64")
         set(DPDK_LINK_FLAGS "${DPDK_LINK_FLAGS} -Wl,-lrte_pmd_i40e")
     endif()
 else()
-    set(DPDK_DIR /usr/local/include/)
     set(DPDK_LINK_FLAGS "-Wl,-lrte_net_bond -Wl,-lrte_net_hinic -Wl,-lrte_net_ixgbe \
     -Wl,-lpcap -Wl,-lrte_net_pcap -Wl,-lrte_net_virtio -Wl,-lrte_pcapng -Wl,-lrte_telemetry")
     if(NOT CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "loongarch64")
         set(DPDK_LINK_FLAGS "${DPDK_LINK_FLAGS} -Wl,-lrte_net_i40e")
     endif()
-endif($ENV{DPDK_VERSION_1911})
+endif()
+
+if (DPDK_VERSION  GREATER_EQUAL 23.11)
+    set(DPDK_LINK_FLAGS "${DPDK_LINK_FLAGS} -lrte_log -larchive -Wl,-lrte_eal")
+else()
+    set(DPDK_LINK_FLAGS "${DPDK_LINK_FLAGS} -lrte_kni -Wl,-Bstatic -lrte_eal -Wl,-Bdynamic")
+endif()
 
 add_executable(ltran main.c ltran_param.c ltran_config.c ltran_ethdev.c ltran_stat.c ltran_errno.c
 				ltran_monitor.c ltran_instance.c ltran_stack.c ltran_tcp_conn.c ltran_tcp_sock.c
@@ -55,16 +71,19 @@ target_compile_options(ltran PRIVATE -fno-strict-aliasing -D__ARM_FEATURE_CRC32=
                -DRTE_MACHINE_CPUFLAG_SHA1 -DRTE_MACHINE_CPUFLAG_SHA2 -include rte_config.h
                -D_GNU_SOURCE -W -Wall -Wstrict-prototypes -Wmissing-declarations -Wmissing-prototypes -Wold-style-definition
                -Wpointer-arith -Wcast-qual -Wnested-externs -Wformat-nonliteral -Wformat-security -Wundef
-               -Wdeprecated -Wwrite-strings -Wno-implicit-fallthrough -D_FORTIFY_SOURCE=2)
-if(NOT CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "sw_64")
+               -Wdeprecated -Wwrite-strings -Wno-implicit-fallthrough -D_FORTIFY_SOURCE=2 -Wno-error=deprecated-declarations)
+
+# gcc coredump in openEuler-20.03-LTS-XX aarch64 when add -march=native 
+if(NOT CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "sw_64|aarch64" )
     target_compile_options(ltran PRIVATE -march=native -Wcast-align)
 endif()
 
 target_link_libraries(ltran PRIVATE config boundscheck rte_pdump -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -Wtrampolines)
+
 set_target_properties(ltran PROPERTIES LINK_FLAGS "-L$ENV{DPDK_LIB_PATH} -Wl,--no-whole-archive \
     -Wl,-lrte_meter -Wl,--whole-archive -Wl,-lrte_gro -Wl,-lrte_hash -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ethdev \
     -Wl,-lrte_net -Wl,-lrte_timer -Wl,-lrte_mempool -Wl,-lrte_mempool_ring -Wl,-lrte_ring -Wl,-lrte_pci \
-    -Wl,-Bstatic -lrte_eal -Wl,-Bdynamic -Wl,-lrte_cmdline -Wl,-lrte_kni -Wl,-lrte_bus_pci \
+    -Wl,-lrte_cmdline -Wl,-lrte_bus_pci\
     -Wl,-lrte_bus_vdev ${DPDK_LINK_FLAGS} \
     -Wl,--no-whole-archive -Wl,-lm -Wl,-lrt -Wl,-lnuma -Wl,-ldl -Wl,-export-dynamic -Wl,-export-dynamic \
     -Wl,--as-needed -Wl,-export-dynamic -Wl,-Map=ltran.map -Wl,--cref")
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 0d7ea7b..4b246a1 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -26,6 +26,8 @@
 #include <rte_log.h>
 #include <rte_ethdev.h>
 
+#include <lwip/dpdk_version.h>
+
 #include "ltran_stat.h"
 #include "ltran_base.h"
 #include "gazelle_dfx_msg.h"
@@ -168,16 +170,16 @@ static void gazelle_print_lstack_nic_features(void *buf, const struct gazelle_st
     struct nic_eth_features *f = &(((struct gazelle_stack_dfx_data *)buf)->data.nic_features);
     printf("###### NIC offload and other features for port %-2d #########\n", f->port_id);
 
-    printf("tx-ipv4-checksum: %s\n", (f->tx_offload & DEV_TX_OFFLOAD_IPV4_CKSUM) ? "on" : "off");
-    printf("tx-tcp-checksum: %s\n", (f->tx_offload & DEV_TX_OFFLOAD_TCP_CKSUM) ? "on" : "off");
-    printf("tx-tcp-tso: %s\n", (f->tx_offload & DEV_TX_OFFLOAD_TCP_TSO) ? "on" : "off");
-    printf("tx-udp-checksum: %s\n", (f->tx_offload & DEV_TX_OFFLOAD_UDP_CKSUM) ? "on" : "off");
-    printf("tx-vlan-insert: %s\n", (f->tx_offload & DEV_TX_OFFLOAD_VLAN_INSERT) ? "on" : "off");
+    printf("tx-ipv4-checksum: %s\n", (f->tx_offload & RTE_ETH_TX_OFFLOAD_IPV4_CKSUM) ? "on" : "off");
+    printf("tx-tcp-checksum: %s\n", (f->tx_offload & RTE_ETH_TX_OFFLOAD_TCP_CKSUM) ? "on" : "off");
+    printf("tx-tcp-tso: %s\n", (f->tx_offload & RTE_ETH_TX_OFFLOAD_TCP_TSO) ? "on" : "off");
+    printf("tx-udp-checksum: %s\n", (f->tx_offload & RTE_ETH_TX_OFFLOAD_UDP_CKSUM) ? "on" : "off");
+    printf("tx-vlan-insert: %s\n", (f->tx_offload & RTE_ETH_TX_OFFLOAD_VLAN_INSERT) ? "on" : "off");
 
-    printf("rx-ipv4-checksum: %s\n", (f->rx_offload & DEV_RX_OFFLOAD_IPV4_CKSUM) ? "on" : "off");
-    printf("rx-tcp-checksum: %s\n", (f->rx_offload & DEV_RX_OFFLOAD_TCP_CKSUM) ? "on" : "off");
-    printf("rx-udp-checksum: %s\n", (f->rx_offload & DEV_RX_OFFLOAD_UDP_CKSUM) ? "on" : "off");
-    printf("rx-vlan-strip: %s\n", (f->rx_offload & DEV_RX_OFFLOAD_VLAN_STRIP) ? "on" : "off");
+    printf("rx-ipv4-checksum: %s\n", (f->rx_offload & RTE_ETH_RX_OFFLOAD_IPV4_CKSUM) ? "on" : "off");
+    printf("rx-tcp-checksum: %s\n", (f->rx_offload & RTE_ETH_RX_OFFLOAD_TCP_CKSUM) ? "on" : "off");
+    printf("rx-udp-checksum: %s\n", (f->rx_offload & RTE_ETH_RX_OFFLOAD_UDP_CKSUM) ? "on" : "off");
+    printf("rx-vlan-strip: %s\n", (f->rx_offload & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) ? "on" : "off");
 }
 
 static void gazelle_print_ltran_conn(void *buf, const struct gazelle_stat_msg_request *req_msg)
diff --git a/src/ltran/ltran_ethdev.c b/src/ltran/ltran_ethdev.c
index e2eb4a8..2fb7fab 100644
--- a/src/ltran/ltran_ethdev.c
+++ b/src/ltran/ltran_ethdev.c
@@ -21,10 +21,15 @@
 #include <rte_eth_bond.h>
 #include <rte_ethdev.h>
 #include <rte_errno.h>
+#include <rte_version.h>
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
 #include <rte_kni.h>
+#endif
 #include <syslog.h>
 #include <securec.h>
 
+#include <lwip/dpdk_version.h>
+
 #include "dpdk_common.h"
 #include "ltran_param.h"
 #include "ltran_log.h"
@@ -85,7 +90,11 @@ static int32_t ltran_mbuf_pool_init(void);
 static int32_t ltran_single_slave_port_init(uint16_t port_num, struct rte_mempool *pktmbuf_rxpool);
 static int32_t ltran_single_bond_port_init(uint16_t port_num, struct rte_mempool *pktmbuf_rxpool);
 static int32_t ltran_slave_port_init(void);
+
+
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
 static int32_t ltran_kni_init(void);
+#endif
 static int32_t ltran_bond_port_init(void);
 
 static int32_t ltran_eal_init(void)
@@ -248,10 +257,10 @@ static int32_t ltran_single_slave_port_init(uint16_t port_num, struct rte_mempoo
     }
 
     struct rte_eth_conf port_conf = {0};
-    port_conf.txmode.mq_mode = ETH_MQ_TX_NONE;
-    port_conf.link_speeds = ETH_LINK_SPEED_AUTONEG;
+    port_conf.txmode.mq_mode = RTE_ETH_MQ_TX_NONE;
+    port_conf.link_speeds = RTE_ETH_LINK_SPEED_AUTONEG;
     eth_params_checksum(&port_conf, &dev_info);
-    port_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
+    port_conf.rxmode.mq_mode = RTE_ETH_MQ_RX_NONE;
 
     struct ltran_config *ltran_config = get_ltran_config();
     ltran_config->dpdk.rx_offload = port_conf.rxmode.offloads;
@@ -311,7 +320,11 @@ static int32_t ltran_slave_port_init(void)
 static int32_t ltran_eth_bond_slave(const struct port_info *port_info, uint16_t port_num, uint16_t bond_port_id)
 {
     for (uint32_t i = 0; i < port_info[port_num].num_ports; i++) {
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
         int32_t ret = rte_eth_bond_slave_add(bond_port_id, port_info[port_num].id[i]);
+#else
+        int32_t ret = rte_eth_bond_member_add(bond_port_id, port_info[port_num].id[i]);
+#endif
         if (ret < 0) {
             return ret;
         }
@@ -370,9 +383,9 @@ static int32_t ltran_bond_port_attr_set(uint16_t port_num, uint16_t bond_port_id
     }
 
     struct rte_eth_conf port_conf = {0};
-    port_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
-    port_conf.txmode.mq_mode = ETH_MQ_TX_NONE;
-    port_conf.link_speeds = ETH_LINK_SPEED_AUTONEG;
+    port_conf.rxmode.mq_mode = RTE_ETH_MQ_RX_NONE;
+    port_conf.txmode.mq_mode = RTE_ETH_MQ_TX_NONE;
+    port_conf.link_speeds = RTE_ETH_LINK_SPEED_AUTONEG;
     eth_params_checksum(&port_conf, &dev_info);
 
     ret = rte_eth_dev_configure(bond_port_id, rx_queue_num, tx_queue_num, &port_conf);
@@ -469,6 +482,7 @@ static int32_t ltran_bond_port_init(void)
     return GAZELLE_OK;
 }
 
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
 static int32_t ltran_kni_init(void)
 {
     // if not use kni. skip kni init and return
@@ -481,6 +495,7 @@ static int32_t ltran_kni_init(void)
 
     return dpdk_kni_init(bond_port[0], txpool[0]);
 }
+#endif
 
 typedef int32_t (*ethdev_init_func)(void);
 
@@ -492,7 +507,9 @@ static ethdev_init_func g_ltran_ethdev_init_tbl[] = {
     ltran_mbuf_pool_init,
     ltran_slave_port_init,
     ltran_bond_port_init,
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
     ltran_kni_init,
+#endif
 };
 
 int32_t ltran_ethdev_init(void)
diff --git a/src/ltran/ltran_forward.c b/src/ltran/ltran_forward.c
index ee379b5..a5756d7 100644
--- a/src/ltran/ltran_forward.c
+++ b/src/ltran/ltran_forward.c
@@ -13,7 +13,12 @@
 #include <rte_arp.h>
 #include <rte_eal.h>
 #include <rte_common.h>
+#include <rte_version.h>
+
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
 #include <rte_kni.h>
+#endif
+
 #include <rte_malloc.h>
 #include <rte_ethdev.h>
 #include <rte_mempool.h>
@@ -195,6 +200,7 @@ static __rte_always_inline uint32_t pkt_bufs_enque_rx_ring(struct gazelle_stack
 
 static __rte_always_inline void flush_rx_ring(struct gazelle_stack *stack)
 {
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
     if (unlikely(stack == get_kni_stack())) {
         // if fail, free mbuf inside
         kni_process_tx(stack->pkt_buf, stack->pkt_cnt);
@@ -202,6 +208,7 @@ static __rte_always_inline void flush_rx_ring(struct gazelle_stack *stack)
         stack->pkt_cnt = 0;
         return;
     }
+#endif
 
     /* first flush backup mbuf pointer avoid packet disorder */
     if (unlikely(stack->backup_pkt_cnt > 0)) {
@@ -414,9 +421,12 @@ static __rte_always_inline void upstream_forward_one(struct rte_mbuf *m)
     }
 
 forward_to_kni:
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
     if (get_ltran_config()->dpdk.kni_switch == GAZELLE_ON) {
         enqueue_rx_packet(get_kni_stack(), m);
     }
+#endif
+    return;
 }
 
 static __rte_always_inline void msg_to_quintuple(struct gazelle_quintuple *transfer_qtuple,
@@ -653,10 +663,12 @@ void upstream_forward(const uint16_t *port)
             upstream_forward_loop(port_id, queue_id);
         }
 
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
         if (get_ltran_config()->dpdk.kni_switch == GAZELLE_ON) {
             flush_rx_ring(get_kni_stack());
             rte_kni_handle_request(get_gazelle_kni());
         }
+#endif
 
         now_time = get_current_time();
         if (now_time - aging_conn_last_time > GAZELLE_CONN_INTERVAL) {
@@ -755,11 +767,13 @@ int32_t downstream_forward(uint16_t *port)
     uint32_t queue_num = get_ltran_config()->bond.tx_queue_num;
 
     while (get_ltran_stop_flag() != GAZELLE_TRUE) {
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
         /* kni rx means read from kni and send to nic */
         if (get_ltran_config()->dpdk.kni_switch == GAZELLE_ON &&
             get_kni_started()) {
             kni_process_rx(g_port_index);
         }
+#endif
 
         for (uint32_t queue_id = 0; queue_id < queue_num; queue_id++) {
             downstream_forward_loop(port_id, queue_id);
diff --git a/src/ltran/ltran_stack.c b/src/ltran/ltran_stack.c
index d4e935e..2aed6c9 100644
--- a/src/ltran/ltran_stack.c
+++ b/src/ltran/ltran_stack.c
@@ -10,6 +10,7 @@
 * See the Mulan PSL v2 for more details.
 */
 
+#include <malloc.h>
 #include <rte_mbuf.h>
 
 #include "ltran_instance.h"
diff --git a/src/ltran/ltran_timer.c b/src/ltran/ltran_timer.c
index 96c622e..0832c5f 100644
--- a/src/ltran/ltran_timer.c
+++ b/src/ltran/ltran_timer.c
@@ -10,6 +10,7 @@
 * See the Mulan PSL v2 for more details.
 */
 
+#include <malloc.h>
 #include <sys/time.h>
 #include <pthread.h>
 
diff --git a/src/ltran/main.c b/src/ltran/main.c
index c2598a7..6cc8bc9 100644
--- a/src/ltran/main.c
+++ b/src/ltran/main.c
@@ -17,6 +17,8 @@
 #include <syslog.h>
 #include <sys/types.h>
 #include <rte_malloc.h>
+#include <rte_eal.h>
+#include <rte_version.h>
 
 #include "dpdk_common.h"
 #include "ltran_log.h"
@@ -57,7 +59,9 @@ static void sig_default_handler(int32_t sig)
 {
     LTRAN_ERR("ltran dumped, caught signal: %d.\n", sig);
     print_stack();
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
     dpdk_kni_release();
+#endif
     int ret = 0;
     ret = unlink(get_ltran_config()->unix_socket_filename);
     if (ret) {
@@ -143,7 +147,9 @@ static void ltran_core_destroy(void)
     gazelle_stack_htable_destroy();
     gazelle_tcp_conn_htable_destroy();
     gazelle_tcp_sock_htable_destroy();
+#if RTE_VERSION < RTE_VERSION_NUM(23, 11, 0, 0)
     dpdk_kni_release();
+#endif
 }
 
 static void wait_thread_finish(pthread_t ctrl_thread, uint32_t next_core)
-- 
2.33.0

