|
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 |
|