]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests: traceroute: Test traceroute with different source IPs
authorIdo Schimmel <idosch@nvidia.com>
Mon, 8 Sep 2025 07:32:37 +0000 (10:32 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 11 Sep 2025 10:22:38 +0000 (12:22 +0200)
When generating ICMP error messages, the kernel will prefer a source IP
that is on the same subnet as the destination IP (see
inet_select_addr()). Test this behavior by invoking traceroute with
different source IPs and checking that the ICMP error message is
generated with a source IP in the same subnet.

Reviewed-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Link: https://patch.msgid.link/20250908073238.119240-8-idosch@nvidia.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
tools/testing/selftests/net/traceroute.sh

index 8dc4e5d03e439a084f4ca7fac195510c3fce3114..0ab9eccf1499934e2bed0917b0028ac6c5bb64ec 100755 (executable)
@@ -196,9 +196,10 @@ run_traceroute6()
 ################################################################################
 # traceroute test
 #
-# Verify that traceroute from H1 to H2 shows 1.0.1.1 in this scenario
+# Verify that traceroute from H1 to H2 shows 1.0.3.1 and 1.0.1.1 when
+# traceroute uses 1.0.3.3 and 1.0.1.3 as the source IP, respectively.
 #
-#                    1.0.3.1/24
+#      1.0.3.3/24    1.0.3.1/24
 # ---- 1.0.1.3/24    1.0.1.1/24 ---- 1.0.2.1/24    1.0.2.4/24 ----
 # |H1|--------------------------|R1|--------------------------|H2|
 # ----            N1            ----            N2            ----
@@ -226,6 +227,7 @@ setup_traceroute()
 
        connect_ns $h1 eth0 1.0.1.3/24 - \
                   $router eth1 1.0.3.1/24 -
+       ip -n "$h1" addr add 1.0.3.3/24 dev eth0
        ip netns exec $h1 ip route add default via 1.0.1.1
 
        ip netns exec $router ip addr add 1.0.1.1/24 dev eth1
@@ -248,9 +250,12 @@ run_traceroute()
 
        RET=0
 
-       # traceroute host-2 from host-1 (expects 1.0.1.1). Takes a while.
-       run_cmd $h1 "traceroute 1.0.2.4 | grep -q 1.0.1.1"
+       # traceroute host-2 from host-1. Expect a source IP that is on the same
+       # subnet as destination IP of the ICMP error message.
+       run_cmd "$h1" "traceroute -s 1.0.1.3 1.0.2.4 | grep -q 1.0.1.1"
        check_err $? "traceroute did not return 1.0.1.1"
+       run_cmd "$h1" "traceroute -s 1.0.3.3 1.0.2.4 | grep -q 1.0.3.1"
+       check_err $? "traceroute did not return 1.0.3.1"
        log_test "IPv4 traceroute"
 
        cleanup_traceroute