[net,3/4] net: aquantia: do not pass lro session with invalid tcp checksum
diff mbox series

Message ID 7e7176877b703aa5b8d819030983691f1733d3ec.1570708006.git.igor.russkikh@aquantia.com
State Changes Requested
Delegated to: David Miller
Headers show
  • Aquantia/Marvell AQtion atlantic driver fixes 10/2019
Related show

Commit Message

Igor Russkikh Oct. 10, 2019, 2:01 p.m. UTC
From: Dmitry Bogdanov <dmitry.bogdanov@aquantia.com>

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

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>
 drivers/net/ethernet/aquantia/atlantic/aq_ring.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff mbox series

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