mbox series

[net-next,v3,0/8] udp: GRO L4 improvements

Message ID cover.1617099959.git.pabeni@redhat.com
Headers show
Series udp: GRO L4 improvements | expand

Message

Paolo Abeni March 30, 2021, 10:28 a.m. UTC
This series improves the UDP L4 - either 'forward' or 'frag_list' -
co-existence with UDP tunnel GRO, allowing the first to take place
correctly even for encapsulated UDP traffic.

The first for patches are mostly bugfixes, addressing some GRO 
edge-cases when both tunnels and L4 are present, enabled and in use.

The next 3 patches avoid unneeded segmentation when UDP GRO
traffic traverses in the receive path UDP tunnels.

Finally, some self-tests are included, covering the relevant
GRO scenarios.

Even if most patches are actually bugfixes, this series is
targeting net-next, as overall it makes available a new feature.

v2 -> v3:
 - no code changes, more verbose commit messages and comment in
   patch 1/8

v1 -> v2:
 - restrict post segmentation csum fixup to the only the relevant pkts
 - use individual 'accept_gso_type' fields instead of whole gso bitmask
   (Willem)
 - use only ipv6 addesses from test range in self-tests (Willem)
 - hopefully clarified most individual patches commit messages

Paolo Abeni (8):
  udp: fixup csum for GSO receive slow path
  udp: skip L4 aggregation for UDP tunnel packets
  udp: properly complete L4 GRO over UDP tunnel packet
  udp: never accept GSO_FRAGLIST packets
  vxlan: allow L4 GRO passthrough
  geneve: allow UDP L4 GRO passthrou
  bareudp: allow UDP L4 GRO passthrou
  selftests: net: add UDP GRO forwarding self-tests

 drivers/net/bareudp.c                     |   1 +
 drivers/net/geneve.c                      |   1 +
 drivers/net/vxlan.c                       |   1 +
 include/linux/udp.h                       |  22 +-
 include/net/udp.h                         |  23 ++
 net/ipv4/udp.c                            |   5 +
 net/ipv4/udp_offload.c                    |  27 ++-
 net/ipv6/udp.c                            |   1 +
 net/ipv6/udp_offload.c                    |   3 +-
 tools/testing/selftests/net/Makefile      |   1 +
 tools/testing/selftests/net/udpgro_fwd.sh | 251 ++++++++++++++++++++++
 11 files changed, 323 insertions(+), 13 deletions(-)
 create mode 100755 tools/testing/selftests/net/udpgro_fwd.sh

Comments

Willem de Bruijn March 30, 2021, 3:15 p.m. UTC | #1
On Tue, Mar 30, 2021 at 6:29 AM Paolo Abeni <pabeni@redhat.com> 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)
>
> ip_summed will be set to CHECKSUM_PARTIAL at creation time and
> such checksum mode will be preserved in the above path up to the
> UDP tunnel receive code where we have:
>
>  __iptunnel_pull_header() -> skb_pull_rcsum() ->
> skb_postpull_rcsum() -> __skb_postpull_rcsum()
>
> The latter will convert the skb to CHECKSUM_NONE.
>
> The UDP GSO packet will be later segmented as part of the rx socket
> receive operation, and will present a CHECKSUM_NONE after segmentation.
>
> 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.
>
> Note that SKB_GSO_UDP_L4 or SKB_GSO_FRAGLIST packets lacking an UDP
> encapsulation present a valid checksum when landing to udp_queue_rcv_skb(),
> as the UDP checksum has been validated by the GRO engine.
>
> v2 -> v3:
>  - even more verbose commit message and comments
>
> 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>

Reviewed-by: Willem de Bruijn <willemb@google.com>
patchwork-bot+netdevbpf@kernel.org March 31, 2021, 12:20 a.m. UTC | #2
Hello:

This series was applied to netdev/net-next.git (refs/heads/master):

On Tue, 30 Mar 2021 12:28:48 +0200 you wrote:
> This series improves the UDP L4 - either 'forward' or 'frag_list' -

> co-existence with UDP tunnel GRO, allowing the first to take place

> correctly even for encapsulated UDP traffic.

> 

> The first for patches are mostly bugfixes, addressing some GRO

> edge-cases when both tunnels and L4 are present, enabled and in use.

> 

> [...]


Here is the summary with links:
  - [net-next,v3,1/8] udp: fixup csum for GSO receive slow path
    https://git.kernel.org/netdev/net-next/c/000ac44da7d0
  - [net-next,v3,2/8] udp: skip L4 aggregation for UDP tunnel packets
    https://git.kernel.org/netdev/net-next/c/18f25dc39990
  - [net-next,v3,3/8] udp: properly complete L4 GRO over UDP tunnel packet
    https://git.kernel.org/netdev/net-next/c/e0e3070a9bc9
  - [net-next,v3,4/8] udp: never accept GSO_FRAGLIST packets
    https://git.kernel.org/netdev/net-next/c/78352f73dc50
  - [net-next,v3,5/8] vxlan: allow L4 GRO passthrough
    https://git.kernel.org/netdev/net-next/c/d18931a92a0b
  - [net-next,v3,6/8] geneve: allow UDP L4 GRO passthrou
    https://git.kernel.org/netdev/net-next/c/61630c4f052b
  - [net-next,v3,7/8] bareudp: allow UDP L4 GRO passthrou
    https://git.kernel.org/netdev/net-next/c/b03ef676ba6d
  - [net-next,v3,8/8] selftests: net: add UDP GRO forwarding self-tests
    https://git.kernel.org/netdev/net-next/c/a062260a9d5f

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html