[PATCH 02/11] net/txgbe: fix GRE tunnel packet checksum

Jiawen Wu jiawenwu at trustnetic.com
Thu Sep 28 11:47:49 CEST 2023


Fix transmit context descriptor for GRE tunnel packet to make the
hardware compute the checksum successfully.

Fixes: e5ece1f467aa ("net/txgbe: fix VXLAN-GPE packet checksum")
Cc: stable at dpdk.org

Signed-off-by: Jiawen Wu <jiawenwu at trustnetic.com>
---
 drivers/net/txgbe/txgbe_ptypes.c | 16 ----------------
 drivers/net/txgbe/txgbe_ptypes.h |  5 +++++
 drivers/net/txgbe/txgbe_rxtx.c   | 23 ++++++++++++-----------
 3 files changed, 17 insertions(+), 27 deletions(-)

diff --git a/drivers/net/txgbe/txgbe_ptypes.c b/drivers/net/txgbe/txgbe_ptypes.c
index e1299d7363..c444d5d3f1 100644
--- a/drivers/net/txgbe/txgbe_ptypes.c
+++ b/drivers/net/txgbe/txgbe_ptypes.c
@@ -320,8 +320,6 @@ txgbe_encode_ptype_tunnel(u32 ptype)
 		ptid |= TXGBE_PTID_TUN_EI;
 		break;
 	case RTE_PTYPE_TUNNEL_GRE:
-		ptid |= TXGBE_PTID_TUN_EIG;
-		break;
 	case RTE_PTYPE_TUNNEL_VXLAN:
 	case RTE_PTYPE_TUNNEL_VXLAN_GPE:
 	case RTE_PTYPE_TUNNEL_NVGRE:
@@ -332,20 +330,6 @@ txgbe_encode_ptype_tunnel(u32 ptype)
 		return ptid;
 	}
 
-	switch (ptype & RTE_PTYPE_INNER_L2_MASK) {
-	case RTE_PTYPE_INNER_L2_ETHER:
-		ptid |= TXGBE_PTID_TUN_EIGM;
-		break;
-	case RTE_PTYPE_INNER_L2_ETHER_VLAN:
-		ptid |= TXGBE_PTID_TUN_EIGMV;
-		break;
-	case RTE_PTYPE_INNER_L2_ETHER_QINQ:
-		ptid |= TXGBE_PTID_TUN_EIGMV;
-		break;
-	default:
-		break;
-	}
-
 	switch (ptype & RTE_PTYPE_INNER_L3_MASK) {
 	case RTE_PTYPE_INNER_L3_IPV4:
 	case RTE_PTYPE_INNER_L3_IPV4_EXT:
diff --git a/drivers/net/txgbe/txgbe_ptypes.h b/drivers/net/txgbe/txgbe_ptypes.h
index fa6c347d53..6fa8147f05 100644
--- a/drivers/net/txgbe/txgbe_ptypes.h
+++ b/drivers/net/txgbe/txgbe_ptypes.h
@@ -348,4 +348,9 @@ struct txgbe_nvgrehdr {
 	__be32 tni;
 };
 
+struct txgbe_grehdr {
+	__be16 flags;
+	__be16 proto;
+};
+
 #endif /* _TXGBE_PTYPE_H_ */
diff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c
index 427f8b82ac..f7cd2333ab 100644
--- a/drivers/net/txgbe/txgbe_rxtx.c
+++ b/drivers/net/txgbe/txgbe_rxtx.c
@@ -572,7 +572,6 @@ tx_desc_ol_flags_to_ptype(uint64_t oflags)
 		ptype |= RTE_PTYPE_L2_ETHER |
 			 RTE_PTYPE_L3_IPV4 |
 			 RTE_PTYPE_TUNNEL_GRE;
-		ptype |= RTE_PTYPE_INNER_L2_ETHER;
 		break;
 	case RTE_MBUF_F_TX_TUNNEL_GENEVE:
 		ptype |= RTE_PTYPE_L2_ETHER |
@@ -705,22 +704,24 @@ txgbe_get_tun_len(struct rte_mbuf *mbuf)
 static inline uint8_t
 txgbe_parse_tun_ptid(struct rte_mbuf *tx_pkt)
 {
-	uint64_t l2_none, l2_mac, l2_mac_vlan;
+	uint64_t l2_vxlan, l2_vxlan_mac, l2_vxlan_mac_vlan;
+	uint64_t l2_gre, l2_gre_mac, l2_gre_mac_vlan;
 	uint8_t ptid = 0;
 
-	if ((tx_pkt->ol_flags & (RTE_MBUF_F_TX_TUNNEL_VXLAN |
-				RTE_MBUF_F_TX_TUNNEL_VXLAN_GPE)) == 0)
-		return ptid;
+	l2_vxlan = sizeof(struct txgbe_udphdr) + sizeof(struct txgbe_vxlanhdr);
+	l2_vxlan_mac = l2_vxlan + sizeof(struct rte_ether_hdr);
+	l2_vxlan_mac_vlan = l2_vxlan_mac + sizeof(struct rte_vlan_hdr);
 
-	l2_none = sizeof(struct txgbe_udphdr) + sizeof(struct txgbe_vxlanhdr);
-	l2_mac = l2_none + sizeof(struct rte_ether_hdr);
-	l2_mac_vlan = l2_mac + sizeof(struct rte_vlan_hdr);
+	l2_gre = sizeof(struct txgbe_grehdr);
+	l2_gre_mac = l2_gre + sizeof(struct rte_ether_hdr);
+	l2_gre_mac_vlan = l2_gre_mac + sizeof(struct rte_vlan_hdr);
 
-	if (tx_pkt->l2_len == l2_none)
+	if (tx_pkt->l2_len == l2_vxlan || tx_pkt->l2_len == l2_gre)
 		ptid = TXGBE_PTID_TUN_EIG;
-	else if (tx_pkt->l2_len == l2_mac)
+	else if (tx_pkt->l2_len == l2_vxlan_mac || tx_pkt->l2_len == l2_gre_mac)
 		ptid = TXGBE_PTID_TUN_EIGM;
-	else if (tx_pkt->l2_len == l2_mac_vlan)
+	else if (tx_pkt->l2_len == l2_vxlan_mac_vlan ||
+			tx_pkt->l2_len == l2_gre_mac_vlan)
 		ptid = TXGBE_PTID_TUN_EIGMV;
 
 	return ptid;
-- 
2.27.0



More information about the stable mailing list