From c2c63406f804550db5670715c1afa6e743d1f675 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Mon, 5 Feb 2024 17:38:06 +0800
Subject: support vlan offload

---
 src/include/dpdk_version.h |  1 +
 src/include/lwip/pbuf.h    |  1 +
 src/netif/ethernet.c       | 17 +++++++++++------
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/include/dpdk_version.h b/src/include/dpdk_version.h
index e61d0b3..5efaa39 100644
--- a/src/include/dpdk_version.h
+++ b/src/include/dpdk_version.h
@@ -48,6 +48,7 @@
 #define RTE_MBUF_F_TX_TCP_CKSUM     PKT_TX_TCP_CKSUM
 #define RTE_MBUF_F_TX_TCP_SEG       PKT_TX_TCP_SEG
 #define RTE_MBUF_F_TX_UDP_CKSUM     PKT_TX_UDP_CKSUM
+#define RTE_MBUF_F_TX_VLAN          PKT_TX_VLAN_PKT
 
 #endif /* DPDK_VERSION_1911 */
 
diff --git a/src/include/lwip/pbuf.h b/src/include/lwip/pbuf.h
index 7fad719..bc29372 100644
--- a/src/include/lwip/pbuf.h
+++ b/src/include/lwip/pbuf.h
@@ -240,6 +240,7 @@ struct pbuf {
   struct pbuf *last;
   pthread_spinlock_t pbuf_lock;
   struct tcp_pcb *pcb;
+  u16_t vlan_tci;
 #if GAZELLE_UDP_ENABLE
   ip_addr_t addr;
   u16_t port;
diff --git a/src/netif/ethernet.c b/src/netif/ethernet.c
index af4cffc..d2960b5 100644
--- a/src/netif/ethernet.c
+++ b/src/netif/ethernet.c
@@ -289,7 +289,12 @@ ethernet_output(struct netif * netif, struct pbuf * p,
   }
 #else
   if (netif->vlan_enable) {
-    vlan_prio_vid = netif->vlan_tci;
+    if (netif->txol_flags & DEV_TX_OFFLOAD_VLAN_INSERT) {
+      p->ol_flags |= RTE_MBUF_F_TX_VLAN;
+      p->vlan_tci = netif->vlan_tci;
+    } else {
+      vlan_prio_vid = netif->vlan_tci;
+    }
   }
 #endif /* GAZELLE_ENABLE */
 #endif
@@ -327,11 +332,11 @@ ethernet_output(struct netif * netif, struct pbuf * p,
               ("ethernet_output: sending packet %p\n", (void *)p));
 
 #if CHECKSUM_GEN_IP_HW || CHECKSUM_GEN_TCP_HW
-#if LWIP_VLAN_PCP
-  ethh_cksum_set(p, sizeof(*ethhdr)+SIZEOF_VLAN_HDR);
-#else
-  ethh_cksum_set(p, sizeof(*ethhdr));
-#endif
+  if (netif->vlan_enable && !(netif->txol_flags & DEV_TX_OFFLOAD_VLAN_INSERT)) {
+    ethh_cksum_set(p, sizeof(*ethhdr) + SIZEOF_VLAN_HDR);
+  } else {
+    ethh_cksum_set(p, sizeof(*ethhdr));
+  }
 #endif
 
   /* send the packet */
-- 
2.33.0
