linux/tools/testing/selftests/net/rtnetlink_notification.sh
Yuyang Huang 14966a8df7 selftest: add selftest for anycast notifications
This commit adds a new kernel selftest to verify RTNLGRP_IPV6_ACADDR
notifications. The test works by adding/removing a dummy interface,
enabling packet forwarding, and then confirming that user space can
correctly receive anycast notifications.

The test relies on the iproute2 version to be 6.13+.

Tested by the following command:
$ vng -v --user root --cpus 16 -- \
make -C tools/testing/selftests TARGETS=net
TEST_PROGS=rtnetlink_notification.sh \
TEST_GEN_PROGS="" run_tests

Cc: Maciej Żenczykowski <maze@google.com>
Cc: Lorenzo Colitti <lorenzo@google.com>
Signed-off-by: Yuyang Huang <yuyanghuang@google.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2025-06-22 17:32:04 +01:00

113 lines
2.6 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# This test is for checking rtnetlink notification callpaths, and get as much
# coverage as possible.
#
# set -e
ALL_TESTS="
kci_test_mcast_addr_notification
kci_test_anycast_addr_notification
"
source lib.sh
test_dev="test-dummy1"
kci_test_mcast_addr_notification()
{
RET=0
local tmpfile
local monitor_pid
local match_result
tmpfile=$(mktemp)
defer rm "$tmpfile"
ip monitor maddr > $tmpfile &
monitor_pid=$!
defer kill_process "$monitor_pid"
sleep 1
if [ ! -e "/proc/$monitor_pid" ]; then
RET=$ksft_skip
log_test "mcast addr notification: iproute2 too old"
return $RET
fi
ip link add name "$test_dev" type dummy
check_err $? "failed to add dummy interface"
ip link set "$test_dev" up
check_err $? "failed to set dummy interface up"
ip link del dev "$test_dev"
check_err $? "Failed to delete dummy interface"
sleep 1
# There should be 4 line matches as follows.
# 13: test-dummy1    inet6 mcast ff02::1 scope global 
# 13: test-dummy1    inet mcast 224.0.0.1 scope global 
# Deleted 13: test-dummy1    inet mcast 224.0.0.1 scope global 
# Deleted 13: test-dummy1    inet6 mcast ff02::1 scope global 
match_result=$(grep -cE "$test_dev.*(224.0.0.1|ff02::1)" "$tmpfile")
if [ "$match_result" -ne 4 ]; then
RET=$ksft_fail
fi
log_test "mcast addr notification: Expected 4 matches, got $match_result"
return $RET
}
kci_test_anycast_addr_notification()
{
RET=0
local tmpfile
local monitor_pid
local match_result
tmpfile=$(mktemp)
defer rm "$tmpfile"
ip monitor acaddress > "$tmpfile" &
monitor_pid=$!
defer kill_process "$monitor_pid"
sleep 1
if [ ! -e "/proc/$monitor_pid" ]; then
RET=$ksft_skip
log_test "anycast addr notification: iproute2 too old"
return "$RET"
fi
ip link add name "$test_dev" type dummy
check_err $? "failed to add dummy interface"
ip link set "$test_dev" up
check_err $? "failed to set dummy interface up"
sysctl -qw net.ipv6.conf."$test_dev".forwarding=1
ip link del dev "$test_dev"
check_err $? "Failed to delete dummy interface"
sleep 1
# There should be 2 line matches as follows.
# 9: dummy2 inet6 any fe80:: scope global
# Deleted 9: dummy2 inet6 any fe80:: scope global
match_result=$(grep -cE "$test_dev.*(fe80::)" "$tmpfile")
if [ "$match_result" -ne 2 ]; then
RET=$ksft_fail
fi
log_test "anycast addr notification: Expected 2 matches, got $match_result"
return "$RET"
}
#check for needed privileges
if [ "$(id -u)" -ne 0 ];then
RET=$ksft_skip
log_test "need root privileges"
exit $RET
fi
require_command ip
tests_run
exit $EXIT_STATUS