mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
bnx2x: fix header length calculation for encapsulated TSO
Commit80bfab79b8("net: adopt skb_network_offset() and similar helpers") replaced the difference between the inner transport header and the outer network header with skb_inner_transport_offset(). The helper is relative to skb->data, so the new calculation incorrectly includes the outer Ethernet header in fw_ip_hdr_to_payload_w. On a BCM57810 transmitting TCP over VXLAN with an outer MTU of 1500, hardware segmentation emits packets declaring an outer IPv4 total length of 1514 while the actual IP packet is only 1500 bytes long. The receiver drops these malformed packets, severely degrading TCP connectivity. Subtract skb_network_offset() to restore the original calculation of the length from the outer network header to the inner TCP payload. Reproduced with plain kernel VXLAN and one TCP flow on kernel 7.0.0-31-generic: 50 of 200 captured packets had an invalid outer IP length with the original driver, versus none with this fix. Disabling TSO/GSO on the test VXLAN device also eliminated the error with the original driver. Fixes:80bfab79b8("net: adopt skb_network_offset() and similar helpers") Signed-off-by: George Melikov <mail@gmelikov.ru> Reviewed-by: Simon Horman <horms@kernel.org> Link: https://patch.msgid.link/20261009-bnx2x-tso-fix-v1-1-1ebea422422d@gmelikov.ru Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
50f2103fce
commit
4fc1d5bb44
|
|
@ -3666,7 +3666,8 @@ static void bnx2x_update_pbds_gso_enc(struct sk_buff *skb,
|
|||
u8 outerip_off, outerip_len = 0;
|
||||
|
||||
/* from outer IP to transport */
|
||||
hlen_w = skb_inner_transport_offset(skb) >> 1;
|
||||
hlen_w = (skb_inner_transport_offset(skb) -
|
||||
skb_network_offset(skb)) >> 1;
|
||||
|
||||
/* transport len */
|
||||
hlen_w += inner_tcp_hdrlen(skb) >> 1;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user