From e5ece1f467aa7b31811b174c196f9ec0909c7ae0 Mon Sep 17 00:00:00 2001 From: Jiawen Wu Date: Wed, 13 Oct 2021 10:45:21 +0800 Subject: [PATCH] net/txgbe: fix VXLAN-GPE packet checksum 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 --- drivers/net/txgbe/txgbe_ptypes.c | 24 +++++++++++----------- drivers/net/txgbe/txgbe_rxtx.c | 35 +++++++++++++++++++++++++------- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/drivers/net/txgbe/txgbe_ptypes.c b/drivers/net/txgbe/txgbe_ptypes.c index c8a8a3839d..0ed757d820 100644 --- a/drivers/net/txgbe/txgbe_ptypes.c +++ b/drivers/net/txgbe/txgbe_ptypes.c @@ -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: diff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c index 4849fb385e..596142378a 100644 --- a/drivers/net/txgbe/txgbe_rxtx.c +++ b/drivers/net/txgbe/txgbe_rxtx.c @@ -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; -- 2.20.1