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: sta...@dpdk.org Signed-off-by: Jiawen Wu <jiawe...@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