Netdev List
 help / color / mirror / Atom feed
From: Anton Danilov <littlesmilingcloud@gmail.com>
To: netdev@vger.kernel.org
Cc: "David S . Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	David Ahern <dsahern@kernel.org>, Simon Horman <horms@kernel.org>,
	Shuah Khan <shuah@kernel.org>,
	linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org
Subject: [PATCH net-next 03/11] selftests: net: add a test for the tunnel RX drop reasons
Date: Tue,  1 Sep 2026 00:51:29 +0300	[thread overview]
Message-ID: <20260831215137.549324-4-littlesmilingcloud@gmail.com> (raw)
In-Reply-To: <20260831215137.549324-1-littlesmilingcloud@gmail.com>

Exercise the two drop reasons added to ip_tunnel_rcv() and
__ip6_tnl_rcv() for the cases they were introduced for, on both GRE and
ip6gre:

 - a receiver configured with 'iseq' or 'icsum' facing a sender that
   emits neither reports IP_TUNNEL_CFG_OPTS_MISMATCH,

 - recreating the tunnel device on the sender resets its outgoing
   sequence number the way a peer reboot would, and the receiver then
   reports IP_TUNNEL_OLD_SEQ.

A control case, where both endpoints agree on the options, makes sure
that no tunnel drop reason is reported when the packets are accepted.

The reasons are read from the skb:kfree_skb tracepoint through a
dedicated trace instance, so that the test neither disturbs nor depends
on anything else using the tracing facility.  The test is skipped when
that instance cannot be set up.

Assisted-by: Claude-Code:claude-opus-5
Signed-off-by: Anton Danilov <littlesmilingcloud@gmail.com>
---
 tools/testing/selftests/net/Makefile          |   1 +
 tools/testing/selftests/net/config            |   1 +
 .../selftests/net/tunnel_drop_reasons.sh      | 228 ++++++++++++++++++
 3 files changed, 230 insertions(+)
 create mode 100755 tools/testing/selftests/net/tunnel_drop_reasons.sh

diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile
index 0f5c178bc224..9acf364e8919 100644
--- a/tools/testing/selftests/net/Makefile
+++ b/tools/testing/selftests/net/Makefile
@@ -117,6 +117,7 @@ TEST_PROGS := \
 	test_vxlan_vnifiltering.sh \
 	tfo_passive.sh \
 	traceroute.sh \
+	tunnel_drop_reasons.sh \
 	txtimestamp.sh \
 	udpgro.sh \
 	udpgro_bench.sh \
diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config
index 30d5fcb09a83..281633ff3aa9 100644
--- a/tools/testing/selftests/net/config
+++ b/tools/testing/selftests/net/config
@@ -14,6 +14,7 @@ CONFIG_CRYPTO_SM4_GENERIC=y
 CONFIG_DEBUG_INFO_BTF=y
 CONFIG_DEBUG_INFO_BTF_MODULES=n
 CONFIG_DUMMY=y
+CONFIG_ENABLE_DEFAULT_TRACERS=y
 CONFIG_GENEVE=m
 CONFIG_IFB=y
 CONFIG_INET_DIAG=y
