Merge branch 'bareudp-enable-big-tcp-packets'

Haishuang Yan says:

====================
bareudp: Enable BIG TCP packets

This series allows BIG TCP on bareudp, the same way as on vxlan and
geneve, and extends the big_tcp_tunnels.sh selftest to cover it.

Patch 1 bumps tso_max_size of bareudp devices to GSO_MAX_SIZE.

Patch 2 adds bareudp to big_tcp_tunnels.sh. bareudp only works in
external mode, so the test attaches the tunnel metadata with a tc
tunnel_key action on egress.

Patch 2 depends on commit c57b2e60d4 ("bareudp: set the inner protocol
to the protocol of the packet"), now in net-next.
====================

Link: https://patch.msgid.link/20261011102023.1603595-1-yanhaishuang@cmss.chinamobile.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jakub Kicinski 2026-10-16 18:32:47 -07:00
commit b4423835d9
2 changed files with 47 additions and 9 deletions

View File

@ -590,6 +590,7 @@ static void bareudp_setup(struct net_device *dev)
dev->max_mtu = IP_MAX_MTU - BAREUDP_BASE_HLEN;
dev->type = ARPHRD_NONE;
netif_keep_dst(dev);
netif_set_tso_max_size(dev, GSO_MAX_SIZE);
dev->priv_flags |= IFF_NO_QUEUE;
dev->lltx = true;
dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0
#
# Testing for IPv4 and IPv6 BIG TCP over VXLAN and GENEVE tunnels.
# Testing for IPv4 and IPv6 BIG TCP over VXLAN, GENEVE and bareudp tunnels.
source "$(dirname "$0")/lib.sh"
@ -53,6 +53,24 @@ setup() {
DEFAULT_TCP_MIN_TSO_SEGS=$(ip netns exec "$CLIENT_NS" sysctl -n net.ipv4.tcp_min_tso_segs)
}
# Create a bareudp device. bareudp only works in external mode: attach the
# tunnel metadata to all packets sent through the device. Its MTU does not
# account for the encapsulation either, so leave room for IPv6 and UDP
# headers.
# $1: netns, $2: device, $3: local underlay address, $4: remote one
setup_bareudp() {
ip -netns "$1" link add "$2" type bareudp \
dstport 6635 ethertype ipv4 multiproto &&
ip -netns "$1" link set "$2" mtu 1452 &&
tc -netns "$1" qdisc add dev "$2" clsact &&
tc -netns "$1" filter add dev "$2" egress matchall \
action tunnel_key set src_ip "$3" dst_ip "$4" id 0 ttl 64 &&
return 0
echo "Failed to set up bareudp device $2" >&2
return 1
}
setup_tunnel() {
if [ "$2" = 4 ]; then
SERVER_IP="$SERVER_IP4"
@ -64,26 +82,40 @@ setup_tunnel() {
echo "Setting up ${1^^} over IPv6, veth tx csum offload $3"
fi
if [ "$1" = vxlan ]; then
case "$1" in
vxlan)
ip -netns "$CLIENT_NS" link add tun0 type vxlan \
id 5001 remote "$SERVER_IP" local "$CLIENT_IP" dev link0 dstport 4789
else
;;
geneve)
ip -netns "$CLIENT_NS" link add tun0 type geneve \
id 5001 remote "$SERVER_IP"
fi
;;
bareudp)
setup_bareudp "$CLIENT_NS" tun0 "$CLIENT_IP" "$SERVER_IP" ||
return 1
;;
esac
ip -netns "$CLIENT_NS" link set tun0 up
ip -netns "$CLIENT_NS" addr replace "$CLIENT_IP4_TUN/24" dev tun0
ip -netns "$CLIENT_NS" addr replace "$CLIENT_IP6_TUN/112" dev tun0 nodad
ip -netns "$CLIENT_NS" link set tun0 \
gso_max_size 196608 gso_ipv4_max_size 196608 \
gro_max_size 196608 gro_ipv4_max_size 196608
if [ "$1" = vxlan ]; then
case "$1" in
vxlan)
ip -netns "$SERVER_NS" link add tun1 type vxlan \
id 5001 remote "$CLIENT_IP" local "$SERVER_IP" dev link1 dstport 4789
else
;;
geneve)
ip -netns "$SERVER_NS" link add tun1 type geneve \
id 5001 remote "$CLIENT_IP"
fi
;;
bareudp)
setup_bareudp "$SERVER_NS" tun1 "$SERVER_IP" "$CLIENT_IP" ||
return 1
;;
esac
ip -netns "$SERVER_NS" link set tun1 up
ip -netns "$SERVER_NS" addr replace "$SERVER_IP4_TUN/24" dev tun1
ip -netns "$SERVER_NS" addr replace "$SERVER_IP6_TUN/112" dev tun1 nodad
@ -112,7 +144,7 @@ do_test() {
local packets_threshold="$PACKETS_THRESHOLD"
# When tx csum offload is off, software GSO is performed before passing the
# packet to veth. Check BIG TCP packets inside the VXLAN tunnel to verify
# packet to veth. Check BIG TCP packets inside the tunnel to verify
# the software checksum path: if the checksum code is broken, these packets
# will be dropped.
if [ "$3" = on ]; then
@ -193,6 +225,11 @@ if ! iptables --version &> /dev/null; then
exit "$ksft_skip"
fi
if ! tc -V &> /dev/null; then
echo "SKIP: Could not run test without tc tool"
exit "$ksft_skip"
fi
if ! ethtool --version &> /dev/null; then
echo "SKIP: Could not run test without ethtool tool"
exit "$ksft_skip"
@ -206,7 +243,7 @@ fi
WORKDIR=$(mktemp -d)
trap cleanup EXIT
setup
for tunnel in vxlan geneve; do
for tunnel in vxlan geneve bareudp; do
for tun_family in 4 6; do
for traffic_family in 4 6; do
for csum_offload in on off; do