Takashi Iwai 351c7d
From 40b8c2a1af03ba3e8da55a4490d646bfa845e71a Mon Sep 17 00:00:00 2001
Takashi Iwai 351c7d
From: Ronak Doshi <doshir@vmware.com>
Takashi Iwai 351c7d
Date: Wed, 30 Nov 2022 00:21:46 -0800
Takashi Iwai 351c7d
Subject: [PATCH] vmxnet3: correctly report encapsulated LRO packet
Takashi Iwai 351c7d
Git-commit: 40b8c2a1af03ba3e8da55a4490d646bfa845e71a
Takashi Iwai 351c7d
Patch-mainline: v6.1
Takashi Iwai 351c7d
References: git-fixes
Takashi Iwai 351c7d
Takashi Iwai 351c7d
Commit dacce2be3312 ("vmxnet3: add geneve and vxlan tunnel offload
Takashi Iwai 351c7d
support") added support for encapsulation offload. However, the
Takashi Iwai 351c7d
pathc did not report correctly the encapsulated packet which is
Takashi Iwai 351c7d
LRO'ed by the hypervisor.
Takashi Iwai 351c7d
Takashi Iwai 351c7d
This patch fixes this issue by using correct callback for the LRO'ed
Takashi Iwai 351c7d
encapsulated packet.
Takashi Iwai 351c7d
Takashi Iwai 351c7d
Fixes: dacce2be3312 ("vmxnet3: add geneve and vxlan tunnel offload support")
Takashi Iwai 351c7d
Signed-off-by: Ronak Doshi <doshir@vmware.com>
Takashi Iwai 351c7d
Acked-by: Guolin Yang <gyang@vmware.com>
Takashi Iwai 351c7d
Signed-off-by: David S. Miller <davem@davemloft.net>
Takashi Iwai 351c7d
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 351c7d
Takashi Iwai 351c7d
---
Takashi Iwai 351c7d
 drivers/net/vmxnet3/vmxnet3_drv.c | 11 +++++++++--
Takashi Iwai 351c7d
 1 file changed, 9 insertions(+), 2 deletions(-)
Takashi Iwai 351c7d
Takashi Iwai 351c7d
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
Takashi Iwai 351c7d
index d3e7b27eb933..3111a8a6b26a 100644
Takashi Iwai 351c7d
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
Takashi Iwai 351c7d
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
Takashi Iwai 351c7d
@@ -1396,6 +1396,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
Takashi Iwai 351c7d
 	};
Takashi Iwai 351c7d
 	u32 num_pkts = 0;
Takashi Iwai 351c7d
 	bool skip_page_frags = false;
Takashi Iwai 351c7d
+	bool encap_lro = false;
Takashi Iwai 351c7d
 	struct Vmxnet3_RxCompDesc *rcd;
Takashi Iwai 351c7d
 	struct vmxnet3_rx_ctx *ctx = &rq->rx_ctx;
Takashi Iwai 351c7d
 	u16 segCnt = 0, mss = 0;
Takashi Iwai 351c7d
@@ -1556,13 +1557,18 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
Takashi Iwai 351c7d
 			if (VMXNET3_VERSION_GE_2(adapter) &&
Takashi Iwai 351c7d
 			    rcd->type == VMXNET3_CDTYPE_RXCOMP_LRO) {
Takashi Iwai 351c7d
 				struct Vmxnet3_RxCompDescExt *rcdlro;
Takashi Iwai 351c7d
+				union Vmxnet3_GenericDesc *gdesc;
Takashi Iwai 351c7d
+
Takashi Iwai 351c7d
 				rcdlro = (struct Vmxnet3_RxCompDescExt *)rcd;
Takashi Iwai 351c7d
+				gdesc = (union Vmxnet3_GenericDesc *)rcd;
Takashi Iwai 351c7d
 
Takashi Iwai 351c7d
 				segCnt = rcdlro->segCnt;
Takashi Iwai 351c7d
 				WARN_ON_ONCE(segCnt == 0);
Takashi Iwai 351c7d
 				mss = rcdlro->mss;
Takashi Iwai 351c7d
 				if (unlikely(segCnt <= 1))
Takashi Iwai 351c7d
 					segCnt = 0;
Takashi Iwai 351c7d
+				encap_lro = (le32_to_cpu(gdesc->dword[0]) &
Takashi Iwai 351c7d
+					(1UL << VMXNET3_RCD_HDR_INNER_SHIFT));
Takashi Iwai 351c7d
 			} else {
Takashi Iwai 351c7d
 				segCnt = 0;
Takashi Iwai 351c7d
 			}
Takashi Iwai 351c7d
@@ -1630,7 +1636,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
Takashi Iwai 351c7d
 			vmxnet3_rx_csum(adapter, skb,
Takashi Iwai 351c7d
 					(union Vmxnet3_GenericDesc *)rcd);
Takashi Iwai 351c7d
 			skb->protocol = eth_type_trans(skb, adapter->netdev);
Takashi Iwai 351c7d
-			if (!rcd->tcp ||
Takashi Iwai 351c7d
+			if ((!rcd->tcp && !encap_lro) ||
Takashi Iwai 351c7d
 			    !(adapter->netdev->features & NETIF_F_LRO))
Takashi Iwai 351c7d
 				goto not_lro;
Takashi Iwai 351c7d
 
Takashi Iwai 351c7d
@@ -1639,7 +1645,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
Takashi Iwai 351c7d
 					SKB_GSO_TCPV4 : SKB_GSO_TCPV6;
Takashi Iwai 351c7d
 				skb_shinfo(skb)->gso_size = mss;
Takashi Iwai 351c7d
 				skb_shinfo(skb)->gso_segs = segCnt;
Takashi Iwai 351c7d
-			} else if (segCnt != 0 || skb->len > mtu) {
Takashi Iwai 351c7d
+			} else if ((segCnt != 0 || skb->len > mtu) && !encap_lro) {
Takashi Iwai 351c7d
 				u32 hlen;
Takashi Iwai 351c7d
 
Takashi Iwai 351c7d
 				hlen = vmxnet3_get_hdr_len(adapter, skb,
Takashi Iwai 351c7d
@@ -1668,6 +1674,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
Takashi Iwai 351c7d
 				napi_gro_receive(&rq->napi, skb);
Takashi Iwai 351c7d
 
Takashi Iwai 351c7d
 			ctx->skb = NULL;
Takashi Iwai 351c7d
+			encap_lro = false;
Takashi Iwai 351c7d
 			num_pkts++;
Takashi Iwai 351c7d
 		}
Takashi Iwai 351c7d
 
Takashi Iwai 351c7d
-- 
Takashi Iwai 351c7d
2.35.3
Takashi Iwai 351c7d