diff --git a/tools/testing/selftests/net/tunnel_drop_reasons.sh b/tools/testing/selftests/net/tunnel_drop_reasons.sh
new file mode 100755
index 000000000000..eb19967ae7dd
--- /dev/null
+++ b/tools/testing/selftests/net/tunnel_drop_reasons.sh
@@ -0,0 +1,228 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+#
+# Test the drop reasons reported by the generic tunnel RX path,
+# ip_tunnel_rcv() and __ip6_tnl_rcv().
+#
+# Two situations are checked, for both GRE and ip6gre:
+#
+#  - the options carried by the packet do not match the tunnel
+#    configuration, which is reported as IP_TUNNEL_CFG_OPTS_MISMATCH.
+#    It is triggered here by configuring the receiver with 'iseq' or
+#    'icsum' while the sender emits neither.
+#
+#  - the sequence number of the packet is older than the one expected by
+#    the tunnel, which is reported as IP_TUNNEL_OLD_SEQ.  It is
+#    triggered here by recreating the tunnel device on the sender, which
+#    resets its outgoing sequence number the same way a peer reboot
+#    would.
+#
+# A control case, where both endpoints agree on the options, makes sure
+# that no tunnel drop reason is reported when packets are accepted.
+#
+# Drop reasons are read from the skb:kfree_skb tracepoint.  A dedicated
+# trace instance is used so that the test does not disturb, and is not
+# disturbed by, anything else using the tracing facility.
+
+source lib.sh
+
+NS_SND=""
+NS_RCV=""
+TRACE_DIR=""
+TR=""
+
+SND_V4=10.0.0.1
+RCV_V4=10.0.0.2
+SND_V6=2001:db8::1
+RCV_V6=2001:db8::2
+TUN_SND=192.168.1.1
+TUN_RCV=192.168.1.2
+
+cleanup()
+{
+	if [ -n "$TR" ]; then
+		echo 0 > "$TR/events/skb/kfree_skb/enable" 2>/dev/null
+		rmdir "$TR" 2>/dev/null
+	fi
+	cleanup_all_ns
+}
+
+trap cleanup EXIT
+
+setup_tracing()
+{
+	local dir
+
+	for dir in /sys/kernel/tracing /sys/kernel/debug/tracing; do
+		if [ -f "$dir/trace" ]; then
+			TRACE_DIR="$dir"
+			break
+		fi
+	done
+	[ -n "$TRACE_DIR" ] || return 1
+	[ -d "$TRACE_DIR/instances" ] || return 1
+	[ -e "$TRACE_DIR/events/skb/kfree_skb" ] || return 1
+
+	TR="$TRACE_DIR/instances/tunnel_drop_reasons"
+	mkdir "$TR" 2>/dev/null || return 1
+	echo 1 > "$TR/events/skb/kfree_skb/enable" || return 1
+}
+
+setup_ns_pair()
+{
+	cleanup_all_ns
+	setup_ns NS_SND NS_RCV
+
+	ip link add veth_s netns "$NS_SND" type veth \
+		peer name veth_r netns "$NS_RCV"
+	ip -n "$NS_SND" link set veth_s up
+	ip -n "$NS_RCV" link set veth_r up
+
+	ip -n "$NS_SND" addr add "$SND_V4/24" dev veth_s
+	ip -n "$NS_RCV" addr add "$RCV_V4/24" dev veth_r
+	ip -n "$NS_SND" addr add "$SND_V6/64" dev veth_s nodad
+	ip -n "$NS_RCV" addr add "$RCV_V6/64" dev veth_r nodad
+}
+
+# $1: namespace, $2: local, $3: remote, $4...: tunnel options
+add_gre()
+{
+	local ns=$1 loc=$2 rem=$3
+
+	shift 3
+	ip -n "$ns" link add gre_test type gre local "$loc" remote "$rem" "$@"
+	ip -n "$ns" link set gre_test up
+}
+
+# $1: namespace, $2: local, $3: remote, $4...: tunnel options
+add_ip6gre()
+{
+	local ns=$1 loc=$2 rem=$3
+
+	shift 3
+	ip -n "$ns" link add gre_test type ip6gre local "$loc" remote "$rem" \
+		"$@"
+	ip -n "$ns" link set gre_test up
+}
+
+addr_tunnels()
+{
+	ip -n "$NS_SND" addr add "$TUN_SND/24" dev gre_test
+	ip -n "$NS_RCV" addr add "$TUN_RCV/24" dev gre_test
+}
+
+send_traffic()
+{
+	ip netns exec "$NS_SND" ping -c 2 -W 1 "$TUN_RCV" >/dev/null 2>&1
+	# Let the tracepoint records reach the trace buffer.
+	sleep 1
+}
+
+# $1: test name, $2: expected reason, empty if none is expected
+check_reason()
+{
+	local name=$1 want=$2 count
+
+	echo > "$TR/trace"
+	send_traffic
+
+	if [ -n "$want" ]; then
+		count=$(grep -c "reason: $want" "$TR/trace")
+		if [ "$count" -gt 0 ]; then
+			RET=$ksft_pass
+		else
+			RET=$ksft_fail
+		fi
+		log_test "$name" "$count dropped"
+	else
+		count=$(grep -c "reason: IP_TUNNEL_" "$TR/trace")
+		if [ "$count" -eq 0 ]; then
+			RET=$ksft_pass
+		else
+			RET=$ksft_fail
+		fi
+		log_test "$name" "$count dropped"
+	fi
+}
+
+test_opts_mismatch()
+{
+	local proto=$1 opt=$2
+	local add=add_gre loc=$SND_V4 rem=$RCV_V4
+
+	if [ "$proto" = "ip6gre" ]; then
+		add=add_ip6gre
+		loc=$SND_V6
+		rem=$RCV_V6
+	fi
+
+	setup_ns_pair
+	# The sender emits no option, the receiver expects one.
+	$add "$NS_SND" "$loc" "$rem"
+	$add "$NS_RCV" "$rem" "$loc" "$opt"
+	addr_tunnels
+
+	check_reason "$proto: $opt option mismatch" \
+		IP_TUNNEL_CFG_OPTS_MISMATCH
+}
+
+test_old_seq()
+{
+	local proto=$1
+	local add=add_gre loc=$SND_V4 rem=$RCV_V4
+
+	if [ "$proto" = "ip6gre" ]; then
+		add=add_ip6gre
+		loc=$SND_V6
+		rem=$RCV_V6
+	fi
+
+	setup_ns_pair
+	$add "$NS_SND" "$loc" "$rem" oseq
+	$add "$NS_RCV" "$rem" "$loc" iseq
+	addr_tunnels
+
+	# Raise the sequence number expected by the receiver, then reset the
+	# one used by the sender, as a peer reboot would do.
+	send_traffic
+	ip -n "$NS_SND" link del gre_test
+	$add "$NS_SND" "$loc" "$rem" oseq
+	ip -n "$NS_SND" addr add "$TUN_SND/24" dev gre_test
+
+	check_reason "$proto: old sequence number" IP_TUNNEL_OLD_SEQ
+}
+
+test_control()
+{
+	setup_ns_pair
+	add_gre "$NS_SND" "$SND_V4" "$RCV_V4" oseq ocsum
+	add_gre "$NS_RCV" "$RCV_V4" "$SND_V4" iseq icsum
+	addr_tunnels
+
+	check_reason "gre: matching configuration (control)" ""
+}
+
+if [ "$(id -u)" -ne 0 ]; then
+	echo "SKIP: need root"
+	exit "$ksft_skip"
+fi
+
+if ! setup_tracing; then
+	echo "SKIP: could not set up a trace instance for skb:kfree_skb"
+	exit "$ksft_skip"
+fi
+
+test_opts_mismatch gre iseq
+test_opts_mismatch gre icsum
+test_control
+test_old_seq gre
+
+if [ -e /proc/sys/net/ipv6 ]; then
+	test_opts_mismatch ip6gre iseq
+	test_old_seq ip6gre
+else
+	log_test_skip "ip6gre: iseq option mismatch"
+	log_test_skip "ip6gre: old sequence number"
+fi
+
+exit "$EXIT_STATUS"
-- 
2.47.3


  parent reply	other threads:[~2026-08-31 21:51 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-31 21:51 [PATCH net-next 00/11] tunnels: add core and gre drop reasons Anton Danilov
2026-08-31 21:51 ` [PATCH net-next 01/11] ip_tunnel: add drop reasons to the generic RX path Anton Danilov
2026-09-03  1:47   ` Jakub Kicinski
2026-09-03  1:47   ` Jakub Kicinski
2026-08-31 21:51 ` [PATCH net-next 02/11] ip6_tunnel: " Anton Danilov
2026-08-31 21:51 ` Anton Danilov [this message]
2026-09-03  1:45   ` [PATCH net-next 03/11] selftests: net: add a test for the tunnel RX drop reasons Jakub Kicinski
2026-08-31 21:51 ` [PATCH net-next 04/11] gre: make gre_parse_header() report a drop reason Anton Danilov
2026-08-31 21:51 ` [PATCH net-next 05/11] ip_gre: add drop reasons to the RX path Anton Danilov
2026-08-31 21:51 ` [PATCH net-next 06/11] ip6_gre: " Anton Danilov
2026-08-31 21:51 ` [PATCH net-next 07/11] selftests: net: cover the GRE specific drop reasons Anton Danilov
2026-08-31 21:51 ` [PATCH net-next 08/11] ip_tunnel: add drop reasons to the transmit path Anton Danilov
2026-08-31 21:51 ` [PATCH net-next 09/11] ip_gre: " Anton Danilov
2026-08-31 21:51 ` [PATCH net-next 10/11] ip6_tunnel: " Anton Danilov
2026-09-03  1:43   ` Jakub Kicinski
2026-08-31 21:51 ` [PATCH net-next 11/11] selftests: net: cover the tunnel transmit drop reasons Anton Danilov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260831215137.549324-4-littlesmilingcloud@gmail.com \
    --to=littlesmilingcloud@gmail.com \
    --cc=davem@davemloft.net \
    --cc=dsahern@kernel.org \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=shuah@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox