This series implements GRO support for UDP sockets, as the RX counterpart of commit bec1f6f69736 ("udp: generate gso with UDP_SEGMENT"). The core functionality is implemented by the second patch, introducing a new sockopt to enable UDP_GRO, while patch 3 implements support for passing the segment size to the user space via a new cmsg. UDP GRO performs a socket lookup for each ingress packets and aggregate datagram directed to UDP GRO enabled sockets with constant l4 tuple.
UDP GRO packets can land on non GRO-enabled sockets, e.g. due to iptables NAT rules, and that could potentially confuse existing applications. The solution adopted here is to de-segment the GRO packet before enqueuing as needed. Since we must cope with packet reinsertion after de-segmentation, the relevant code is factored-out in ipv4 and ipv6 specific helpers and exposed to UDP usage. While the current code can probably be improved, this safeguard ,implemented in the patches 4-7, allows future enachements to enable UDP GSO offload on more virtual devices eventually even on forwarded packets. The last 4 for patches implement some performance and functional self-tests, re-using the existing udpgso infrastructure. The problematic scenario described above is explicitly tested. v1 - v2: - use a new option to enable UDP GRO - use static keys to protect the UDP GRO socket lookup - cope with UDP GRO misdirection - add self-tests Paolo Abeni (10): udp: implement complete book-keeping for encap_needed udp: implement GRO for plain UDP sockets. udp: add support for UDP_GRO cmsg ip: factor out protocol delivery helper ipv6: factor out protocol delivery helper udp: cope with UDP GRO packet misdirection selftests: add GRO support to udp bench rx program selftests: conditionally enable XDP support in udpgso_bench_rx selftests: add some benchmark for UDP GRO selftests: add functionals test for UDP GRO include/linux/udp.h | 42 +++- include/net/udp_tunnel.h | 6 + include/uapi/linux/udp.h | 1 + net/ipv4/ip_input.c | 73 ++++--- net/ipv4/udp.c | 54 ++++- net/ipv4/udp_offload.c | 109 ++++++++-- net/ipv6/ip6_input.c | 28 +-- net/ipv6/udp.c | 44 +++- net/ipv6/udp_offload.c | 6 +- tools/testing/selftests/net/Makefile | 70 +++++++ tools/testing/selftests/net/udpgro.sh | 144 +++++++++++++ tools/testing/selftests/net/udpgro_bench.sh | 94 +++++++++ tools/testing/selftests/net/udpgso_bench.sh | 2 +- tools/testing/selftests/net/udpgso_bench_rx.c | 195 ++++++++++++++++-- tools/testing/selftests/net/udpgso_bench_tx.c | 22 +- tools/testing/selftests/net/xdp_dummy.c | 13 ++ 16 files changed, 790 insertions(+), 113 deletions(-) create mode 100755 tools/testing/selftests/net/udpgro.sh create mode 100755 tools/testing/selftests/net/udpgro_bench.sh create mode 100644 tools/testing/selftests/net/xdp_dummy.c -- 2.17.2