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

Reply via email to