net/txgbe: fix VXLAN-GPE packet checksum
authorJiawen Wu <jiawenwu@trustnetic.com>
Wed, 13 Oct 2021 02:45:21 +0000 (10:45 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 14 Oct 2021 14:42:02 +0000 (16:42 +0200)
Parse inner L2 length to set correct packet type, and ensure that
hardware can compute the checksum successfully.

Fixes: b950203be7f1 ("net/txgbe: support VXLAN-GPE")
Cc: stable@dpdk.org
Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
drivers/net/txgbe/txgbe_ptypes.c
drivers/net/txgbe/txgbe_rxtx.c

index c8a8a38..0ed757d 100644 (file)
@@ -102,17 +102,17 @@ static u32 txgbe_ptype_lookup[TXGBE_PTID_MAX] __rte_cache_aligned = {
        TPTE(0x8C, ETHER, IPV4, NONE, IP, NONE, IPV6, TCP),
        TPTE(0x8D, ETHER, IPV4, NONE, IP, NONE, IPV6, SCTP),
        /* IPv4 -> GRE/Teredo/VXLAN -> NONE/IPv4/IPv6 */
-       TPTE(0x90, ETHER, IPV4, NONE, VXLAN_GPE, NONE, NONE, NONE),
-       TPTE(0x91, ETHER, IPV4, NONE, VXLAN_GPE, NONE, IPV4, FRAG),
-       TPTE(0x92, ETHER, IPV4, NONE, VXLAN_GPE, NONE, IPV4, NONFRAG),
-       TPTE(0x93, ETHER, IPV4, NONE, VXLAN_GPE, NONE, IPV4, UDP),
-       TPTE(0x94, ETHER, IPV4, NONE, VXLAN_GPE, NONE, IPV4, TCP),
-       TPTE(0x95, ETHER, IPV4, NONE, VXLAN_GPE, NONE, IPV4, SCTP),
-       TPTE(0x99, ETHER, IPV4, NONE, VXLAN_GPE, NONE, IPV6, FRAG),
-       TPTE(0x9A, ETHER, IPV4, NONE, VXLAN_GPE, NONE, IPV6, NONFRAG),
-       TPTE(0x9B, ETHER, IPV4, NONE, VXLAN_GPE, NONE, IPV6, UDP),
-       TPTE(0x9C, ETHER, IPV4, NONE, VXLAN_GPE, NONE, IPV6, TCP),
-       TPTE(0x9D, ETHER, IPV4, NONE, VXLAN_GPE, NONE, IPV6, SCTP),
+       TPTE(0x90, ETHER, IPV4, NONE, GRENAT, NONE, NONE, NONE),
+       TPTE(0x91, ETHER, IPV4, NONE, GRENAT, NONE, IPV4, FRAG),
+       TPTE(0x92, ETHER, IPV4, NONE, GRENAT, NONE, IPV4, NONFRAG),
+       TPTE(0x93, ETHER, IPV4, NONE, GRENAT, NONE, IPV4, UDP),
+       TPTE(0x94, ETHER, IPV4, NONE, GRENAT, NONE, IPV4, TCP),
+       TPTE(0x95, ETHER, IPV4, NONE, GRENAT, NONE, IPV4, SCTP),
+       TPTE(0x99, ETHER, IPV4, NONE, GRENAT, NONE, IPV6, FRAG),
+       TPTE(0x9A, ETHER, IPV4, NONE, GRENAT, NONE, IPV6, NONFRAG),
+       TPTE(0x9B, ETHER, IPV4, NONE, GRENAT, NONE, IPV6, UDP),
+       TPTE(0x9C, ETHER, IPV4, NONE, GRENAT, NONE, IPV6, TCP),
+       TPTE(0x9D, ETHER, IPV4, NONE, GRENAT, NONE, IPV6, SCTP),
        /* IPv4 -> GRE/Teredo/VXLAN -> MAC -> NONE/IPv4/IPv6 */
        TPTE(0xA0, ETHER, IPV4, NONE, GRENAT, ETHER, NONE,  NONE),
        TPTE(0xA1, ETHER, IPV4, NONE, GRENAT, ETHER, IPV4, FRAG),
@@ -320,10 +320,10 @@ txgbe_encode_ptype_tunnel(u32 ptype)
                ptid |= TXGBE_PTID_TUN_EI;
                break;
        case RTE_PTYPE_TUNNEL_GRE:
-       case RTE_PTYPE_TUNNEL_VXLAN_GPE:
                ptid |= TXGBE_PTID_TUN_EIG;
                break;
        case RTE_PTYPE_TUNNEL_VXLAN:
+       case RTE_PTYPE_TUNNEL_VXLAN_GPE:
        case RTE_PTYPE_TUNNEL_NVGRE:
        case RTE_PTYPE_TUNNEL_GENEVE:
        case RTE_PTYPE_TUNNEL_GRENAT:
index 4849fb3..5961423 100644 (file)
@@ -562,10 +562,10 @@ tx_desc_ol_flags_to_ptid(uint64_t oflags, uint32_t ptype)
        /* Tunnel */
        switch (oflags & PKT_TX_TUNNEL_MASK) {
        case PKT_TX_TUNNEL_VXLAN:
+       case PKT_TX_TUNNEL_VXLAN_GPE:
                ptype |= RTE_PTYPE_L2_ETHER |
                         RTE_PTYPE_L3_IPV4 |
-                        RTE_PTYPE_TUNNEL_VXLAN;
-               ptype |= RTE_PTYPE_INNER_L2_ETHER;
+                        RTE_PTYPE_TUNNEL_GRENAT;
                break;
        case PKT_TX_TUNNEL_GRE:
                ptype |= RTE_PTYPE_L2_ETHER |
@@ -579,11 +579,6 @@ tx_desc_ol_flags_to_ptid(uint64_t oflags, uint32_t ptype)
                         RTE_PTYPE_TUNNEL_GENEVE;
                ptype |= RTE_PTYPE_INNER_L2_ETHER;
                break;
-       case PKT_TX_TUNNEL_VXLAN_GPE:
-               ptype |= RTE_PTYPE_L2_ETHER |
-                        RTE_PTYPE_L3_IPV4 |
-                        RTE_PTYPE_TUNNEL_VXLAN_GPE;
-               break;
        case PKT_TX_TUNNEL_IPIP:
        case PKT_TX_TUNNEL_IP:
                ptype |= RTE_PTYPE_L2_ETHER |
@@ -696,6 +691,30 @@ txgbe_get_tun_len(struct rte_mbuf *mbuf)
        return tun_len;
 }
 
+static inline uint8_t
+txgbe_parse_tun_ptid(struct rte_mbuf *tx_pkt)
+{
+       uint64_t l2_none, l2_mac, l2_mac_vlan;
+       uint8_t ptid = 0;
+
+       if ((tx_pkt->ol_flags & (PKT_TX_TUNNEL_VXLAN |
+                               PKT_TX_TUNNEL_VXLAN_GPE)) == 0)
+               return ptid;
+
+       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);
+
+       if (tx_pkt->l2_len == l2_none)
+               ptid = TXGBE_PTID_TUN_EIG;
+       else if (tx_pkt->l2_len == l2_mac)
+               ptid = TXGBE_PTID_TUN_EIGM;
+       else if (tx_pkt->l2_len == l2_mac_vlan)
+               ptid = TXGBE_PTID_TUN_EIGMV;
+
+       return ptid;
+}
+
 uint16_t
 txgbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
                uint16_t nb_pkts)
@@ -759,6 +778,8 @@ txgbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
                if (tx_ol_req) {
                        tx_offload.ptid = tx_desc_ol_flags_to_ptid(tx_ol_req,
                                        tx_pkt->packet_type);
+                       if (tx_offload.ptid & TXGBE_PTID_PKT_TUN)
+                               tx_offload.ptid |= txgbe_parse_tun_ptid(tx_pkt);
                        tx_offload.l2_len = tx_pkt->l2_len;
                        tx_offload.l3_len = tx_pkt->l3_len;
                        tx_offload.l4_len = tx_pkt->l4_len;