[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20230601211732.1606062-1-edumazet@google.com>
Date: Thu, 1 Jun 2023 21:17:32 +0000
From: Eric Dumazet <edumazet@...gle.com>
To: "David S . Miller" <davem@...emloft.net>, Jakub Kicinski <kuba@...nel.org>,
Paolo Abeni <pabeni@...hat.com>
Cc: netdev@...r.kernel.org, Xin Long <lucien.xin@...il.com>,
David Ahern <dsahern@...nel.org>, eric.dumazet@...il.com,
Eric Dumazet <edumazet@...gle.com>, Alexander Duyck <alexanderduyck@...com>
Subject: [PATCH net] tcp: gso: really support BIG TCP
We missed that tcp_gso_segment() was assuming skb->len was smaller than 65535 :
oldlen = (u16)~skb->len;
This part came with commit 0718bcc09b35 ("[NET]: Fix CHECKSUM_HW GSO problems.")
This leads to wrong TCP checksum.
Simply use csum_fold() to support 32bit packet lengthes.
oldlen name is a bit misleading, as it is the contribution
of skb->len on the input skb TCP checksum. I added a comment
to clarify this point.
Fixes: 09f3d1a3a52c ("ipv6/gso: remove temporary HBH/jumbo header")
Signed-off-by: Eric Dumazet <edumazet@...gle.com>
Cc: Alexander Duyck <alexanderduyck@...com>
---
net/ipv4/tcp_offload.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c
index 45dda788938704c3f762256266d9ea29b6ded4a5..5a1a163b2d859696df8f204b50e3fc76c14b64e9 100644
--- a/net/ipv4/tcp_offload.c
+++ b/net/ipv4/tcp_offload.c
@@ -75,7 +75,8 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
if (!pskb_may_pull(skb, thlen))
goto out;
- oldlen = (u16)~skb->len;
+ /* Contribution of skb->len in current TCP checksum */
+ oldlen = (__force u32)csum_fold((__force __wsum)skb->len);
__skb_pull(skb, thlen);
mss = skb_shinfo(skb)->gso_size;
--
2.41.0.rc0.172.g3f132b7071-goog
Powered by blists - more mailing lists