From b5dc3fde8b92286a0cb06bf08e2ec0141cf867bb Mon Sep 17 00:00:00 2001 From: Ido Schimmel Date: Mon, 19 Oct 2026 17:03:37 +0300 Subject: [PATCH] selftests: netdevsim: Add FIB notification tests for nexthop objects Add IPv4 and IPv6 test cases that program a route that uses a nexthop object and check that two notifications are emitted for it, with the second one carrying the RTM_F_TRAP flag. The new route_nexthop_check() helper follows the same pattern as the existing route_{addition,deletion,replacement}_check() helpers. Without "ipv6: Hold RCU when emitting route hardware flags notification", the IPv6 test case passes, but triggers suspicious RCU usage splats. The IPv4 test case is added for completeness. Signed-off-by: Ido Schimmel Reviewed-by: Eric Dumazet Reviewed-by: David Ahern Link: https://patch.msgid.link/20261019140337.2886875-3-idosch@nvidia.com Signed-off-by: Jakub Kicinski --- .../net/netdevsim/fib_notifications.sh | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/tools/testing/selftests/drivers/net/netdevsim/fib_notifications.sh b/tools/testing/selftests/drivers/net/netdevsim/fib_notifications.sh index 9896580c3d85..c49d6deb621a 100755 --- a/tools/testing/selftests/drivers/net/netdevsim/fib_notifications.sh +++ b/tools/testing/selftests/drivers/net/netdevsim/fib_notifications.sh @@ -8,10 +8,12 @@ ALL_TESTS=" ipv4_route_deletion_test ipv4_route_replacement_test ipv4_route_offload_failed_test + ipv4_route_nexthop_test ipv6_route_addition_test ipv6_route_deletion_test ipv6_route_replacement_test ipv6_route_offload_failed_test + ipv6_route_nexthop_test " NETDEVSIM_PATH=/sys/bus/netdevsim/ @@ -269,6 +271,50 @@ ipv4_route_offload_failed_test() log_test "IPv4 route offload failed" } +route_nexthop_check() +{ + local ip=$1; shift + local route=$1; shift + local nhid=$1; shift + local expected_num_notifications=$1; shift + local outfile + + ip netns exec testns1 sysctl -qw net.$ip.fib_notify_on_flag_change=1 + + outfile=$(mktemp) + + $IP monitor route &> $outfile & + sleep 1 + $IP route add $route nhid $nhid + sleep 1 + kill_process %% + + route_notify_check $outfile $expected_num_notifications + rm -f $outfile + + $IP route del $route nhid $nhid +} + +ipv4_route_nexthop_test() +{ + RET=0 + + local ip="ipv4" + local route=192.0.2.0/24 + local nhid=1 + + $IP -4 nexthop add id $nhid dev dummy1 + + # Make sure two notifications will be emitted for a programmed route + # that uses a nexthop object. + local expected_num_notifications=2 + route_nexthop_check $ip $route $nhid $expected_num_notifications + + $IP nexthop del id $nhid + + log_test "IPv4 route with nexthop object" +} + ipv6_route_addition_test() { RET=0 @@ -385,6 +431,26 @@ ipv6_route_offload_failed_test() log_test "IPv6 route offload failed" } +ipv6_route_nexthop_test() +{ + RET=0 + + local ip="ipv6" + local route=2001:db8:1::/64 + local nhid=1 + + $IP -6 nexthop add id $nhid dev dummy1 + + # Make sure two notifications will be emitted for a programmed route + # that uses a nexthop object. + local expected_num_notifications=2 + route_nexthop_check $ip $route $nhid $expected_num_notifications + + $IP nexthop del id $nhid + + log_test "IPv6 route with nexthop object" +} + setup_prepare() { modprobe netdevsim &> /dev/null