You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.5 KiB
71 lines
2.5 KiB
From ddccc2338e49e1880ea9664420c494b9254fb497 Mon Sep 17 00:00:00 2001
|
|
From: Igor Russkikh <irusskik@redhat.com>
|
|
Date: Fri, 6 Nov 2020 18:36:33 -0500
|
|
Subject: [PATCH 016/139] [netdrv] net: aquantia: do not pass lro session with
|
|
invalid tcp checksum
|
|
|
|
Message-id: <1604687916-15087-17-git-send-email-irusskik@redhat.com>
|
|
Patchwork-id: 338443
|
|
Patchwork-instance: patchwork
|
|
O-Subject: [RHEL8.4 BZ 1857861 016/139] net: aquantia: do not pass lro session with invalid tcp checksum
|
|
Bugzilla: 1857861
|
|
RH-Acked-by: David Arcari <darcari@redhat.com>
|
|
RH-Acked-by: John Linville <linville@redhat.com>
|
|
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
|
|
|
Bugzilla: http://bugzilla.redhat.com/1857861
|
|
|
|
commit d08b9a0a3ebdf71b0aabe576c7dd48e57e80e0f0
|
|
Author: Dmitry Bogdanov <dmitry.bogdanov@aquantia.com>
|
|
Date: Fri Oct 11 13:45:22 2019 +0000
|
|
|
|
net: aquantia: do not pass lro session with invalid tcp checksum
|
|
|
|
Individual descriptors on LRO TCP session should be checked
|
|
for CRC errors. It was discovered that HW recalculates
|
|
L4 checksums on LRO session and does not break it up on bad L4
|
|
csum.
|
|
|
|
Thus, driver should aggregate HW LRO L4 statuses from all individual
|
|
buffers of LRO session and drop packet if one of the buffers has bad
|
|
L4 checksum.
|
|
|
|
Fixes: f38f1ee8aeb2 ("net: aquantia: check rx csum for all packets in LRO session")
|
|
Signed-off-by: Dmitry Bogdanov <dmitry.bogdanov@aquantia.com>
|
|
Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
|
|
Signed-off-by: Igor Russkikh <irusskik@redhat.com>
|
|
|
|
Cc: David Arcari <darcari@redhat.com>
|
|
Cc: Igor Russkikh <irusskik@redhat.com>
|
|
Signed-off-by: Jan Stancek <jstancek@redhat.com>
|
|
---
|
|
drivers/net/ethernet/aquantia/atlantic/aq_ring.c | 3 ++-
|
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
|
|
index 3901d7994ca1..76bdbe1596d6 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
|
|
@@ -313,6 +313,7 @@ int aq_ring_rx_clean(struct aq_ring_s *self,
|
|
break;
|
|
|
|
buff->is_error |= buff_->is_error;
|
|
+ buff->is_cso_err |= buff_->is_cso_err;
|
|
|
|
} while (!buff_->is_eop);
|
|
|
|
@@ -320,7 +321,7 @@ int aq_ring_rx_clean(struct aq_ring_s *self,
|
|
err = 0;
|
|
goto err_exit;
|
|
}
|
|
- if (buff->is_error) {
|
|
+ if (buff->is_error || buff->is_cso_err) {
|
|
buff_ = buff;
|
|
do {
|
|
next_ = buff_->next,
|
|
--
|
|
2.13.6
|
|
|