xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/net/fib_rule_tests.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun# This test is for checking IPv4 and IPv6 FIB rules API
5*4882a593Smuzhiyun
6*4882a593Smuzhiyunret=0
7*4882a593Smuzhiyun
8*4882a593SmuzhiyunPAUSE_ON_FAIL=${PAUSE_ON_FAIL:=no}
9*4882a593SmuzhiyunIP="ip -netns testns"
10*4882a593Smuzhiyun
11*4882a593SmuzhiyunRTABLE=100
12*4882a593SmuzhiyunGW_IP4=192.51.100.2
13*4882a593SmuzhiyunSRC_IP=192.51.100.3
14*4882a593SmuzhiyunGW_IP6=2001:db8:1::2
15*4882a593SmuzhiyunSRC_IP6=2001:db8:1::3
16*4882a593Smuzhiyun
17*4882a593SmuzhiyunDEV_ADDR=192.51.100.1
18*4882a593SmuzhiyunDEV_ADDR6=2001:db8:1::1
19*4882a593SmuzhiyunDEV=dummy0
20*4882a593Smuzhiyun
21*4882a593Smuzhiyunlog_test()
22*4882a593Smuzhiyun{
23*4882a593Smuzhiyun	local rc=$1
24*4882a593Smuzhiyun	local expected=$2
25*4882a593Smuzhiyun	local msg="$3"
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun	if [ ${rc} -eq ${expected} ]; then
28*4882a593Smuzhiyun		nsuccess=$((nsuccess+1))
29*4882a593Smuzhiyun		printf "\n    TEST: %-50s  [ OK ]\n" "${msg}"
30*4882a593Smuzhiyun	else
31*4882a593Smuzhiyun		ret=1
32*4882a593Smuzhiyun		nfail=$((nfail+1))
33*4882a593Smuzhiyun		printf "\n    TEST: %-50s  [FAIL]\n" "${msg}"
34*4882a593Smuzhiyun		if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
35*4882a593Smuzhiyun			echo
36*4882a593Smuzhiyun			echo "hit enter to continue, 'q' to quit"
37*4882a593Smuzhiyun			read a
38*4882a593Smuzhiyun			[ "$a" = "q" ] && exit 1
39*4882a593Smuzhiyun		fi
40*4882a593Smuzhiyun	fi
41*4882a593Smuzhiyun}
42*4882a593Smuzhiyun
43*4882a593Smuzhiyunlog_section()
44*4882a593Smuzhiyun{
45*4882a593Smuzhiyun	echo
46*4882a593Smuzhiyun	echo "######################################################################"
47*4882a593Smuzhiyun	echo "TEST SECTION: $*"
48*4882a593Smuzhiyun	echo "######################################################################"
49*4882a593Smuzhiyun}
50*4882a593Smuzhiyun
51*4882a593Smuzhiyunsetup()
52*4882a593Smuzhiyun{
53*4882a593Smuzhiyun	set -e
54*4882a593Smuzhiyun	ip netns add testns
55*4882a593Smuzhiyun	$IP link set dev lo up
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun	$IP link add dummy0 type dummy
58*4882a593Smuzhiyun	$IP link set dev dummy0 up
59*4882a593Smuzhiyun	$IP address add $DEV_ADDR/24 dev dummy0
60*4882a593Smuzhiyun	$IP -6 address add $DEV_ADDR6/64 dev dummy0
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun	set +e
63*4882a593Smuzhiyun}
64*4882a593Smuzhiyun
65*4882a593Smuzhiyuncleanup()
66*4882a593Smuzhiyun{
67*4882a593Smuzhiyun	$IP link del dev dummy0 &> /dev/null
68*4882a593Smuzhiyun	ip netns del testns
69*4882a593Smuzhiyun}
70*4882a593Smuzhiyun
71*4882a593Smuzhiyunfib_check_iproute_support()
72*4882a593Smuzhiyun{
73*4882a593Smuzhiyun	ip rule help 2>&1 | grep -q $1
74*4882a593Smuzhiyun	if [ $? -ne 0 ]; then
75*4882a593Smuzhiyun		echo "SKIP: iproute2 iprule too old, missing $1 match"
76*4882a593Smuzhiyun		return 1
77*4882a593Smuzhiyun	fi
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun	ip route get help 2>&1 | grep -q $2
80*4882a593Smuzhiyun	if [ $? -ne 0 ]; then
81*4882a593Smuzhiyun		echo "SKIP: iproute2 get route too old, missing $2 match"
82*4882a593Smuzhiyun		return 1
83*4882a593Smuzhiyun	fi
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun	return 0
86*4882a593Smuzhiyun}
87*4882a593Smuzhiyun
88*4882a593Smuzhiyunfib_rule6_del()
89*4882a593Smuzhiyun{
90*4882a593Smuzhiyun	$IP -6 rule del $1
91*4882a593Smuzhiyun	log_test $? 0 "rule6 del $1"
92*4882a593Smuzhiyun}
93*4882a593Smuzhiyun
94*4882a593Smuzhiyunfib_rule6_del_by_pref()
95*4882a593Smuzhiyun{
96*4882a593Smuzhiyun	pref=$($IP -6 rule show | grep "$1 lookup $TABLE" | cut -d ":" -f 1)
97*4882a593Smuzhiyun	$IP -6 rule del pref $pref
98*4882a593Smuzhiyun}
99*4882a593Smuzhiyun
100*4882a593Smuzhiyunfib_rule6_test_match_n_redirect()
101*4882a593Smuzhiyun{
102*4882a593Smuzhiyun	local match="$1"
103*4882a593Smuzhiyun	local getmatch="$2"
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun	$IP -6 rule add $match table $RTABLE
106*4882a593Smuzhiyun	$IP -6 route get $GW_IP6 $getmatch | grep -q "table $RTABLE"
107*4882a593Smuzhiyun	log_test $? 0 "rule6 check: $1"
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun	fib_rule6_del_by_pref "$match"
110*4882a593Smuzhiyun	log_test $? 0 "rule6 del by pref: $match"
111*4882a593Smuzhiyun}
112*4882a593Smuzhiyun
113*4882a593Smuzhiyunfib_rule6_test()
114*4882a593Smuzhiyun{
115*4882a593Smuzhiyun	# setup the fib rule redirect route
116*4882a593Smuzhiyun	$IP -6 route add table $RTABLE default via $GW_IP6 dev $DEV onlink
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun	match="oif $DEV"
119*4882a593Smuzhiyun	fib_rule6_test_match_n_redirect "$match" "$match" "oif redirect to table"
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun	match="from $SRC_IP6 iif $DEV"
122*4882a593Smuzhiyun	fib_rule6_test_match_n_redirect "$match" "$match" "iif redirect to table"
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun	match="tos 0x10"
125*4882a593Smuzhiyun	fib_rule6_test_match_n_redirect "$match" "$match" "tos redirect to table"
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun	match="fwmark 0x64"
128*4882a593Smuzhiyun	getmatch="mark 0x64"
129*4882a593Smuzhiyun	fib_rule6_test_match_n_redirect "$match" "$getmatch" "fwmark redirect to table"
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun	fib_check_iproute_support "uidrange" "uid"
132*4882a593Smuzhiyun	if [ $? -eq 0 ]; then
133*4882a593Smuzhiyun		match="uidrange 100-100"
134*4882a593Smuzhiyun		getmatch="uid 100"
135*4882a593Smuzhiyun		fib_rule6_test_match_n_redirect "$match" "$getmatch" "uid redirect to table"
136*4882a593Smuzhiyun	fi
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun	fib_check_iproute_support "sport" "sport"
139*4882a593Smuzhiyun	if [ $? -eq 0 ]; then
140*4882a593Smuzhiyun		match="sport 666 dport 777"
141*4882a593Smuzhiyun		fib_rule6_test_match_n_redirect "$match" "$match" "sport and dport redirect to table"
142*4882a593Smuzhiyun	fi
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun	fib_check_iproute_support "ipproto" "ipproto"
145*4882a593Smuzhiyun	if [ $? -eq 0 ]; then
146*4882a593Smuzhiyun		match="ipproto tcp"
147*4882a593Smuzhiyun		fib_rule6_test_match_n_redirect "$match" "$match" "ipproto match"
148*4882a593Smuzhiyun	fi
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun	fib_check_iproute_support "ipproto" "ipproto"
151*4882a593Smuzhiyun	if [ $? -eq 0 ]; then
152*4882a593Smuzhiyun		match="ipproto ipv6-icmp"
153*4882a593Smuzhiyun		fib_rule6_test_match_n_redirect "$match" "$match" "ipproto ipv6-icmp match"
154*4882a593Smuzhiyun	fi
155*4882a593Smuzhiyun}
156*4882a593Smuzhiyun
157*4882a593Smuzhiyunfib_rule4_del()
158*4882a593Smuzhiyun{
159*4882a593Smuzhiyun	$IP rule del $1
160*4882a593Smuzhiyun	log_test $? 0 "del $1"
161*4882a593Smuzhiyun}
162*4882a593Smuzhiyun
163*4882a593Smuzhiyunfib_rule4_del_by_pref()
164*4882a593Smuzhiyun{
165*4882a593Smuzhiyun	pref=$($IP rule show | grep "$1 lookup $TABLE" | cut -d ":" -f 1)
166*4882a593Smuzhiyun	$IP rule del pref $pref
167*4882a593Smuzhiyun}
168*4882a593Smuzhiyun
169*4882a593Smuzhiyunfib_rule4_test_match_n_redirect()
170*4882a593Smuzhiyun{
171*4882a593Smuzhiyun	local match="$1"
172*4882a593Smuzhiyun	local getmatch="$2"
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun	$IP rule add $match table $RTABLE
175*4882a593Smuzhiyun	$IP route get $GW_IP4 $getmatch | grep -q "table $RTABLE"
176*4882a593Smuzhiyun	log_test $? 0 "rule4 check: $1"
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun	fib_rule4_del_by_pref "$match"
179*4882a593Smuzhiyun	log_test $? 0 "rule4 del by pref: $match"
180*4882a593Smuzhiyun}
181*4882a593Smuzhiyun
182*4882a593Smuzhiyunfib_rule4_test()
183*4882a593Smuzhiyun{
184*4882a593Smuzhiyun	# setup the fib rule redirect route
185*4882a593Smuzhiyun	$IP route add table $RTABLE default via $GW_IP4 dev $DEV onlink
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun	match="oif $DEV"
188*4882a593Smuzhiyun	fib_rule4_test_match_n_redirect "$match" "$match" "oif redirect to table"
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun	# need enable forwarding and disable rp_filter temporarily as all the
191*4882a593Smuzhiyun	# addresses are in the same subnet and egress device == ingress device.
192*4882a593Smuzhiyun	ip netns exec testns sysctl -w net.ipv4.ip_forward=1
193*4882a593Smuzhiyun	ip netns exec testns sysctl -w net.ipv4.conf.$DEV.rp_filter=0
194*4882a593Smuzhiyun	match="from $SRC_IP iif $DEV"
195*4882a593Smuzhiyun	fib_rule4_test_match_n_redirect "$match" "$match" "iif redirect to table"
196*4882a593Smuzhiyun	ip netns exec testns sysctl -w net.ipv4.ip_forward=0
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun	match="tos 0x10"
199*4882a593Smuzhiyun	fib_rule4_test_match_n_redirect "$match" "$match" "tos redirect to table"
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun	match="fwmark 0x64"
202*4882a593Smuzhiyun	getmatch="mark 0x64"
203*4882a593Smuzhiyun	fib_rule4_test_match_n_redirect "$match" "$getmatch" "fwmark redirect to table"
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun	fib_check_iproute_support "uidrange" "uid"
206*4882a593Smuzhiyun	if [ $? -eq 0 ]; then
207*4882a593Smuzhiyun		match="uidrange 100-100"
208*4882a593Smuzhiyun		getmatch="uid 100"
209*4882a593Smuzhiyun		fib_rule4_test_match_n_redirect "$match" "$getmatch" "uid redirect to table"
210*4882a593Smuzhiyun	fi
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun	fib_check_iproute_support "sport" "sport"
213*4882a593Smuzhiyun	if [ $? -eq 0 ]; then
214*4882a593Smuzhiyun		match="sport 666 dport 777"
215*4882a593Smuzhiyun		fib_rule4_test_match_n_redirect "$match" "$match" "sport and dport redirect to table"
216*4882a593Smuzhiyun	fi
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun	fib_check_iproute_support "ipproto" "ipproto"
219*4882a593Smuzhiyun	if [ $? -eq 0 ]; then
220*4882a593Smuzhiyun		match="ipproto tcp"
221*4882a593Smuzhiyun		fib_rule4_test_match_n_redirect "$match" "$match" "ipproto tcp match"
222*4882a593Smuzhiyun	fi
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun	fib_check_iproute_support "ipproto" "ipproto"
225*4882a593Smuzhiyun	if [ $? -eq 0 ]; then
226*4882a593Smuzhiyun		match="ipproto icmp"
227*4882a593Smuzhiyun		fib_rule4_test_match_n_redirect "$match" "$match" "ipproto icmp match"
228*4882a593Smuzhiyun	fi
229*4882a593Smuzhiyun}
230*4882a593Smuzhiyun
231*4882a593Smuzhiyunrun_fibrule_tests()
232*4882a593Smuzhiyun{
233*4882a593Smuzhiyun	log_section "IPv4 fib rule"
234*4882a593Smuzhiyun	fib_rule4_test
235*4882a593Smuzhiyun	log_section "IPv6 fib rule"
236*4882a593Smuzhiyun	fib_rule6_test
237*4882a593Smuzhiyun}
238*4882a593Smuzhiyun
239*4882a593Smuzhiyunif [ "$(id -u)" -ne 0 ];then
240*4882a593Smuzhiyun	echo "SKIP: Need root privileges"
241*4882a593Smuzhiyun	exit 0
242*4882a593Smuzhiyunfi
243*4882a593Smuzhiyun
244*4882a593Smuzhiyunif [ ! -x "$(command -v ip)" ]; then
245*4882a593Smuzhiyun	echo "SKIP: Could not run test without ip tool"
246*4882a593Smuzhiyun	exit 0
247*4882a593Smuzhiyunfi
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun# start clean
250*4882a593Smuzhiyuncleanup &> /dev/null
251*4882a593Smuzhiyunsetup
252*4882a593Smuzhiyunrun_fibrule_tests
253*4882a593Smuzhiyuncleanup
254*4882a593Smuzhiyun
255*4882a593Smuzhiyunif [ "$TESTS" != "none" ]; then
256*4882a593Smuzhiyun	printf "\nTests passed: %3d\n" ${nsuccess}
257*4882a593Smuzhiyun	printf "Tests failed: %3d\n"   ${nfail}
258*4882a593Smuzhiyunfi
259*4882a593Smuzhiyun
260*4882a593Smuzhiyunexit $ret
261