xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/net/rtnetlink.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# This test is for checking rtnetlink callpaths, and get as much coverage as possible.
4*4882a593Smuzhiyun#
5*4882a593Smuzhiyun# set -e
6*4882a593Smuzhiyun
7*4882a593Smuzhiyundevdummy="test-dummy0"
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4.
10*4882a593Smuzhiyunksft_skip=4
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun# set global exit status, but never reset nonzero one.
13*4882a593Smuzhiyuncheck_err()
14*4882a593Smuzhiyun{
15*4882a593Smuzhiyun	if [ $ret -eq 0 ]; then
16*4882a593Smuzhiyun		ret=$1
17*4882a593Smuzhiyun	fi
18*4882a593Smuzhiyun}
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun# same but inverted -- used when command must fail for test to pass
21*4882a593Smuzhiyuncheck_fail()
22*4882a593Smuzhiyun{
23*4882a593Smuzhiyun	if [ $1 -eq 0 ]; then
24*4882a593Smuzhiyun		ret=1
25*4882a593Smuzhiyun	fi
26*4882a593Smuzhiyun}
27*4882a593Smuzhiyun
28*4882a593Smuzhiyunkci_add_dummy()
29*4882a593Smuzhiyun{
30*4882a593Smuzhiyun	ip link add name "$devdummy" type dummy
31*4882a593Smuzhiyun	check_err $?
32*4882a593Smuzhiyun	ip link set "$devdummy" up
33*4882a593Smuzhiyun	check_err $?
34*4882a593Smuzhiyun}
35*4882a593Smuzhiyun
36*4882a593Smuzhiyunkci_del_dummy()
37*4882a593Smuzhiyun{
38*4882a593Smuzhiyun	ip link del dev "$devdummy"
39*4882a593Smuzhiyun	check_err $?
40*4882a593Smuzhiyun}
41*4882a593Smuzhiyun
42*4882a593Smuzhiyunkci_test_netconf()
43*4882a593Smuzhiyun{
44*4882a593Smuzhiyun	dev="$1"
45*4882a593Smuzhiyun	r=$ret
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun	ip netconf show dev "$dev" > /dev/null
48*4882a593Smuzhiyun	check_err $?
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun	for f in 4 6; do
51*4882a593Smuzhiyun		ip -$f netconf show dev "$dev" > /dev/null
52*4882a593Smuzhiyun		check_err $?
53*4882a593Smuzhiyun	done
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun	if [ $ret -ne 0 ] ;then
56*4882a593Smuzhiyun		echo "FAIL: ip netconf show $dev"
57*4882a593Smuzhiyun		test $r -eq 0 && ret=0
58*4882a593Smuzhiyun		return 1
59*4882a593Smuzhiyun	fi
60*4882a593Smuzhiyun}
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun# add a bridge with vlans on top
63*4882a593Smuzhiyunkci_test_bridge()
64*4882a593Smuzhiyun{
65*4882a593Smuzhiyun	devbr="test-br0"
66*4882a593Smuzhiyun	vlandev="testbr-vlan1"
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun	local ret=0
69*4882a593Smuzhiyun	ip link add name "$devbr" type bridge
70*4882a593Smuzhiyun	check_err $?
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun	ip link set dev "$devdummy" master "$devbr"
73*4882a593Smuzhiyun	check_err $?
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun	ip link set "$devbr" up
76*4882a593Smuzhiyun	check_err $?
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun	ip link add link "$devbr" name "$vlandev" type vlan id 1
79*4882a593Smuzhiyun	check_err $?
80*4882a593Smuzhiyun	ip addr add dev "$vlandev" 10.200.7.23/30
81*4882a593Smuzhiyun	check_err $?
82*4882a593Smuzhiyun	ip -6 addr add dev "$vlandev" dead:42::1234/64
83*4882a593Smuzhiyun	check_err $?
84*4882a593Smuzhiyun	ip -d link > /dev/null
85*4882a593Smuzhiyun	check_err $?
86*4882a593Smuzhiyun	ip r s t all > /dev/null
87*4882a593Smuzhiyun	check_err $?
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun	for name in "$devbr" "$vlandev" "$devdummy" ; do
90*4882a593Smuzhiyun		kci_test_netconf "$name"
91*4882a593Smuzhiyun	done
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun	ip -6 addr del dev "$vlandev" dead:42::1234/64
94*4882a593Smuzhiyun	check_err $?
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun	ip link del dev "$vlandev"
97*4882a593Smuzhiyun	check_err $?
98*4882a593Smuzhiyun	ip link del dev "$devbr"
99*4882a593Smuzhiyun	check_err $?
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
102*4882a593Smuzhiyun		echo "FAIL: bridge setup"
103*4882a593Smuzhiyun		return 1
104*4882a593Smuzhiyun	fi
105*4882a593Smuzhiyun	echo "PASS: bridge setup"
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun}
108*4882a593Smuzhiyun
109*4882a593Smuzhiyunkci_test_gre()
110*4882a593Smuzhiyun{
111*4882a593Smuzhiyun	gredev=neta
112*4882a593Smuzhiyun	rem=10.42.42.1
113*4882a593Smuzhiyun	loc=10.0.0.1
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun	local ret=0
116*4882a593Smuzhiyun	ip tunnel add $gredev mode gre remote $rem local $loc ttl 1
117*4882a593Smuzhiyun	check_err $?
118*4882a593Smuzhiyun	ip link set $gredev up
119*4882a593Smuzhiyun	check_err $?
120*4882a593Smuzhiyun	ip addr add 10.23.7.10 dev $gredev
121*4882a593Smuzhiyun	check_err $?
122*4882a593Smuzhiyun	ip route add 10.23.8.0/30 dev $gredev
123*4882a593Smuzhiyun	check_err $?
124*4882a593Smuzhiyun	ip addr add dev "$devdummy" 10.23.7.11/24
125*4882a593Smuzhiyun	check_err $?
126*4882a593Smuzhiyun	ip link > /dev/null
127*4882a593Smuzhiyun	check_err $?
128*4882a593Smuzhiyun	ip addr > /dev/null
129*4882a593Smuzhiyun	check_err $?
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun	kci_test_netconf "$gredev"
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun	ip addr del dev "$devdummy" 10.23.7.11/24
134*4882a593Smuzhiyun	check_err $?
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun	ip link del $gredev
137*4882a593Smuzhiyun	check_err $?
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
140*4882a593Smuzhiyun		echo "FAIL: gre tunnel endpoint"
141*4882a593Smuzhiyun		return 1
142*4882a593Smuzhiyun	fi
143*4882a593Smuzhiyun	echo "PASS: gre tunnel endpoint"
144*4882a593Smuzhiyun}
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun# tc uses rtnetlink too, for full tc testing
147*4882a593Smuzhiyun# please see tools/testing/selftests/tc-testing.
148*4882a593Smuzhiyunkci_test_tc()
149*4882a593Smuzhiyun{
150*4882a593Smuzhiyun	dev=lo
151*4882a593Smuzhiyun	local ret=0
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun	tc qdisc add dev "$dev" root handle 1: htb
154*4882a593Smuzhiyun	check_err $?
155*4882a593Smuzhiyun	tc class add dev "$dev" parent 1: classid 1:10 htb rate 1mbit
156*4882a593Smuzhiyun	check_err $?
157*4882a593Smuzhiyun	tc filter add dev "$dev" parent 1:0 prio 5 handle ffe: protocol ip u32 divisor 256
158*4882a593Smuzhiyun	check_err $?
159*4882a593Smuzhiyun	tc filter add dev "$dev" parent 1:0 prio 5 handle ffd: protocol ip u32 divisor 256
160*4882a593Smuzhiyun	check_err $?
161*4882a593Smuzhiyun	tc filter add dev "$dev" parent 1:0 prio 5 handle ffc: protocol ip u32 divisor 256
162*4882a593Smuzhiyun	check_err $?
163*4882a593Smuzhiyun	tc filter add dev "$dev" protocol ip parent 1: prio 5 handle ffe:2:3 u32 ht ffe:2: match ip src 10.0.0.3 flowid 1:10
164*4882a593Smuzhiyun	check_err $?
165*4882a593Smuzhiyun	tc filter add dev "$dev" protocol ip parent 1: prio 5 handle ffe:2:2 u32 ht ffe:2: match ip src 10.0.0.2 flowid 1:10
166*4882a593Smuzhiyun	check_err $?
167*4882a593Smuzhiyun	tc filter show dev "$dev" parent  1:0 > /dev/null
168*4882a593Smuzhiyun	check_err $?
169*4882a593Smuzhiyun	tc filter del dev "$dev" protocol ip parent 1: prio 5 handle ffe:2:3 u32
170*4882a593Smuzhiyun	check_err $?
171*4882a593Smuzhiyun	tc filter show dev "$dev" parent  1:0 > /dev/null
172*4882a593Smuzhiyun	check_err $?
173*4882a593Smuzhiyun	tc qdisc del dev "$dev" root handle 1: htb
174*4882a593Smuzhiyun	check_err $?
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
177*4882a593Smuzhiyun		echo "FAIL: tc htb hierarchy"
178*4882a593Smuzhiyun		return 1
179*4882a593Smuzhiyun	fi
180*4882a593Smuzhiyun	echo "PASS: tc htb hierarchy"
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun}
183*4882a593Smuzhiyun
184*4882a593Smuzhiyunkci_test_polrouting()
185*4882a593Smuzhiyun{
186*4882a593Smuzhiyun	local ret=0
187*4882a593Smuzhiyun	ip rule add fwmark 1 lookup 100
188*4882a593Smuzhiyun	check_err $?
189*4882a593Smuzhiyun	ip route add local 0.0.0.0/0 dev lo table 100
190*4882a593Smuzhiyun	check_err $?
191*4882a593Smuzhiyun	ip r s t all > /dev/null
192*4882a593Smuzhiyun	check_err $?
193*4882a593Smuzhiyun	ip rule del fwmark 1 lookup 100
194*4882a593Smuzhiyun	check_err $?
195*4882a593Smuzhiyun	ip route del local 0.0.0.0/0 dev lo table 100
196*4882a593Smuzhiyun	check_err $?
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
199*4882a593Smuzhiyun		echo "FAIL: policy route test"
200*4882a593Smuzhiyun		return 1
201*4882a593Smuzhiyun	fi
202*4882a593Smuzhiyun	echo "PASS: policy routing"
203*4882a593Smuzhiyun}
204*4882a593Smuzhiyun
205*4882a593Smuzhiyunkci_test_route_get()
206*4882a593Smuzhiyun{
207*4882a593Smuzhiyun	local hash_policy=$(sysctl -n net.ipv4.fib_multipath_hash_policy)
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun	local ret=0
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun	ip route get 127.0.0.1 > /dev/null
212*4882a593Smuzhiyun	check_err $?
213*4882a593Smuzhiyun	ip route get 127.0.0.1 dev "$devdummy" > /dev/null
214*4882a593Smuzhiyun	check_err $?
215*4882a593Smuzhiyun	ip route get ::1 > /dev/null
216*4882a593Smuzhiyun	check_err $?
217*4882a593Smuzhiyun	ip route get fe80::1 dev "$devdummy" > /dev/null
218*4882a593Smuzhiyun	check_err $?
219*4882a593Smuzhiyun	ip route get 127.0.0.1 from 127.0.0.1 oif lo tos 0x1 mark 0x1 > /dev/null
220*4882a593Smuzhiyun	check_err $?
221*4882a593Smuzhiyun	ip route get ::1 from ::1 iif lo oif lo tos 0x1 mark 0x1 > /dev/null
222*4882a593Smuzhiyun	check_err $?
223*4882a593Smuzhiyun	ip addr add dev "$devdummy" 10.23.7.11/24
224*4882a593Smuzhiyun	check_err $?
225*4882a593Smuzhiyun	ip route get 10.23.7.11 from 10.23.7.12 iif "$devdummy" > /dev/null
226*4882a593Smuzhiyun	check_err $?
227*4882a593Smuzhiyun	ip route add 10.23.8.0/24 \
228*4882a593Smuzhiyun		nexthop via 10.23.7.13 dev "$devdummy" \
229*4882a593Smuzhiyun		nexthop via 10.23.7.14 dev "$devdummy"
230*4882a593Smuzhiyun	check_err $?
231*4882a593Smuzhiyun	sysctl -wq net.ipv4.fib_multipath_hash_policy=0
232*4882a593Smuzhiyun	ip route get 10.23.8.11 > /dev/null
233*4882a593Smuzhiyun	check_err $?
234*4882a593Smuzhiyun	sysctl -wq net.ipv4.fib_multipath_hash_policy=1
235*4882a593Smuzhiyun	ip route get 10.23.8.11 > /dev/null
236*4882a593Smuzhiyun	check_err $?
237*4882a593Smuzhiyun	sysctl -wq net.ipv4.fib_multipath_hash_policy="$hash_policy"
238*4882a593Smuzhiyun	ip route del 10.23.8.0/24
239*4882a593Smuzhiyun	check_err $?
240*4882a593Smuzhiyun	ip addr del dev "$devdummy" 10.23.7.11/24
241*4882a593Smuzhiyun	check_err $?
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
244*4882a593Smuzhiyun		echo "FAIL: route get"
245*4882a593Smuzhiyun		return 1
246*4882a593Smuzhiyun	fi
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun	echo "PASS: route get"
249*4882a593Smuzhiyun}
250*4882a593Smuzhiyun
251*4882a593Smuzhiyunkci_test_addrlft()
252*4882a593Smuzhiyun{
253*4882a593Smuzhiyun	for i in $(seq 10 100) ;do
254*4882a593Smuzhiyun		lft=$(((RANDOM%3) + 1))
255*4882a593Smuzhiyun		ip addr add 10.23.11.$i/32 dev "$devdummy" preferred_lft $lft valid_lft $((lft+1))
256*4882a593Smuzhiyun		check_err $?
257*4882a593Smuzhiyun	done
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun	sleep 5
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun	ip addr show dev "$devdummy" | grep "10.23.11."
262*4882a593Smuzhiyun	if [ $? -eq 0 ]; then
263*4882a593Smuzhiyun		echo "FAIL: preferred_lft addresses remaining"
264*4882a593Smuzhiyun		check_err 1
265*4882a593Smuzhiyun		return
266*4882a593Smuzhiyun	fi
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun	echo "PASS: preferred_lft addresses have expired"
269*4882a593Smuzhiyun}
270*4882a593Smuzhiyun
271*4882a593Smuzhiyunkci_test_promote_secondaries()
272*4882a593Smuzhiyun{
273*4882a593Smuzhiyun	promote=$(sysctl -n net.ipv4.conf.$devdummy.promote_secondaries)
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun	sysctl -q net.ipv4.conf.$devdummy.promote_secondaries=1
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun	for i in $(seq 2 254);do
278*4882a593Smuzhiyun		IP="10.23.11.$i"
279*4882a593Smuzhiyun		ip -f inet addr add $IP/16 brd + dev "$devdummy"
280*4882a593Smuzhiyun		ifconfig "$devdummy" $IP netmask 255.255.0.0
281*4882a593Smuzhiyun	done
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun	ip addr flush dev "$devdummy"
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun	[ $promote -eq 0 ] && sysctl -q net.ipv4.conf.$devdummy.promote_secondaries=0
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun	echo "PASS: promote_secondaries complete"
288*4882a593Smuzhiyun}
289*4882a593Smuzhiyun
290*4882a593Smuzhiyunkci_test_addrlabel()
291*4882a593Smuzhiyun{
292*4882a593Smuzhiyun	local ret=0
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun	ip addrlabel add prefix dead::/64 dev lo label 1
295*4882a593Smuzhiyun	check_err $?
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun	ip addrlabel list |grep -q "prefix dead::/64 dev lo label 1"
298*4882a593Smuzhiyun	check_err $?
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun	ip addrlabel del prefix dead::/64 dev lo label 1 2> /dev/null
301*4882a593Smuzhiyun	check_err $?
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun	ip addrlabel add prefix dead::/64 label 1 2> /dev/null
304*4882a593Smuzhiyun	check_err $?
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun	ip addrlabel del prefix dead::/64 label 1 2> /dev/null
307*4882a593Smuzhiyun	check_err $?
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun	# concurrent add/delete
310*4882a593Smuzhiyun	for i in $(seq 1 1000); do
311*4882a593Smuzhiyun		ip addrlabel add prefix 1c3::/64 label 12345 2>/dev/null
312*4882a593Smuzhiyun	done &
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun	for i in $(seq 1 1000); do
315*4882a593Smuzhiyun		ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null
316*4882a593Smuzhiyun	done
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun	wait
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun	ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
323*4882a593Smuzhiyun		echo "FAIL: ipv6 addrlabel"
324*4882a593Smuzhiyun		return 1
325*4882a593Smuzhiyun	fi
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun	echo "PASS: ipv6 addrlabel"
328*4882a593Smuzhiyun}
329*4882a593Smuzhiyun
330*4882a593Smuzhiyunkci_test_ifalias()
331*4882a593Smuzhiyun{
332*4882a593Smuzhiyun	local ret=0
333*4882a593Smuzhiyun	namewant=$(uuidgen)
334*4882a593Smuzhiyun	syspathname="/sys/class/net/$devdummy/ifalias"
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun	ip link set dev "$devdummy" alias "$namewant"
337*4882a593Smuzhiyun	check_err $?
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
340*4882a593Smuzhiyun		echo "FAIL: cannot set interface alias of $devdummy to $namewant"
341*4882a593Smuzhiyun		return 1
342*4882a593Smuzhiyun	fi
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun	ip link show "$devdummy" | grep -q "alias $namewant"
345*4882a593Smuzhiyun	check_err $?
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun	if [ -r "$syspathname" ] ; then
348*4882a593Smuzhiyun		read namehave < "$syspathname"
349*4882a593Smuzhiyun		if [ "$namewant" != "$namehave" ]; then
350*4882a593Smuzhiyun			echo "FAIL: did set ifalias $namewant but got $namehave"
351*4882a593Smuzhiyun			return 1
352*4882a593Smuzhiyun		fi
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun		namewant=$(uuidgen)
355*4882a593Smuzhiyun		echo "$namewant" > "$syspathname"
356*4882a593Smuzhiyun	        ip link show "$devdummy" | grep -q "alias $namewant"
357*4882a593Smuzhiyun		check_err $?
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun		# sysfs interface allows to delete alias again
360*4882a593Smuzhiyun		echo "" > "$syspathname"
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun	        ip link show "$devdummy" | grep -q "alias $namewant"
363*4882a593Smuzhiyun		check_fail $?
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun		for i in $(seq 1 100); do
366*4882a593Smuzhiyun			uuidgen > "$syspathname" &
367*4882a593Smuzhiyun		done
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun		wait
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun		# re-add the alias -- kernel should free mem when dummy dev is removed
372*4882a593Smuzhiyun		ip link set dev "$devdummy" alias "$namewant"
373*4882a593Smuzhiyun		check_err $?
374*4882a593Smuzhiyun	fi
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
377*4882a593Smuzhiyun		echo "FAIL: set interface alias $devdummy to $namewant"
378*4882a593Smuzhiyun		return 1
379*4882a593Smuzhiyun	fi
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun	echo "PASS: set ifalias $namewant for $devdummy"
382*4882a593Smuzhiyun}
383*4882a593Smuzhiyun
384*4882a593Smuzhiyunkci_test_vrf()
385*4882a593Smuzhiyun{
386*4882a593Smuzhiyun	vrfname="test-vrf"
387*4882a593Smuzhiyun	local ret=0
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun	ip link show type vrf 2>/dev/null
390*4882a593Smuzhiyun	if [ $? -ne 0 ]; then
391*4882a593Smuzhiyun		echo "SKIP: vrf: iproute2 too old"
392*4882a593Smuzhiyun		return $ksft_skip
393*4882a593Smuzhiyun	fi
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun	ip link add "$vrfname" type vrf table 10
396*4882a593Smuzhiyun	check_err $?
397*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
398*4882a593Smuzhiyun		echo "FAIL: can't add vrf interface, skipping test"
399*4882a593Smuzhiyun		return 0
400*4882a593Smuzhiyun	fi
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun	ip -br link show type vrf | grep -q "$vrfname"
403*4882a593Smuzhiyun	check_err $?
404*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
405*4882a593Smuzhiyun		echo "FAIL: created vrf device not found"
406*4882a593Smuzhiyun		return 1
407*4882a593Smuzhiyun	fi
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun	ip link set dev "$vrfname" up
410*4882a593Smuzhiyun	check_err $?
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun	ip link set dev "$devdummy" master "$vrfname"
413*4882a593Smuzhiyun	check_err $?
414*4882a593Smuzhiyun	ip link del dev "$vrfname"
415*4882a593Smuzhiyun	check_err $?
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
418*4882a593Smuzhiyun		echo "FAIL: vrf"
419*4882a593Smuzhiyun		return 1
420*4882a593Smuzhiyun	fi
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun	echo "PASS: vrf"
423*4882a593Smuzhiyun}
424*4882a593Smuzhiyun
425*4882a593Smuzhiyunkci_test_encap_vxlan()
426*4882a593Smuzhiyun{
427*4882a593Smuzhiyun	local ret=0
428*4882a593Smuzhiyun	vxlan="test-vxlan0"
429*4882a593Smuzhiyun	vlan="test-vlan0"
430*4882a593Smuzhiyun	testns="$1"
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun	ip -netns "$testns" link add "$vxlan" type vxlan id 42 group 239.1.1.1 \
433*4882a593Smuzhiyun		dev "$devdummy" dstport 4789 2>/dev/null
434*4882a593Smuzhiyun	if [ $? -ne 0 ]; then
435*4882a593Smuzhiyun		echo "FAIL: can't add vxlan interface, skipping test"
436*4882a593Smuzhiyun		return 0
437*4882a593Smuzhiyun	fi
438*4882a593Smuzhiyun	check_err $?
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun	ip -netns "$testns" addr add 10.2.11.49/24 dev "$vxlan"
441*4882a593Smuzhiyun	check_err $?
442*4882a593Smuzhiyun
443*4882a593Smuzhiyun	ip -netns "$testns" link set up dev "$vxlan"
444*4882a593Smuzhiyun	check_err $?
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun	ip -netns "$testns" link add link "$vxlan" name "$vlan" type vlan id 1
447*4882a593Smuzhiyun	check_err $?
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun	# changelink testcases
450*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan vni 43 2>/dev/null
451*4882a593Smuzhiyun	check_fail $?
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan group ffe5::5 dev "$devdummy" 2>/dev/null
454*4882a593Smuzhiyun	check_fail $?
455*4882a593Smuzhiyun
456*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan ttl inherit 2>/dev/null
457*4882a593Smuzhiyun	check_fail $?
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan ttl 64
460*4882a593Smuzhiyun	check_err $?
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan nolearning
463*4882a593Smuzhiyun	check_err $?
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan proxy 2>/dev/null
466*4882a593Smuzhiyun	check_fail $?
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan norsc 2>/dev/null
469*4882a593Smuzhiyun	check_fail $?
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan l2miss 2>/dev/null
472*4882a593Smuzhiyun	check_fail $?
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan l3miss 2>/dev/null
475*4882a593Smuzhiyun	check_fail $?
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan external 2>/dev/null
478*4882a593Smuzhiyun	check_fail $?
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan udpcsum 2>/dev/null
481*4882a593Smuzhiyun	check_fail $?
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan udp6zerocsumtx 2>/dev/null
484*4882a593Smuzhiyun	check_fail $?
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan udp6zerocsumrx 2>/dev/null
487*4882a593Smuzhiyun	check_fail $?
488*4882a593Smuzhiyun
489*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan remcsumtx 2>/dev/null
490*4882a593Smuzhiyun	check_fail $?
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan remcsumrx 2>/dev/null
493*4882a593Smuzhiyun	check_fail $?
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan gbp 2>/dev/null
496*4882a593Smuzhiyun	check_fail $?
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun	ip -netns "$testns" link set dev "$vxlan" type vxlan gpe 2>/dev/null
499*4882a593Smuzhiyun	check_fail $?
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun	ip -netns "$testns" link del "$vxlan"
502*4882a593Smuzhiyun	check_err $?
503*4882a593Smuzhiyun
504*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
505*4882a593Smuzhiyun		echo "FAIL: vxlan"
506*4882a593Smuzhiyun		return 1
507*4882a593Smuzhiyun	fi
508*4882a593Smuzhiyun	echo "PASS: vxlan"
509*4882a593Smuzhiyun}
510*4882a593Smuzhiyun
511*4882a593Smuzhiyunkci_test_encap_fou()
512*4882a593Smuzhiyun{
513*4882a593Smuzhiyun	local ret=0
514*4882a593Smuzhiyun	name="test-fou"
515*4882a593Smuzhiyun	testns="$1"
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun	ip fou help 2>&1 |grep -q 'Usage: ip fou'
518*4882a593Smuzhiyun	if [ $? -ne 0 ];then
519*4882a593Smuzhiyun		echo "SKIP: fou: iproute2 too old"
520*4882a593Smuzhiyun		return $ksft_skip
521*4882a593Smuzhiyun	fi
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun	if ! /sbin/modprobe -q -n fou; then
524*4882a593Smuzhiyun		echo "SKIP: module fou is not found"
525*4882a593Smuzhiyun		return $ksft_skip
526*4882a593Smuzhiyun	fi
527*4882a593Smuzhiyun	/sbin/modprobe -q fou
528*4882a593Smuzhiyun	ip -netns "$testns" fou add port 7777 ipproto 47 2>/dev/null
529*4882a593Smuzhiyun	if [ $? -ne 0 ];then
530*4882a593Smuzhiyun		echo "FAIL: can't add fou port 7777, skipping test"
531*4882a593Smuzhiyun		return 1
532*4882a593Smuzhiyun	fi
533*4882a593Smuzhiyun
534*4882a593Smuzhiyun	ip -netns "$testns" fou add port 8888 ipproto 4
535*4882a593Smuzhiyun	check_err $?
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun	ip -netns "$testns" fou del port 9999 2>/dev/null
538*4882a593Smuzhiyun	check_fail $?
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun	ip -netns "$testns" fou del port 7777
541*4882a593Smuzhiyun	check_err $?
542*4882a593Smuzhiyun
543*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
544*4882a593Smuzhiyun		echo "FAIL: fou"
545*4882a593Smuzhiyun		return 1
546*4882a593Smuzhiyun	fi
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun	echo "PASS: fou"
549*4882a593Smuzhiyun}
550*4882a593Smuzhiyun
551*4882a593Smuzhiyun# test various encap methods, use netns to avoid unwanted interference
552*4882a593Smuzhiyunkci_test_encap()
553*4882a593Smuzhiyun{
554*4882a593Smuzhiyun	testns="testns"
555*4882a593Smuzhiyun	local ret=0
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun	ip netns add "$testns"
558*4882a593Smuzhiyun	if [ $? -ne 0 ]; then
559*4882a593Smuzhiyun		echo "SKIP encap tests: cannot add net namespace $testns"
560*4882a593Smuzhiyun		return $ksft_skip
561*4882a593Smuzhiyun	fi
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun	ip -netns "$testns" link set lo up
564*4882a593Smuzhiyun	check_err $?
565*4882a593Smuzhiyun
566*4882a593Smuzhiyun	ip -netns "$testns" link add name "$devdummy" type dummy
567*4882a593Smuzhiyun	check_err $?
568*4882a593Smuzhiyun	ip -netns "$testns" link set "$devdummy" up
569*4882a593Smuzhiyun	check_err $?
570*4882a593Smuzhiyun
571*4882a593Smuzhiyun	kci_test_encap_vxlan "$testns"
572*4882a593Smuzhiyun	check_err $?
573*4882a593Smuzhiyun	kci_test_encap_fou "$testns"
574*4882a593Smuzhiyun	check_err $?
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun	ip netns del "$testns"
577*4882a593Smuzhiyun	return $ret
578*4882a593Smuzhiyun}
579*4882a593Smuzhiyun
580*4882a593Smuzhiyunkci_test_macsec()
581*4882a593Smuzhiyun{
582*4882a593Smuzhiyun	msname="test_macsec0"
583*4882a593Smuzhiyun	local ret=0
584*4882a593Smuzhiyun
585*4882a593Smuzhiyun	ip macsec help 2>&1 | grep -q "^Usage: ip macsec"
586*4882a593Smuzhiyun	if [ $? -ne 0 ]; then
587*4882a593Smuzhiyun		echo "SKIP: macsec: iproute2 too old"
588*4882a593Smuzhiyun		return $ksft_skip
589*4882a593Smuzhiyun	fi
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun	ip link add link "$devdummy" "$msname" type macsec port 42 encrypt on
592*4882a593Smuzhiyun	check_err $?
593*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
594*4882a593Smuzhiyun		echo "FAIL: can't add macsec interface, skipping test"
595*4882a593Smuzhiyun		return 1
596*4882a593Smuzhiyun	fi
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun	ip macsec add "$msname" tx sa 0 pn 1024 on key 01 12345678901234567890123456789012
599*4882a593Smuzhiyun	check_err $?
600*4882a593Smuzhiyun
601*4882a593Smuzhiyun	ip macsec add "$msname" rx port 1234 address "1c:ed:de:ad:be:ef"
602*4882a593Smuzhiyun	check_err $?
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun	ip macsec add "$msname" rx port 1234 address "1c:ed:de:ad:be:ef" sa 0 pn 1 on key 00 0123456789abcdef0123456789abcdef
605*4882a593Smuzhiyun	check_err $?
606*4882a593Smuzhiyun
607*4882a593Smuzhiyun	ip macsec show > /dev/null
608*4882a593Smuzhiyun	check_err $?
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun	ip link del dev "$msname"
611*4882a593Smuzhiyun	check_err $?
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
614*4882a593Smuzhiyun		echo "FAIL: macsec"
615*4882a593Smuzhiyun		return 1
616*4882a593Smuzhiyun	fi
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun	echo "PASS: macsec"
619*4882a593Smuzhiyun}
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun#-------------------------------------------------------------------
622*4882a593Smuzhiyun# Example commands
623*4882a593Smuzhiyun#   ip x s add proto esp src 14.0.0.52 dst 14.0.0.70 \
624*4882a593Smuzhiyun#            spi 0x07 mode transport reqid 0x07 replay-window 32 \
625*4882a593Smuzhiyun#            aead 'rfc4106(gcm(aes))' 1234567890123456dcba 128 \
626*4882a593Smuzhiyun#            sel src 14.0.0.52/24 dst 14.0.0.70/24
627*4882a593Smuzhiyun#   ip x p add dir out src 14.0.0.52/24 dst 14.0.0.70/24 \
628*4882a593Smuzhiyun#            tmpl proto esp src 14.0.0.52 dst 14.0.0.70 \
629*4882a593Smuzhiyun#            spi 0x07 mode transport reqid 0x07
630*4882a593Smuzhiyun#
631*4882a593Smuzhiyun# Subcommands not tested
632*4882a593Smuzhiyun#    ip x s update
633*4882a593Smuzhiyun#    ip x s allocspi
634*4882a593Smuzhiyun#    ip x s deleteall
635*4882a593Smuzhiyun#    ip x p update
636*4882a593Smuzhiyun#    ip x p deleteall
637*4882a593Smuzhiyun#    ip x p set
638*4882a593Smuzhiyun#-------------------------------------------------------------------
639*4882a593Smuzhiyunkci_test_ipsec()
640*4882a593Smuzhiyun{
641*4882a593Smuzhiyun	local ret=0
642*4882a593Smuzhiyun	algo="aead rfc4106(gcm(aes)) 0x3132333435363738393031323334353664636261 128"
643*4882a593Smuzhiyun	srcip=192.168.123.1
644*4882a593Smuzhiyun	dstip=192.168.123.2
645*4882a593Smuzhiyun	spi=7
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun	ip addr add $srcip dev $devdummy
648*4882a593Smuzhiyun
649*4882a593Smuzhiyun	# flush to be sure there's nothing configured
650*4882a593Smuzhiyun	ip x s flush ; ip x p flush
651*4882a593Smuzhiyun	check_err $?
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun	# start the monitor in the background
654*4882a593Smuzhiyun	tmpfile=`mktemp /var/run/ipsectestXXX`
655*4882a593Smuzhiyun	mpid=`(ip x m > $tmpfile & echo $!) 2>/dev/null`
656*4882a593Smuzhiyun	sleep 0.2
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun	ipsecid="proto esp src $srcip dst $dstip spi 0x07"
659*4882a593Smuzhiyun	ip x s add $ipsecid \
660*4882a593Smuzhiyun            mode transport reqid 0x07 replay-window 32 \
661*4882a593Smuzhiyun            $algo sel src $srcip/24 dst $dstip/24
662*4882a593Smuzhiyun	check_err $?
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun	lines=`ip x s list | grep $srcip | grep $dstip | wc -l`
665*4882a593Smuzhiyun	test $lines -eq 2
666*4882a593Smuzhiyun	check_err $?
667*4882a593Smuzhiyun
668*4882a593Smuzhiyun	ip x s count | grep -q "SAD count 1"
669*4882a593Smuzhiyun	check_err $?
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun	lines=`ip x s get $ipsecid | grep $srcip | grep $dstip | wc -l`
672*4882a593Smuzhiyun	test $lines -eq 2
673*4882a593Smuzhiyun	check_err $?
674*4882a593Smuzhiyun
675*4882a593Smuzhiyun	ip x s delete $ipsecid
676*4882a593Smuzhiyun	check_err $?
677*4882a593Smuzhiyun
678*4882a593Smuzhiyun	lines=`ip x s list | wc -l`
679*4882a593Smuzhiyun	test $lines -eq 0
680*4882a593Smuzhiyun	check_err $?
681*4882a593Smuzhiyun
682*4882a593Smuzhiyun	ipsecsel="dir out src $srcip/24 dst $dstip/24"
683*4882a593Smuzhiyun	ip x p add $ipsecsel \
684*4882a593Smuzhiyun		    tmpl proto esp src $srcip dst $dstip \
685*4882a593Smuzhiyun		    spi 0x07 mode transport reqid 0x07
686*4882a593Smuzhiyun	check_err $?
687*4882a593Smuzhiyun
688*4882a593Smuzhiyun	lines=`ip x p list | grep $srcip | grep $dstip | wc -l`
689*4882a593Smuzhiyun	test $lines -eq 2
690*4882a593Smuzhiyun	check_err $?
691*4882a593Smuzhiyun
692*4882a593Smuzhiyun	ip x p count | grep -q "SPD IN  0 OUT 1 FWD 0"
693*4882a593Smuzhiyun	check_err $?
694*4882a593Smuzhiyun
695*4882a593Smuzhiyun	lines=`ip x p get $ipsecsel | grep $srcip | grep $dstip | wc -l`
696*4882a593Smuzhiyun	test $lines -eq 2
697*4882a593Smuzhiyun	check_err $?
698*4882a593Smuzhiyun
699*4882a593Smuzhiyun	ip x p delete $ipsecsel
700*4882a593Smuzhiyun	check_err $?
701*4882a593Smuzhiyun
702*4882a593Smuzhiyun	lines=`ip x p list | wc -l`
703*4882a593Smuzhiyun	test $lines -eq 0
704*4882a593Smuzhiyun	check_err $?
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun	# check the monitor results
707*4882a593Smuzhiyun	kill $mpid
708*4882a593Smuzhiyun	lines=`wc -l $tmpfile | cut "-d " -f1`
709*4882a593Smuzhiyun	test $lines -eq 20
710*4882a593Smuzhiyun	check_err $?
711*4882a593Smuzhiyun	rm -rf $tmpfile
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun	# clean up any leftovers
714*4882a593Smuzhiyun	ip x s flush
715*4882a593Smuzhiyun	check_err $?
716*4882a593Smuzhiyun	ip x p flush
717*4882a593Smuzhiyun	check_err $?
718*4882a593Smuzhiyun	ip addr del $srcip/32 dev $devdummy
719*4882a593Smuzhiyun
720*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
721*4882a593Smuzhiyun		echo "FAIL: ipsec"
722*4882a593Smuzhiyun		return 1
723*4882a593Smuzhiyun	fi
724*4882a593Smuzhiyun	echo "PASS: ipsec"
725*4882a593Smuzhiyun}
726*4882a593Smuzhiyun
727*4882a593Smuzhiyun#-------------------------------------------------------------------
728*4882a593Smuzhiyun# Example commands
729*4882a593Smuzhiyun#   ip x s add proto esp src 14.0.0.52 dst 14.0.0.70 \
730*4882a593Smuzhiyun#            spi 0x07 mode transport reqid 0x07 replay-window 32 \
731*4882a593Smuzhiyun#            aead 'rfc4106(gcm(aes))' 1234567890123456dcba 128 \
732*4882a593Smuzhiyun#            sel src 14.0.0.52/24 dst 14.0.0.70/24
733*4882a593Smuzhiyun#            offload dev sim1 dir out
734*4882a593Smuzhiyun#   ip x p add dir out src 14.0.0.52/24 dst 14.0.0.70/24 \
735*4882a593Smuzhiyun#            tmpl proto esp src 14.0.0.52 dst 14.0.0.70 \
736*4882a593Smuzhiyun#            spi 0x07 mode transport reqid 0x07
737*4882a593Smuzhiyun#
738*4882a593Smuzhiyun#-------------------------------------------------------------------
739*4882a593Smuzhiyunkci_test_ipsec_offload()
740*4882a593Smuzhiyun{
741*4882a593Smuzhiyun	local ret=0
742*4882a593Smuzhiyun	algo="aead rfc4106(gcm(aes)) 0x3132333435363738393031323334353664636261 128"
743*4882a593Smuzhiyun	srcip=192.168.123.3
744*4882a593Smuzhiyun	dstip=192.168.123.4
745*4882a593Smuzhiyun	sysfsd=/sys/kernel/debug/netdevsim/netdevsim0/ports/0/
746*4882a593Smuzhiyun	sysfsf=$sysfsd/ipsec
747*4882a593Smuzhiyun	sysfsnet=/sys/bus/netdevsim/devices/netdevsim0/net/
748*4882a593Smuzhiyun	probed=false
749*4882a593Smuzhiyun
750*4882a593Smuzhiyun	# setup netdevsim since dummydev doesn't have offload support
751*4882a593Smuzhiyun	if [ ! -w /sys/bus/netdevsim/new_device ] ; then
752*4882a593Smuzhiyun		modprobe -q netdevsim
753*4882a593Smuzhiyun		check_err $?
754*4882a593Smuzhiyun		if [ $ret -ne 0 ]; then
755*4882a593Smuzhiyun			echo "SKIP: ipsec_offload can't load netdevsim"
756*4882a593Smuzhiyun			return $ksft_skip
757*4882a593Smuzhiyun		fi
758*4882a593Smuzhiyun		probed=true
759*4882a593Smuzhiyun	fi
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun	echo "0" > /sys/bus/netdevsim/new_device
762*4882a593Smuzhiyun	while [ ! -d $sysfsnet ] ; do :; done
763*4882a593Smuzhiyun	udevadm settle
764*4882a593Smuzhiyun	dev=`ls $sysfsnet`
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun	ip addr add $srcip dev $dev
767*4882a593Smuzhiyun	ip link set $dev up
768*4882a593Smuzhiyun	if [ ! -d $sysfsd ] ; then
769*4882a593Smuzhiyun		echo "FAIL: ipsec_offload can't create device $dev"
770*4882a593Smuzhiyun		return 1
771*4882a593Smuzhiyun	fi
772*4882a593Smuzhiyun	if [ ! -f $sysfsf ] ; then
773*4882a593Smuzhiyun		echo "FAIL: ipsec_offload netdevsim doesn't support IPsec offload"
774*4882a593Smuzhiyun		return 1
775*4882a593Smuzhiyun	fi
776*4882a593Smuzhiyun
777*4882a593Smuzhiyun	# flush to be sure there's nothing configured
778*4882a593Smuzhiyun	ip x s flush ; ip x p flush
779*4882a593Smuzhiyun
780*4882a593Smuzhiyun	# create offloaded SAs, both in and out
781*4882a593Smuzhiyun	ip x p add dir out src $srcip/24 dst $dstip/24 \
782*4882a593Smuzhiyun	    tmpl proto esp src $srcip dst $dstip spi 9 \
783*4882a593Smuzhiyun	    mode transport reqid 42
784*4882a593Smuzhiyun	check_err $?
785*4882a593Smuzhiyun	ip x p add dir in src $dstip/24 dst $srcip/24 \
786*4882a593Smuzhiyun	    tmpl proto esp src $dstip dst $srcip spi 9 \
787*4882a593Smuzhiyun	    mode transport reqid 42
788*4882a593Smuzhiyun	check_err $?
789*4882a593Smuzhiyun
790*4882a593Smuzhiyun	ip x s add proto esp src $srcip dst $dstip spi 9 \
791*4882a593Smuzhiyun	    mode transport reqid 42 $algo sel src $srcip/24 dst $dstip/24 \
792*4882a593Smuzhiyun	    offload dev $dev dir out
793*4882a593Smuzhiyun	check_err $?
794*4882a593Smuzhiyun	ip x s add proto esp src $dstip dst $srcip spi 9 \
795*4882a593Smuzhiyun	    mode transport reqid 42 $algo sel src $dstip/24 dst $srcip/24 \
796*4882a593Smuzhiyun	    offload dev $dev dir in
797*4882a593Smuzhiyun	check_err $?
798*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
799*4882a593Smuzhiyun		echo "FAIL: ipsec_offload can't create SA"
800*4882a593Smuzhiyun		return 1
801*4882a593Smuzhiyun	fi
802*4882a593Smuzhiyun
803*4882a593Smuzhiyun	# does offload show up in ip output
804*4882a593Smuzhiyun	lines=`ip x s list | grep -c "crypto offload parameters: dev $dev dir"`
805*4882a593Smuzhiyun	if [ $lines -ne 2 ] ; then
806*4882a593Smuzhiyun		echo "FAIL: ipsec_offload SA offload missing from list output"
807*4882a593Smuzhiyun		check_err 1
808*4882a593Smuzhiyun	fi
809*4882a593Smuzhiyun
810*4882a593Smuzhiyun	# use ping to exercise the Tx path
811*4882a593Smuzhiyun	ping -I $dev -c 3 -W 1 -i 0 $dstip >/dev/null
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun	# does driver have correct offload info
814*4882a593Smuzhiyun	diff $sysfsf - << EOF
815*4882a593SmuzhiyunSA count=2 tx=3
816*4882a593Smuzhiyunsa[0] tx ipaddr=0x00000000 00000000 00000000 00000000
817*4882a593Smuzhiyunsa[0]    spi=0x00000009 proto=0x32 salt=0x61626364 crypt=1
818*4882a593Smuzhiyunsa[0]    key=0x34333231 38373635 32313039 36353433
819*4882a593Smuzhiyunsa[1] rx ipaddr=0x00000000 00000000 00000000 037ba8c0
820*4882a593Smuzhiyunsa[1]    spi=0x00000009 proto=0x32 salt=0x61626364 crypt=1
821*4882a593Smuzhiyunsa[1]    key=0x34333231 38373635 32313039 36353433
822*4882a593SmuzhiyunEOF
823*4882a593Smuzhiyun	if [ $? -ne 0 ] ; then
824*4882a593Smuzhiyun		echo "FAIL: ipsec_offload incorrect driver data"
825*4882a593Smuzhiyun		check_err 1
826*4882a593Smuzhiyun	fi
827*4882a593Smuzhiyun
828*4882a593Smuzhiyun	# does offload get removed from driver
829*4882a593Smuzhiyun	ip x s flush
830*4882a593Smuzhiyun	ip x p flush
831*4882a593Smuzhiyun	lines=`grep -c "SA count=0" $sysfsf`
832*4882a593Smuzhiyun	if [ $lines -ne 1 ] ; then
833*4882a593Smuzhiyun		echo "FAIL: ipsec_offload SA not removed from driver"
834*4882a593Smuzhiyun		check_err 1
835*4882a593Smuzhiyun	fi
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun	# clean up any leftovers
838*4882a593Smuzhiyun	$probed && rmmod netdevsim
839*4882a593Smuzhiyun
840*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
841*4882a593Smuzhiyun		echo "FAIL: ipsec_offload"
842*4882a593Smuzhiyun		return 1
843*4882a593Smuzhiyun	fi
844*4882a593Smuzhiyun	echo "PASS: ipsec_offload"
845*4882a593Smuzhiyun}
846*4882a593Smuzhiyun
847*4882a593Smuzhiyunkci_test_gretap()
848*4882a593Smuzhiyun{
849*4882a593Smuzhiyun	testns="testns"
850*4882a593Smuzhiyun	DEV_NS=gretap00
851*4882a593Smuzhiyun	local ret=0
852*4882a593Smuzhiyun
853*4882a593Smuzhiyun	ip netns add "$testns"
854*4882a593Smuzhiyun	if [ $? -ne 0 ]; then
855*4882a593Smuzhiyun		echo "SKIP gretap tests: cannot add net namespace $testns"
856*4882a593Smuzhiyun		return $ksft_skip
857*4882a593Smuzhiyun	fi
858*4882a593Smuzhiyun
859*4882a593Smuzhiyun	ip link help gretap 2>&1 | grep -q "^Usage:"
860*4882a593Smuzhiyun	if [ $? -ne 0 ];then
861*4882a593Smuzhiyun		echo "SKIP: gretap: iproute2 too old"
862*4882a593Smuzhiyun		ip netns del "$testns"
863*4882a593Smuzhiyun		return $ksft_skip
864*4882a593Smuzhiyun	fi
865*4882a593Smuzhiyun
866*4882a593Smuzhiyun	# test native tunnel
867*4882a593Smuzhiyun	ip -netns "$testns" link add dev "$DEV_NS" type gretap seq \
868*4882a593Smuzhiyun		key 102 local 172.16.1.100 remote 172.16.1.200
869*4882a593Smuzhiyun	check_err $?
870*4882a593Smuzhiyun
871*4882a593Smuzhiyun	ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24
872*4882a593Smuzhiyun	check_err $?
873*4882a593Smuzhiyun
874*4882a593Smuzhiyun	ip -netns "$testns" link set dev $DEV_NS up
875*4882a593Smuzhiyun	check_err $?
876*4882a593Smuzhiyun
877*4882a593Smuzhiyun	ip -netns "$testns" link del "$DEV_NS"
878*4882a593Smuzhiyun	check_err $?
879*4882a593Smuzhiyun
880*4882a593Smuzhiyun	# test external mode
881*4882a593Smuzhiyun	ip -netns "$testns" link add dev "$DEV_NS" type gretap external
882*4882a593Smuzhiyun	check_err $?
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun	ip -netns "$testns" link del "$DEV_NS"
885*4882a593Smuzhiyun	check_err $?
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
888*4882a593Smuzhiyun		echo "FAIL: gretap"
889*4882a593Smuzhiyun		ip netns del "$testns"
890*4882a593Smuzhiyun		return 1
891*4882a593Smuzhiyun	fi
892*4882a593Smuzhiyun	echo "PASS: gretap"
893*4882a593Smuzhiyun
894*4882a593Smuzhiyun	ip netns del "$testns"
895*4882a593Smuzhiyun}
896*4882a593Smuzhiyun
897*4882a593Smuzhiyunkci_test_ip6gretap()
898*4882a593Smuzhiyun{
899*4882a593Smuzhiyun	testns="testns"
900*4882a593Smuzhiyun	DEV_NS=ip6gretap00
901*4882a593Smuzhiyun	local ret=0
902*4882a593Smuzhiyun
903*4882a593Smuzhiyun	ip netns add "$testns"
904*4882a593Smuzhiyun	if [ $? -ne 0 ]; then
905*4882a593Smuzhiyun		echo "SKIP ip6gretap tests: cannot add net namespace $testns"
906*4882a593Smuzhiyun		return $ksft_skip
907*4882a593Smuzhiyun	fi
908*4882a593Smuzhiyun
909*4882a593Smuzhiyun	ip link help ip6gretap 2>&1 | grep -q "^Usage:"
910*4882a593Smuzhiyun	if [ $? -ne 0 ];then
911*4882a593Smuzhiyun		echo "SKIP: ip6gretap: iproute2 too old"
912*4882a593Smuzhiyun		ip netns del "$testns"
913*4882a593Smuzhiyun		return $ksft_skip
914*4882a593Smuzhiyun	fi
915*4882a593Smuzhiyun
916*4882a593Smuzhiyun	# test native tunnel
917*4882a593Smuzhiyun	ip -netns "$testns" link add dev "$DEV_NS" type ip6gretap seq \
918*4882a593Smuzhiyun		key 102 local fc00:100::1 remote fc00:100::2
919*4882a593Smuzhiyun	check_err $?
920*4882a593Smuzhiyun
921*4882a593Smuzhiyun	ip -netns "$testns" addr add dev "$DEV_NS" fc00:200::1/96
922*4882a593Smuzhiyun	check_err $?
923*4882a593Smuzhiyun
924*4882a593Smuzhiyun	ip -netns "$testns" link set dev $DEV_NS up
925*4882a593Smuzhiyun	check_err $?
926*4882a593Smuzhiyun
927*4882a593Smuzhiyun	ip -netns "$testns" link del "$DEV_NS"
928*4882a593Smuzhiyun	check_err $?
929*4882a593Smuzhiyun
930*4882a593Smuzhiyun	# test external mode
931*4882a593Smuzhiyun	ip -netns "$testns" link add dev "$DEV_NS" type ip6gretap external
932*4882a593Smuzhiyun	check_err $?
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun	ip -netns "$testns" link del "$DEV_NS"
935*4882a593Smuzhiyun	check_err $?
936*4882a593Smuzhiyun
937*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
938*4882a593Smuzhiyun		echo "FAIL: ip6gretap"
939*4882a593Smuzhiyun		ip netns del "$testns"
940*4882a593Smuzhiyun		return 1
941*4882a593Smuzhiyun	fi
942*4882a593Smuzhiyun	echo "PASS: ip6gretap"
943*4882a593Smuzhiyun
944*4882a593Smuzhiyun	ip netns del "$testns"
945*4882a593Smuzhiyun}
946*4882a593Smuzhiyun
947*4882a593Smuzhiyunkci_test_erspan()
948*4882a593Smuzhiyun{
949*4882a593Smuzhiyun	testns="testns"
950*4882a593Smuzhiyun	DEV_NS=erspan00
951*4882a593Smuzhiyun	local ret=0
952*4882a593Smuzhiyun
953*4882a593Smuzhiyun	ip link help erspan 2>&1 | grep -q "^Usage:"
954*4882a593Smuzhiyun	if [ $? -ne 0 ];then
955*4882a593Smuzhiyun		echo "SKIP: erspan: iproute2 too old"
956*4882a593Smuzhiyun		return $ksft_skip
957*4882a593Smuzhiyun	fi
958*4882a593Smuzhiyun
959*4882a593Smuzhiyun	ip netns add "$testns"
960*4882a593Smuzhiyun	if [ $? -ne 0 ]; then
961*4882a593Smuzhiyun		echo "SKIP erspan tests: cannot add net namespace $testns"
962*4882a593Smuzhiyun		return $ksft_skip
963*4882a593Smuzhiyun	fi
964*4882a593Smuzhiyun
965*4882a593Smuzhiyun	# test native tunnel erspan v1
966*4882a593Smuzhiyun	ip -netns "$testns" link add dev "$DEV_NS" type erspan seq \
967*4882a593Smuzhiyun		key 102 local 172.16.1.100 remote 172.16.1.200 \
968*4882a593Smuzhiyun		erspan_ver 1 erspan 488
969*4882a593Smuzhiyun	check_err $?
970*4882a593Smuzhiyun
971*4882a593Smuzhiyun	ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24
972*4882a593Smuzhiyun	check_err $?
973*4882a593Smuzhiyun
974*4882a593Smuzhiyun	ip -netns "$testns" link set dev $DEV_NS up
975*4882a593Smuzhiyun	check_err $?
976*4882a593Smuzhiyun
977*4882a593Smuzhiyun	ip -netns "$testns" link del "$DEV_NS"
978*4882a593Smuzhiyun	check_err $?
979*4882a593Smuzhiyun
980*4882a593Smuzhiyun	# test native tunnel erspan v2
981*4882a593Smuzhiyun	ip -netns "$testns" link add dev "$DEV_NS" type erspan seq \
982*4882a593Smuzhiyun		key 102 local 172.16.1.100 remote 172.16.1.200 \
983*4882a593Smuzhiyun		erspan_ver 2 erspan_dir ingress erspan_hwid 7
984*4882a593Smuzhiyun	check_err $?
985*4882a593Smuzhiyun
986*4882a593Smuzhiyun	ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24
987*4882a593Smuzhiyun	check_err $?
988*4882a593Smuzhiyun
989*4882a593Smuzhiyun	ip -netns "$testns" link set dev $DEV_NS up
990*4882a593Smuzhiyun	check_err $?
991*4882a593Smuzhiyun
992*4882a593Smuzhiyun	ip -netns "$testns" link del "$DEV_NS"
993*4882a593Smuzhiyun	check_err $?
994*4882a593Smuzhiyun
995*4882a593Smuzhiyun	# test external mode
996*4882a593Smuzhiyun	ip -netns "$testns" link add dev "$DEV_NS" type erspan external
997*4882a593Smuzhiyun	check_err $?
998*4882a593Smuzhiyun
999*4882a593Smuzhiyun	ip -netns "$testns" link del "$DEV_NS"
1000*4882a593Smuzhiyun	check_err $?
1001*4882a593Smuzhiyun
1002*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
1003*4882a593Smuzhiyun		echo "FAIL: erspan"
1004*4882a593Smuzhiyun		ip netns del "$testns"
1005*4882a593Smuzhiyun		return 1
1006*4882a593Smuzhiyun	fi
1007*4882a593Smuzhiyun	echo "PASS: erspan"
1008*4882a593Smuzhiyun
1009*4882a593Smuzhiyun	ip netns del "$testns"
1010*4882a593Smuzhiyun}
1011*4882a593Smuzhiyun
1012*4882a593Smuzhiyunkci_test_ip6erspan()
1013*4882a593Smuzhiyun{
1014*4882a593Smuzhiyun	testns="testns"
1015*4882a593Smuzhiyun	DEV_NS=ip6erspan00
1016*4882a593Smuzhiyun	local ret=0
1017*4882a593Smuzhiyun
1018*4882a593Smuzhiyun	ip link help ip6erspan 2>&1 | grep -q "^Usage:"
1019*4882a593Smuzhiyun	if [ $? -ne 0 ];then
1020*4882a593Smuzhiyun		echo "SKIP: ip6erspan: iproute2 too old"
1021*4882a593Smuzhiyun		return $ksft_skip
1022*4882a593Smuzhiyun	fi
1023*4882a593Smuzhiyun
1024*4882a593Smuzhiyun	ip netns add "$testns"
1025*4882a593Smuzhiyun	if [ $? -ne 0 ]; then
1026*4882a593Smuzhiyun		echo "SKIP ip6erspan tests: cannot add net namespace $testns"
1027*4882a593Smuzhiyun		return $ksft_skip
1028*4882a593Smuzhiyun	fi
1029*4882a593Smuzhiyun
1030*4882a593Smuzhiyun	# test native tunnel ip6erspan v1
1031*4882a593Smuzhiyun	ip -netns "$testns" link add dev "$DEV_NS" type ip6erspan seq \
1032*4882a593Smuzhiyun		key 102 local fc00:100::1 remote fc00:100::2 \
1033*4882a593Smuzhiyun		erspan_ver 1 erspan 488
1034*4882a593Smuzhiyun	check_err $?
1035*4882a593Smuzhiyun
1036*4882a593Smuzhiyun	ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24
1037*4882a593Smuzhiyun	check_err $?
1038*4882a593Smuzhiyun
1039*4882a593Smuzhiyun	ip -netns "$testns" link set dev $DEV_NS up
1040*4882a593Smuzhiyun	check_err $?
1041*4882a593Smuzhiyun
1042*4882a593Smuzhiyun	ip -netns "$testns" link del "$DEV_NS"
1043*4882a593Smuzhiyun	check_err $?
1044*4882a593Smuzhiyun
1045*4882a593Smuzhiyun	# test native tunnel ip6erspan v2
1046*4882a593Smuzhiyun	ip -netns "$testns" link add dev "$DEV_NS" type ip6erspan seq \
1047*4882a593Smuzhiyun		key 102 local fc00:100::1 remote fc00:100::2 \
1048*4882a593Smuzhiyun		erspan_ver 2 erspan_dir ingress erspan_hwid 7
1049*4882a593Smuzhiyun	check_err $?
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun	ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24
1052*4882a593Smuzhiyun	check_err $?
1053*4882a593Smuzhiyun
1054*4882a593Smuzhiyun	ip -netns "$testns" link set dev $DEV_NS up
1055*4882a593Smuzhiyun	check_err $?
1056*4882a593Smuzhiyun
1057*4882a593Smuzhiyun	ip -netns "$testns" link del "$DEV_NS"
1058*4882a593Smuzhiyun	check_err $?
1059*4882a593Smuzhiyun
1060*4882a593Smuzhiyun	# test external mode
1061*4882a593Smuzhiyun	ip -netns "$testns" link add dev "$DEV_NS" \
1062*4882a593Smuzhiyun		type ip6erspan external
1063*4882a593Smuzhiyun	check_err $?
1064*4882a593Smuzhiyun
1065*4882a593Smuzhiyun	ip -netns "$testns" link del "$DEV_NS"
1066*4882a593Smuzhiyun	check_err $?
1067*4882a593Smuzhiyun
1068*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
1069*4882a593Smuzhiyun		echo "FAIL: ip6erspan"
1070*4882a593Smuzhiyun		ip netns del "$testns"
1071*4882a593Smuzhiyun		return 1
1072*4882a593Smuzhiyun	fi
1073*4882a593Smuzhiyun	echo "PASS: ip6erspan"
1074*4882a593Smuzhiyun
1075*4882a593Smuzhiyun	ip netns del "$testns"
1076*4882a593Smuzhiyun}
1077*4882a593Smuzhiyun
1078*4882a593Smuzhiyunkci_test_fdb_get()
1079*4882a593Smuzhiyun{
1080*4882a593Smuzhiyun	IP="ip -netns testns"
1081*4882a593Smuzhiyun	BRIDGE="bridge -netns testns"
1082*4882a593Smuzhiyun	brdev="test-br0"
1083*4882a593Smuzhiyun	vxlandev="vxlan10"
1084*4882a593Smuzhiyun	test_mac=de:ad:be:ef:13:37
1085*4882a593Smuzhiyun	localip="10.0.2.2"
1086*4882a593Smuzhiyun	dstip="10.0.2.3"
1087*4882a593Smuzhiyun	local ret=0
1088*4882a593Smuzhiyun
1089*4882a593Smuzhiyun	bridge fdb help 2>&1 |grep -q 'bridge fdb get'
1090*4882a593Smuzhiyun	if [ $? -ne 0 ];then
1091*4882a593Smuzhiyun		echo "SKIP: fdb get tests: iproute2 too old"
1092*4882a593Smuzhiyun		return $ksft_skip
1093*4882a593Smuzhiyun	fi
1094*4882a593Smuzhiyun
1095*4882a593Smuzhiyun	ip netns add testns
1096*4882a593Smuzhiyun	if [ $? -ne 0 ]; then
1097*4882a593Smuzhiyun		echo "SKIP fdb get tests: cannot add net namespace $testns"
1098*4882a593Smuzhiyun		return $ksft_skip
1099*4882a593Smuzhiyun	fi
1100*4882a593Smuzhiyun
1101*4882a593Smuzhiyun	$IP link add "$vxlandev" type vxlan id 10 local $localip \
1102*4882a593Smuzhiyun                dstport 4789 2>/dev/null
1103*4882a593Smuzhiyun	check_err $?
1104*4882a593Smuzhiyun	$IP link add name "$brdev" type bridge &>/dev/null
1105*4882a593Smuzhiyun	check_err $?
1106*4882a593Smuzhiyun	$IP link set dev "$vxlandev" master "$brdev" &>/dev/null
1107*4882a593Smuzhiyun	check_err $?
1108*4882a593Smuzhiyun	$BRIDGE fdb add $test_mac dev "$vxlandev" master &>/dev/null
1109*4882a593Smuzhiyun	check_err $?
1110*4882a593Smuzhiyun	$BRIDGE fdb add $test_mac dev "$vxlandev" dst $dstip self &>/dev/null
1111*4882a593Smuzhiyun	check_err $?
1112*4882a593Smuzhiyun
1113*4882a593Smuzhiyun	$BRIDGE fdb get $test_mac brport "$vxlandev" 2>/dev/null | grep -q "dev $vxlandev master $brdev"
1114*4882a593Smuzhiyun	check_err $?
1115*4882a593Smuzhiyun	$BRIDGE fdb get $test_mac br "$brdev" 2>/dev/null | grep -q "dev $vxlandev master $brdev"
1116*4882a593Smuzhiyun	check_err $?
1117*4882a593Smuzhiyun	$BRIDGE fdb get $test_mac dev "$vxlandev" self 2>/dev/null | grep -q "dev $vxlandev dst $dstip"
1118*4882a593Smuzhiyun	check_err $?
1119*4882a593Smuzhiyun
1120*4882a593Smuzhiyun	ip netns del testns &>/dev/null
1121*4882a593Smuzhiyun
1122*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
1123*4882a593Smuzhiyun		echo "FAIL: bridge fdb get"
1124*4882a593Smuzhiyun		return 1
1125*4882a593Smuzhiyun	fi
1126*4882a593Smuzhiyun
1127*4882a593Smuzhiyun	echo "PASS: bridge fdb get"
1128*4882a593Smuzhiyun}
1129*4882a593Smuzhiyun
1130*4882a593Smuzhiyunkci_test_neigh_get()
1131*4882a593Smuzhiyun{
1132*4882a593Smuzhiyun	dstmac=de:ad:be:ef:13:37
1133*4882a593Smuzhiyun	dstip=10.0.2.4
1134*4882a593Smuzhiyun	dstip6=dead::2
1135*4882a593Smuzhiyun	local ret=0
1136*4882a593Smuzhiyun
1137*4882a593Smuzhiyun	ip neigh help 2>&1 |grep -q 'ip neigh get'
1138*4882a593Smuzhiyun	if [ $? -ne 0 ];then
1139*4882a593Smuzhiyun		echo "SKIP: fdb get tests: iproute2 too old"
1140*4882a593Smuzhiyun		return $ksft_skip
1141*4882a593Smuzhiyun	fi
1142*4882a593Smuzhiyun
1143*4882a593Smuzhiyun	# ipv4
1144*4882a593Smuzhiyun	ip neigh add $dstip lladdr $dstmac dev "$devdummy"  > /dev/null
1145*4882a593Smuzhiyun	check_err $?
1146*4882a593Smuzhiyun	ip neigh get $dstip dev "$devdummy" 2> /dev/null | grep -q "$dstmac"
1147*4882a593Smuzhiyun	check_err $?
1148*4882a593Smuzhiyun	ip neigh del $dstip lladdr $dstmac dev "$devdummy"  > /dev/null
1149*4882a593Smuzhiyun	check_err $?
1150*4882a593Smuzhiyun
1151*4882a593Smuzhiyun	# ipv4 proxy
1152*4882a593Smuzhiyun	ip neigh add proxy $dstip dev "$devdummy" > /dev/null
1153*4882a593Smuzhiyun	check_err $?
1154*4882a593Smuzhiyun	ip neigh get proxy $dstip dev "$devdummy" 2>/dev/null | grep -q "$dstip"
1155*4882a593Smuzhiyun	check_err $?
1156*4882a593Smuzhiyun	ip neigh del proxy $dstip dev "$devdummy" > /dev/null
1157*4882a593Smuzhiyun	check_err $?
1158*4882a593Smuzhiyun
1159*4882a593Smuzhiyun	# ipv6
1160*4882a593Smuzhiyun	ip neigh add $dstip6 lladdr $dstmac dev "$devdummy"  > /dev/null
1161*4882a593Smuzhiyun	check_err $?
1162*4882a593Smuzhiyun	ip neigh get $dstip6 dev "$devdummy" 2> /dev/null | grep -q "$dstmac"
1163*4882a593Smuzhiyun	check_err $?
1164*4882a593Smuzhiyun	ip neigh del $dstip6 lladdr $dstmac dev "$devdummy"  > /dev/null
1165*4882a593Smuzhiyun	check_err $?
1166*4882a593Smuzhiyun
1167*4882a593Smuzhiyun	# ipv6 proxy
1168*4882a593Smuzhiyun	ip neigh add proxy $dstip6 dev "$devdummy" > /dev/null
1169*4882a593Smuzhiyun	check_err $?
1170*4882a593Smuzhiyun	ip neigh get proxy $dstip6 dev "$devdummy" 2>/dev/null | grep -q "$dstip6"
1171*4882a593Smuzhiyun	check_err $?
1172*4882a593Smuzhiyun	ip neigh del proxy $dstip6 dev "$devdummy" > /dev/null
1173*4882a593Smuzhiyun	check_err $?
1174*4882a593Smuzhiyun
1175*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
1176*4882a593Smuzhiyun		echo "FAIL: neigh get"
1177*4882a593Smuzhiyun		return 1
1178*4882a593Smuzhiyun	fi
1179*4882a593Smuzhiyun
1180*4882a593Smuzhiyun	echo "PASS: neigh get"
1181*4882a593Smuzhiyun}
1182*4882a593Smuzhiyun
1183*4882a593Smuzhiyunkci_test_bridge_parent_id()
1184*4882a593Smuzhiyun{
1185*4882a593Smuzhiyun	local ret=0
1186*4882a593Smuzhiyun	sysfsnet=/sys/bus/netdevsim/devices/netdevsim
1187*4882a593Smuzhiyun	probed=false
1188*4882a593Smuzhiyun
1189*4882a593Smuzhiyun	if [ ! -w /sys/bus/netdevsim/new_device ] ; then
1190*4882a593Smuzhiyun		modprobe -q netdevsim
1191*4882a593Smuzhiyun		check_err $?
1192*4882a593Smuzhiyun		if [ $ret -ne 0 ]; then
1193*4882a593Smuzhiyun			echo "SKIP: bridge_parent_id can't load netdevsim"
1194*4882a593Smuzhiyun			return $ksft_skip
1195*4882a593Smuzhiyun		fi
1196*4882a593Smuzhiyun		probed=true
1197*4882a593Smuzhiyun	fi
1198*4882a593Smuzhiyun
1199*4882a593Smuzhiyun	echo "10 1" > /sys/bus/netdevsim/new_device
1200*4882a593Smuzhiyun	while [ ! -d ${sysfsnet}10 ] ; do :; done
1201*4882a593Smuzhiyun	echo "20 1" > /sys/bus/netdevsim/new_device
1202*4882a593Smuzhiyun	while [ ! -d ${sysfsnet}20 ] ; do :; done
1203*4882a593Smuzhiyun	udevadm settle
1204*4882a593Smuzhiyun	dev10=`ls ${sysfsnet}10/net/`
1205*4882a593Smuzhiyun	dev20=`ls ${sysfsnet}20/net/`
1206*4882a593Smuzhiyun
1207*4882a593Smuzhiyun	ip link add name test-bond0 type bond mode 802.3ad
1208*4882a593Smuzhiyun	ip link set dev $dev10 master test-bond0
1209*4882a593Smuzhiyun	ip link set dev $dev20 master test-bond0
1210*4882a593Smuzhiyun	ip link add name test-br0 type bridge
1211*4882a593Smuzhiyun	ip link set dev test-bond0 master test-br0
1212*4882a593Smuzhiyun	check_err $?
1213*4882a593Smuzhiyun
1214*4882a593Smuzhiyun	# clean up any leftovers
1215*4882a593Smuzhiyun	ip link del dev test-br0
1216*4882a593Smuzhiyun	ip link del dev test-bond0
1217*4882a593Smuzhiyun	echo 20 > /sys/bus/netdevsim/del_device
1218*4882a593Smuzhiyun	echo 10 > /sys/bus/netdevsim/del_device
1219*4882a593Smuzhiyun	$probed && rmmod netdevsim
1220*4882a593Smuzhiyun
1221*4882a593Smuzhiyun	if [ $ret -ne 0 ]; then
1222*4882a593Smuzhiyun		echo "FAIL: bridge_parent_id"
1223*4882a593Smuzhiyun		return 1
1224*4882a593Smuzhiyun	fi
1225*4882a593Smuzhiyun	echo "PASS: bridge_parent_id"
1226*4882a593Smuzhiyun}
1227*4882a593Smuzhiyun
1228*4882a593Smuzhiyunkci_test_rtnl()
1229*4882a593Smuzhiyun{
1230*4882a593Smuzhiyun	local ret=0
1231*4882a593Smuzhiyun	kci_add_dummy
1232*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
1233*4882a593Smuzhiyun		echo "FAIL: cannot add dummy interface"
1234*4882a593Smuzhiyun		return 1
1235*4882a593Smuzhiyun	fi
1236*4882a593Smuzhiyun
1237*4882a593Smuzhiyun	kci_test_polrouting
1238*4882a593Smuzhiyun	check_err $?
1239*4882a593Smuzhiyun	kci_test_route_get
1240*4882a593Smuzhiyun	check_err $?
1241*4882a593Smuzhiyun	kci_test_addrlft
1242*4882a593Smuzhiyun	check_err $?
1243*4882a593Smuzhiyun	kci_test_promote_secondaries
1244*4882a593Smuzhiyun	check_err $?
1245*4882a593Smuzhiyun	kci_test_tc
1246*4882a593Smuzhiyun	check_err $?
1247*4882a593Smuzhiyun	kci_test_gre
1248*4882a593Smuzhiyun	check_err $?
1249*4882a593Smuzhiyun	kci_test_gretap
1250*4882a593Smuzhiyun	check_err $?
1251*4882a593Smuzhiyun	kci_test_ip6gretap
1252*4882a593Smuzhiyun	check_err $?
1253*4882a593Smuzhiyun	kci_test_erspan
1254*4882a593Smuzhiyun	check_err $?
1255*4882a593Smuzhiyun	kci_test_ip6erspan
1256*4882a593Smuzhiyun	check_err $?
1257*4882a593Smuzhiyun	kci_test_bridge
1258*4882a593Smuzhiyun	check_err $?
1259*4882a593Smuzhiyun	kci_test_addrlabel
1260*4882a593Smuzhiyun	check_err $?
1261*4882a593Smuzhiyun	kci_test_ifalias
1262*4882a593Smuzhiyun	check_err $?
1263*4882a593Smuzhiyun	kci_test_vrf
1264*4882a593Smuzhiyun	check_err $?
1265*4882a593Smuzhiyun	kci_test_encap
1266*4882a593Smuzhiyun	check_err $?
1267*4882a593Smuzhiyun	kci_test_macsec
1268*4882a593Smuzhiyun	check_err $?
1269*4882a593Smuzhiyun	kci_test_ipsec
1270*4882a593Smuzhiyun	check_err $?
1271*4882a593Smuzhiyun	kci_test_ipsec_offload
1272*4882a593Smuzhiyun	check_err $?
1273*4882a593Smuzhiyun	kci_test_fdb_get
1274*4882a593Smuzhiyun	check_err $?
1275*4882a593Smuzhiyun	kci_test_neigh_get
1276*4882a593Smuzhiyun	check_err $?
1277*4882a593Smuzhiyun	kci_test_bridge_parent_id
1278*4882a593Smuzhiyun	check_err $?
1279*4882a593Smuzhiyun
1280*4882a593Smuzhiyun	kci_del_dummy
1281*4882a593Smuzhiyun	return $ret
1282*4882a593Smuzhiyun}
1283*4882a593Smuzhiyun
1284*4882a593Smuzhiyun#check for needed privileges
1285*4882a593Smuzhiyunif [ "$(id -u)" -ne 0 ];then
1286*4882a593Smuzhiyun	echo "SKIP: Need root privileges"
1287*4882a593Smuzhiyun	exit $ksft_skip
1288*4882a593Smuzhiyunfi
1289*4882a593Smuzhiyun
1290*4882a593Smuzhiyunfor x in ip tc;do
1291*4882a593Smuzhiyun	$x -Version 2>/dev/null >/dev/null
1292*4882a593Smuzhiyun	if [ $? -ne 0 ];then
1293*4882a593Smuzhiyun		echo "SKIP: Could not run test without the $x tool"
1294*4882a593Smuzhiyun		exit $ksft_skip
1295*4882a593Smuzhiyun	fi
1296*4882a593Smuzhiyundone
1297*4882a593Smuzhiyun
1298*4882a593Smuzhiyunkci_test_rtnl
1299*4882a593Smuzhiyun
1300*4882a593Smuzhiyunexit $?
1301