Re: [PATCH net-next v2 1/8] udp: fixup csum for GSO receive slow path
flat view
From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Date: 2021-03-26 18:31:41
On Thu, Mar 25, 2021 at 1:24 PM Paolo Abeni [off-list ref] wrote:
When UDP packets generated locally by a socket with UDP_SEGMENT
traverse the following path:
UDP tunnel(xmit) -> veth (segmentation) -> veth (gro) ->
UDP tunnel (rx) -> UDP socket (no UDP_GRO)
they are segmented as part of the rx socket receive operation, and
present a CHECKSUM_NONE after segmentation.would be good to capture how this happens, as it was not immediately obvious.
Additionally the segmented packets UDP CB still refers to the original GSO packet len. Overall that causes unexpected/wrong csum validation errors later in the UDP receive path. We could possibly address the issue with some additional checks and csum mangling in the UDP tunnel code. Since the issue affects only this UDP receive slow path, let's set a suitable csum status there. v1 -> v2: - restrict the csum update to the packets strictly needing them - hopefully clarify the commit message and code comments Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+ if (skb->ip_summed == CHECKSUM_NONE && !skb->csum_valid) + skb->csum_valid = 1;
Not entirely obvious is that UDP packets arriving on a device with rx checksum offload off, i.e., with CHECKSUM_NONE, are not matched by this test. I assume that such packets are not coalesced by the GRO layer in the first place. But I can't immediately spot the reason for it..