xref: /linux/tools/testing/selftests/net/rtnetlink_notification.sh (revision 8be4d31cb8aaeea27bde4b7ddb26e28a89062ebf)
1e74058f5SYuyang Huang#!/bin/bash
2e74058f5SYuyang Huang# SPDX-License-Identifier: GPL-2.0
3e74058f5SYuyang Huang#
4e74058f5SYuyang Huang# This test is for checking rtnetlink notification callpaths, and get as much
5e74058f5SYuyang Huang# coverage as possible.
6e74058f5SYuyang Huang#
7e74058f5SYuyang Huang# set -e
8e74058f5SYuyang Huang
9e74058f5SYuyang HuangALL_TESTS="
10e74058f5SYuyang Huang	kci_test_mcast_addr_notification
11*14966a8dSYuyang Huang	kci_test_anycast_addr_notification
12e74058f5SYuyang Huang"
13e74058f5SYuyang Huang
14e74058f5SYuyang Huangsource lib.sh
15*14966a8dSYuyang Huangtest_dev="test-dummy1"
16e74058f5SYuyang Huang
17e74058f5SYuyang Huangkci_test_mcast_addr_notification()
18e74058f5SYuyang Huang{
19e74058f5SYuyang Huang	RET=0
20e74058f5SYuyang Huang	local tmpfile
21e74058f5SYuyang Huang	local monitor_pid
22e74058f5SYuyang Huang	local match_result
23e74058f5SYuyang Huang
24e74058f5SYuyang Huang	tmpfile=$(mktemp)
25e74058f5SYuyang Huang	defer rm "$tmpfile"
26e74058f5SYuyang Huang
27e74058f5SYuyang Huang	ip monitor maddr > $tmpfile &
28e74058f5SYuyang Huang	monitor_pid=$!
29e74058f5SYuyang Huang	defer kill_process "$monitor_pid"
30e74058f5SYuyang Huang
31e74058f5SYuyang Huang	sleep 1
32e74058f5SYuyang Huang
33e74058f5SYuyang Huang	if [ ! -e "/proc/$monitor_pid" ]; then
34e74058f5SYuyang Huang		RET=$ksft_skip
35e74058f5SYuyang Huang		log_test "mcast addr notification: iproute2 too old"
36e74058f5SYuyang Huang		return $RET
37e74058f5SYuyang Huang	fi
38e74058f5SYuyang Huang
39e74058f5SYuyang Huang	ip link add name "$test_dev" type dummy
40e74058f5SYuyang Huang	check_err $? "failed to add dummy interface"
41e74058f5SYuyang Huang	ip link set "$test_dev" up
42e74058f5SYuyang Huang	check_err $? "failed to set dummy interface up"
43e74058f5SYuyang Huang	ip link del dev "$test_dev"
44e74058f5SYuyang Huang	check_err $? "Failed to delete dummy interface"
45e74058f5SYuyang Huang	sleep 1
46e74058f5SYuyang Huang
47e74058f5SYuyang Huang	# There should be 4 line matches as follows.
48e74058f5SYuyang Huang	# 13: test-dummy1    inet6 mcast ff02::1 scope global 
49e74058f5SYuyang Huang	# 13: test-dummy1    inet mcast 224.0.0.1 scope global 
50e74058f5SYuyang Huang	# Deleted 13: test-dummy1    inet mcast 224.0.0.1 scope global 
51e74058f5SYuyang Huang	# Deleted 13: test-dummy1    inet6 mcast ff02::1 scope global 
52e74058f5SYuyang Huang	match_result=$(grep -cE "$test_dev.*(224.0.0.1|ff02::1)" "$tmpfile")
53e74058f5SYuyang Huang	if [ "$match_result" -ne 4 ]; then
54e74058f5SYuyang Huang		RET=$ksft_fail
55e74058f5SYuyang Huang	fi
56e74058f5SYuyang Huang	log_test "mcast addr notification: Expected 4 matches, got $match_result"
57e74058f5SYuyang Huang	return $RET
58e74058f5SYuyang Huang}
59e74058f5SYuyang Huang
60*14966a8dSYuyang Huangkci_test_anycast_addr_notification()
61*14966a8dSYuyang Huang{
62*14966a8dSYuyang Huang	RET=0
63*14966a8dSYuyang Huang	local tmpfile
64*14966a8dSYuyang Huang	local monitor_pid
65*14966a8dSYuyang Huang	local match_result
66*14966a8dSYuyang Huang
67*14966a8dSYuyang Huang	tmpfile=$(mktemp)
68*14966a8dSYuyang Huang	defer rm "$tmpfile"
69*14966a8dSYuyang Huang
70*14966a8dSYuyang Huang	ip monitor acaddress > "$tmpfile" &
71*14966a8dSYuyang Huang	monitor_pid=$!
72*14966a8dSYuyang Huang	defer kill_process "$monitor_pid"
73*14966a8dSYuyang Huang	sleep 1
74*14966a8dSYuyang Huang
75*14966a8dSYuyang Huang	if [ ! -e "/proc/$monitor_pid" ]; then
76*14966a8dSYuyang Huang		RET=$ksft_skip
77*14966a8dSYuyang Huang		log_test "anycast addr notification: iproute2 too old"
78*14966a8dSYuyang Huang		return "$RET"
79*14966a8dSYuyang Huang	fi
80*14966a8dSYuyang Huang
81*14966a8dSYuyang Huang	ip link add name "$test_dev" type dummy
82*14966a8dSYuyang Huang	check_err $? "failed to add dummy interface"
83*14966a8dSYuyang Huang	ip link set "$test_dev" up
84*14966a8dSYuyang Huang	check_err $? "failed to set dummy interface up"
85*14966a8dSYuyang Huang	sysctl -qw net.ipv6.conf."$test_dev".forwarding=1
86*14966a8dSYuyang Huang	ip link del dev "$test_dev"
87*14966a8dSYuyang Huang	check_err $? "Failed to delete dummy interface"
88*14966a8dSYuyang Huang	sleep 1
89*14966a8dSYuyang Huang
90*14966a8dSYuyang Huang	# There should be 2 line matches as follows.
91*14966a8dSYuyang Huang	# 9: dummy2    inet6 any fe80:: scope global
92*14966a8dSYuyang Huang	# Deleted 9: dummy2    inet6 any fe80:: scope global
93*14966a8dSYuyang Huang	match_result=$(grep -cE "$test_dev.*(fe80::)" "$tmpfile")
94*14966a8dSYuyang Huang	if [ "$match_result" -ne 2 ]; then
95*14966a8dSYuyang Huang		RET=$ksft_fail
96*14966a8dSYuyang Huang	fi
97*14966a8dSYuyang Huang	log_test "anycast addr notification: Expected 2 matches, got $match_result"
98*14966a8dSYuyang Huang	return "$RET"
99*14966a8dSYuyang Huang}
100*14966a8dSYuyang Huang
101e74058f5SYuyang Huang#check for needed privileges
102e74058f5SYuyang Huangif [ "$(id -u)" -ne 0 ];then
103e74058f5SYuyang Huang	RET=$ksft_skip
104e74058f5SYuyang Huang	log_test "need root privileges"
105e74058f5SYuyang Huang	exit $RET
106e74058f5SYuyang Huangfi
107e74058f5SYuyang Huang
108e74058f5SYuyang Huangrequire_command ip
109e74058f5SYuyang Huang
110e74058f5SYuyang Huangtests_run
111e74058f5SYuyang Huang
112e74058f5SYuyang Huangexit $EXIT_STATUS
113