我在 centos 上使用 DPDK19.11.10。
如果我只IPV4發送沒有VLAN標頭的資料包,應用程式在硬體卸載方面作業正常。
如果我添加VLAN帶有 IPV4的標頭,則硬體卸載不起作用。如果在 ubuntu 網關上捕獲 pcap,Fragmented IP packet即使我們沒有對 IP 資料包進行分段,IP 標頭也會損壞。
我們驗證了這樣的能力:
if (!(dev->tx_offload_capa & DEV_TX_OFFLOAD_VLAN_INSERT)) {
rte_panic(" VLAN offload not supported");
}
下面是我的代碼:
.offloads = (DEV_TX_OFFLOAD_IPV4_CKSUM |
DEV_TX_OFFLOAD_UDP_CKSUM | DEV_TX_OFFLOAD_TCP_CKSUM | DEV_TX_OFFLOAD_VLAN_INSERT),
m->l2_len = L2_HDR_SIZE;
m->l3_len = L3_IPV4_HDR_SIZE;
ip_hdr->check = 0;
m->ol_flags |= PKT_TX_IPV4 | PKT_TX_IP_CKSUM;
ip_hdr = rte_pktmbuf_mtod(m, struct iphdr *);
vlan1_hdr = (struct vlan1_hdr *) rte_pktmbuf_prepend(m, sizeof(struct vlan1_hdr));
eth_hdr = (struct ethernet_hdr *) rte_pktmbuf_prepend(m, (uint16_t)sizeof(struct ethernet_hdr));
一旦我在 ubuntu 網關中收到資料包,IP 資料包就會被損壞為碎片化的 IP 資料包。

如果我洗掉了VLAN標題,相同的代碼就可以正常作業。這里還有什么需要補充的嗎?
uj5u.com熱心網友回復:
聽著它的聲音,
- 您可能會誤解 HW Tx VLAN 卸載的作業方式;
- 您的代碼
m->l2_len在插入 VLAN 標頭時不會更新。
首先,您的代碼支持 HW Tx VLAN 卸載,但奇怪的是,它實際上并沒有嘗試使用它。如果一個人想利用硬體的Tx VLAN卸載,就應該設定PKT_TX_VLAN在m->ol_flags并填寫m->vlan_tci。VLAN 頭將由硬體添加。
但是,您的代碼會預先添加標頭本身,就像一開始無意使用硬體卸載一樣。您的代碼確實m->l2_len = L2_HDR_SIZE;如此,據我推測,這僅適用于以太網標頭。當您的代碼添加 VLAN 標頭時,必須相應地更新此變數:
m->l2_len = sizeof(struct rte_vlan_hdr);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/393274.html
上一篇:使用陣列列印素數
