xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/net/vrf-xfrm-tests.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun#
4*4882a593Smuzhiyun# Various combinations of VRF with xfrms and qdisc.
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4.
7*4882a593Smuzhiyunksft_skip=4
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunPAUSE_ON_FAIL=no
10*4882a593SmuzhiyunVERBOSE=0
11*4882a593Smuzhiyunret=0
12*4882a593Smuzhiyun
13*4882a593SmuzhiyunHOST1_4=192.168.1.1
14*4882a593SmuzhiyunHOST2_4=192.168.1.2
15*4882a593SmuzhiyunHOST1_6=2001:db8:1::1
16*4882a593SmuzhiyunHOST2_6=2001:db8:1::2
17*4882a593Smuzhiyun
18*4882a593SmuzhiyunXFRM1_4=10.0.1.1
19*4882a593SmuzhiyunXFRM2_4=10.0.1.2
20*4882a593SmuzhiyunXFRM1_6=fc00:1000::1
21*4882a593SmuzhiyunXFRM2_6=fc00:1000::2
22*4882a593SmuzhiyunIF_ID=123
23*4882a593Smuzhiyun
24*4882a593SmuzhiyunVRF=red
25*4882a593SmuzhiyunTABLE=300
26*4882a593Smuzhiyun
27*4882a593SmuzhiyunAUTH_1=0xd94fcfea65fddf21dc6e0d24a0253508
28*4882a593SmuzhiyunAUTH_2=0xdc6e0d24a0253508d94fcfea65fddf21
29*4882a593SmuzhiyunENC_1=0xfc46c20f8048be9725930ff3fb07ac2a91f0347dffeacf62
30*4882a593SmuzhiyunENC_2=0x3fb07ac2a91f0347dffeacf62fc46c20f8048be9725930ff
31*4882a593SmuzhiyunSPI_1=0x02122b77
32*4882a593SmuzhiyunSPI_2=0x2b770212
33*4882a593Smuzhiyun
34*4882a593Smuzhiyunwhich ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping)
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun################################################################################
37*4882a593Smuzhiyun#
38*4882a593Smuzhiyunlog_test()
39*4882a593Smuzhiyun{
40*4882a593Smuzhiyun	local rc=$1
41*4882a593Smuzhiyun	local expected=$2
42*4882a593Smuzhiyun	local msg="$3"
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun	if [ ${rc} -eq ${expected} ]; then
45*4882a593Smuzhiyun		printf "TEST: %-60s  [ OK ]\n" "${msg}"
46*4882a593Smuzhiyun		nsuccess=$((nsuccess+1))
47*4882a593Smuzhiyun	else
48*4882a593Smuzhiyun		ret=1
49*4882a593Smuzhiyun		nfail=$((nfail+1))
50*4882a593Smuzhiyun		printf "TEST: %-60s  [FAIL]\n" "${msg}"
51*4882a593Smuzhiyun		if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
52*4882a593Smuzhiyun			echo
53*4882a593Smuzhiyun			echo "hit enter to continue, 'q' to quit"
54*4882a593Smuzhiyun			read a
55*4882a593Smuzhiyun			[ "$a" = "q" ] && exit 1
56*4882a593Smuzhiyun		fi
57*4882a593Smuzhiyun	fi
58*4882a593Smuzhiyun}
59*4882a593Smuzhiyun
60*4882a593Smuzhiyunrun_cmd_host1()
61*4882a593Smuzhiyun{
62*4882a593Smuzhiyun	local cmd="$*"
63*4882a593Smuzhiyun	local out
64*4882a593Smuzhiyun	local rc
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun	if [ "$VERBOSE" = "1" ]; then
67*4882a593Smuzhiyun		printf "    COMMAND: $cmd\n"
68*4882a593Smuzhiyun	fi
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun	out=$(eval ip netns exec host1 $cmd 2>&1)
71*4882a593Smuzhiyun	rc=$?
72*4882a593Smuzhiyun	if [ "$VERBOSE" = "1" ]; then
73*4882a593Smuzhiyun		if [ -n "$out" ]; then
74*4882a593Smuzhiyun			echo
75*4882a593Smuzhiyun			echo "    $out"
76*4882a593Smuzhiyun		fi
77*4882a593Smuzhiyun		echo
78*4882a593Smuzhiyun	fi
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun	return $rc
81*4882a593Smuzhiyun}
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun################################################################################
84*4882a593Smuzhiyun# create namespaces for hosts and sws
85*4882a593Smuzhiyun
86*4882a593Smuzhiyuncreate_vrf()
87*4882a593Smuzhiyun{
88*4882a593Smuzhiyun	local ns=$1
89*4882a593Smuzhiyun	local vrf=$2
90*4882a593Smuzhiyun	local table=$3
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun	if [ -n "${ns}" ]; then
93*4882a593Smuzhiyun		ns="-netns ${ns}"
94*4882a593Smuzhiyun	fi
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun	ip ${ns} link add ${vrf} type vrf table ${table}
97*4882a593Smuzhiyun	ip ${ns} link set ${vrf} up
98*4882a593Smuzhiyun	ip ${ns} route add vrf ${vrf} unreachable default metric 8192
99*4882a593Smuzhiyun	ip ${ns} -6 route add vrf ${vrf} unreachable default metric 8192
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun	ip ${ns} addr add 127.0.0.1/8 dev ${vrf}
102*4882a593Smuzhiyun	ip ${ns} -6 addr add ::1 dev ${vrf} nodad
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun	ip ${ns} ru del pref 0
105*4882a593Smuzhiyun	ip ${ns} ru add pref 32765 from all lookup local
106*4882a593Smuzhiyun	ip ${ns} -6 ru del pref 0
107*4882a593Smuzhiyun	ip ${ns} -6 ru add pref 32765 from all lookup local
108*4882a593Smuzhiyun}
109*4882a593Smuzhiyun
110*4882a593Smuzhiyuncreate_ns()
111*4882a593Smuzhiyun{
112*4882a593Smuzhiyun	local ns=$1
113*4882a593Smuzhiyun	local addr=$2
114*4882a593Smuzhiyun	local addr6=$3
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun	[ -z "${addr}" ] && addr="-"
117*4882a593Smuzhiyun	[ -z "${addr6}" ] && addr6="-"
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun	ip netns add ${ns}
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun	ip -netns ${ns} link set lo up
122*4882a593Smuzhiyun	if [ "${addr}" != "-" ]; then
123*4882a593Smuzhiyun		ip -netns ${ns} addr add dev lo ${addr}
124*4882a593Smuzhiyun	fi
125*4882a593Smuzhiyun	if [ "${addr6}" != "-" ]; then
126*4882a593Smuzhiyun		ip -netns ${ns} -6 addr add dev lo ${addr6}
127*4882a593Smuzhiyun	fi
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun	ip -netns ${ns} ro add unreachable default metric 8192
130*4882a593Smuzhiyun	ip -netns ${ns} -6 ro add unreachable default metric 8192
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun	ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1
133*4882a593Smuzhiyun	ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
134*4882a593Smuzhiyun	ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1
135*4882a593Smuzhiyun	ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1
136*4882a593Smuzhiyun	ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.accept_dad=0
137*4882a593Smuzhiyun}
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun# create veth pair to connect namespaces and apply addresses.
140*4882a593Smuzhiyunconnect_ns()
141*4882a593Smuzhiyun{
142*4882a593Smuzhiyun	local ns1=$1
143*4882a593Smuzhiyun	local ns1_dev=$2
144*4882a593Smuzhiyun	local ns1_addr=$3
145*4882a593Smuzhiyun	local ns1_addr6=$4
146*4882a593Smuzhiyun	local ns2=$5
147*4882a593Smuzhiyun	local ns2_dev=$6
148*4882a593Smuzhiyun	local ns2_addr=$7
149*4882a593Smuzhiyun	local ns2_addr6=$8
150*4882a593Smuzhiyun	local ns1arg
151*4882a593Smuzhiyun	local ns2arg
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun	if [ -n "${ns1}" ]; then
154*4882a593Smuzhiyun		ns1arg="-netns ${ns1}"
155*4882a593Smuzhiyun	fi
156*4882a593Smuzhiyun	if [ -n "${ns2}" ]; then
157*4882a593Smuzhiyun		ns2arg="-netns ${ns2}"
158*4882a593Smuzhiyun	fi
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun	ip ${ns1arg} li add ${ns1_dev} type veth peer name tmp
161*4882a593Smuzhiyun	ip ${ns1arg} li set ${ns1_dev} up
162*4882a593Smuzhiyun	ip ${ns1arg} li set tmp netns ${ns2} name ${ns2_dev}
163*4882a593Smuzhiyun	ip ${ns2arg} li set ${ns2_dev} up
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun	if [ "${ns1_addr}" != "-" ]; then
166*4882a593Smuzhiyun		ip ${ns1arg} addr add dev ${ns1_dev} ${ns1_addr}
167*4882a593Smuzhiyun		ip ${ns2arg} addr add dev ${ns2_dev} ${ns2_addr}
168*4882a593Smuzhiyun	fi
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun	if [ "${ns1_addr6}" != "-" ]; then
171*4882a593Smuzhiyun		ip ${ns1arg} addr add dev ${ns1_dev} ${ns1_addr6} nodad
172*4882a593Smuzhiyun		ip ${ns2arg} addr add dev ${ns2_dev} ${ns2_addr6} nodad
173*4882a593Smuzhiyun	fi
174*4882a593Smuzhiyun}
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun################################################################################
177*4882a593Smuzhiyun
178*4882a593Smuzhiyuncleanup()
179*4882a593Smuzhiyun{
180*4882a593Smuzhiyun	ip netns del host1
181*4882a593Smuzhiyun	ip netns del host2
182*4882a593Smuzhiyun}
183*4882a593Smuzhiyun
184*4882a593Smuzhiyunsetup()
185*4882a593Smuzhiyun{
186*4882a593Smuzhiyun	create_ns "host1"
187*4882a593Smuzhiyun	create_ns "host2"
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun	connect_ns "host1" eth0 ${HOST1_4}/24 ${HOST1_6}/64 \
190*4882a593Smuzhiyun	           "host2" eth0 ${HOST2_4}/24 ${HOST2_6}/64
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun	create_vrf "host1" ${VRF} ${TABLE}
193*4882a593Smuzhiyun	ip -netns host1 link set dev eth0 master ${VRF}
194*4882a593Smuzhiyun}
195*4882a593Smuzhiyun
196*4882a593Smuzhiyuncleanup_xfrm()
197*4882a593Smuzhiyun{
198*4882a593Smuzhiyun	for ns in host1 host2
199*4882a593Smuzhiyun	do
200*4882a593Smuzhiyun		for x in state policy
201*4882a593Smuzhiyun		do
202*4882a593Smuzhiyun			ip -netns ${ns} xfrm ${x} flush
203*4882a593Smuzhiyun			ip -6 -netns ${ns} xfrm ${x} flush
204*4882a593Smuzhiyun		done
205*4882a593Smuzhiyun	done
206*4882a593Smuzhiyun}
207*4882a593Smuzhiyun
208*4882a593Smuzhiyunsetup_xfrm()
209*4882a593Smuzhiyun{
210*4882a593Smuzhiyun	local h1_4=$1
211*4882a593Smuzhiyun	local h2_4=$2
212*4882a593Smuzhiyun	local h1_6=$3
213*4882a593Smuzhiyun	local h2_6=$4
214*4882a593Smuzhiyun	local devarg="$5"
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun	#
217*4882a593Smuzhiyun	# policy
218*4882a593Smuzhiyun	#
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun	# host1 - IPv4 out
221*4882a593Smuzhiyun	ip -netns host1 xfrm policy add \
222*4882a593Smuzhiyun	  src ${h1_4} dst ${h2_4} ${devarg} dir out \
223*4882a593Smuzhiyun	  tmpl src ${HOST1_4} dst ${HOST2_4} proto esp mode tunnel
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun	# host2 - IPv4 in
226*4882a593Smuzhiyun	ip -netns host2 xfrm policy add \
227*4882a593Smuzhiyun	  src ${h1_4} dst ${h2_4} dir in \
228*4882a593Smuzhiyun	  tmpl src ${HOST1_4} dst ${HOST2_4} proto esp mode tunnel
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun	# host1 - IPv4 in
231*4882a593Smuzhiyun	ip -netns host1 xfrm policy add \
232*4882a593Smuzhiyun	  src ${h2_4} dst ${h1_4} ${devarg} dir in \
233*4882a593Smuzhiyun	  tmpl src ${HOST2_4} dst ${HOST1_4} proto esp mode tunnel
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun	# host2 - IPv4 out
236*4882a593Smuzhiyun	ip -netns host2 xfrm policy add \
237*4882a593Smuzhiyun	  src ${h2_4} dst ${h1_4} dir out \
238*4882a593Smuzhiyun	  tmpl src ${HOST2_4} dst ${HOST1_4} proto esp mode tunnel
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun	# host1 - IPv6 out
242*4882a593Smuzhiyun	ip -6 -netns host1 xfrm policy add \
243*4882a593Smuzhiyun	  src ${h1_6} dst ${h2_6} ${devarg} dir out \
244*4882a593Smuzhiyun	  tmpl src ${HOST1_6} dst ${HOST2_6} proto esp mode tunnel
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun	# host2 - IPv6 in
247*4882a593Smuzhiyun	ip -6 -netns host2 xfrm policy add \
248*4882a593Smuzhiyun	  src ${h1_6} dst ${h2_6} dir in \
249*4882a593Smuzhiyun	  tmpl src ${HOST1_6} dst ${HOST2_6} proto esp mode tunnel
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun	# host1 - IPv6 in
252*4882a593Smuzhiyun	ip -6 -netns host1 xfrm policy add \
253*4882a593Smuzhiyun	  src ${h2_6} dst ${h1_6} ${devarg} dir in \
254*4882a593Smuzhiyun	  tmpl src ${HOST2_6} dst ${HOST1_6} proto esp mode tunnel
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun	# host2 - IPv6 out
257*4882a593Smuzhiyun	ip -6 -netns host2 xfrm policy add \
258*4882a593Smuzhiyun	  src ${h2_6} dst ${h1_6} dir out \
259*4882a593Smuzhiyun	  tmpl src ${HOST2_6} dst ${HOST1_6} proto esp mode tunnel
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun	#
262*4882a593Smuzhiyun	# state
263*4882a593Smuzhiyun	#
264*4882a593Smuzhiyun	ip -netns host1 xfrm state add src ${HOST1_4} dst ${HOST2_4} \
265*4882a593Smuzhiyun	    proto esp spi ${SPI_1} reqid 0 mode tunnel \
266*4882a593Smuzhiyun	    replay-window 4 replay-oseq 0x4 \
267*4882a593Smuzhiyun	    auth-trunc 'hmac(md5)' ${AUTH_1} 96 \
268*4882a593Smuzhiyun	    enc 'cbc(des3_ede)' ${ENC_1} \
269*4882a593Smuzhiyun	    sel src ${h1_4} dst ${h2_4} ${devarg}
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun	ip -netns host2 xfrm state add src ${HOST1_4} dst ${HOST2_4} \
272*4882a593Smuzhiyun	    proto esp spi ${SPI_1} reqid 0 mode tunnel \
273*4882a593Smuzhiyun	    replay-window 4 replay-oseq 0x4 \
274*4882a593Smuzhiyun	    auth-trunc 'hmac(md5)' ${AUTH_1} 96 \
275*4882a593Smuzhiyun	    enc 'cbc(des3_ede)' ${ENC_1} \
276*4882a593Smuzhiyun	    sel src ${h1_4} dst ${h2_4}
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun	ip -netns host1 xfrm state add src ${HOST2_4} dst ${HOST1_4} \
280*4882a593Smuzhiyun	    proto esp spi ${SPI_2} reqid 0 mode tunnel \
281*4882a593Smuzhiyun	    replay-window 4 replay-oseq 0x4 \
282*4882a593Smuzhiyun	    auth-trunc 'hmac(md5)' ${AUTH_2} 96 \
283*4882a593Smuzhiyun	    enc 'cbc(des3_ede)' ${ENC_2} \
284*4882a593Smuzhiyun	    sel src ${h2_4} dst ${h1_4} ${devarg}
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun	ip -netns host2 xfrm state add src ${HOST2_4} dst ${HOST1_4} \
287*4882a593Smuzhiyun	    proto esp spi ${SPI_2} reqid 0 mode tunnel \
288*4882a593Smuzhiyun	    replay-window 4 replay-oseq 0x4 \
289*4882a593Smuzhiyun	    auth-trunc 'hmac(md5)' ${AUTH_2} 96 \
290*4882a593Smuzhiyun	    enc 'cbc(des3_ede)' ${ENC_2} \
291*4882a593Smuzhiyun	    sel src ${h2_4} dst ${h1_4}
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun	ip -6 -netns host1 xfrm state add src ${HOST1_6} dst ${HOST2_6} \
295*4882a593Smuzhiyun	    proto esp spi ${SPI_1} reqid 0 mode tunnel \
296*4882a593Smuzhiyun	    replay-window 4 replay-oseq 0x4 \
297*4882a593Smuzhiyun	    auth-trunc 'hmac(md5)' ${AUTH_1} 96 \
298*4882a593Smuzhiyun	    enc 'cbc(des3_ede)' ${ENC_1} \
299*4882a593Smuzhiyun	    sel src ${h1_6} dst ${h2_6} ${devarg}
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun	ip -6 -netns host2 xfrm state add src ${HOST1_6} dst ${HOST2_6} \
302*4882a593Smuzhiyun	    proto esp spi ${SPI_1} reqid 0 mode tunnel \
303*4882a593Smuzhiyun	    replay-window 4 replay-oseq 0x4 \
304*4882a593Smuzhiyun	    auth-trunc 'hmac(md5)' ${AUTH_1} 96 \
305*4882a593Smuzhiyun	    enc 'cbc(des3_ede)' ${ENC_1} \
306*4882a593Smuzhiyun	    sel src ${h1_6} dst ${h2_6}
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun	ip -6 -netns host1 xfrm state add src ${HOST2_6} dst ${HOST1_6} \
310*4882a593Smuzhiyun	    proto esp spi ${SPI_2} reqid 0 mode tunnel \
311*4882a593Smuzhiyun	    replay-window 4 replay-oseq 0x4 \
312*4882a593Smuzhiyun	    auth-trunc 'hmac(md5)' ${AUTH_2} 96 \
313*4882a593Smuzhiyun	    enc 'cbc(des3_ede)' ${ENC_2} \
314*4882a593Smuzhiyun	    sel src ${h2_6} dst ${h1_6} ${devarg}
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun	ip -6 -netns host2 xfrm state add src ${HOST2_6} dst ${HOST1_6} \
317*4882a593Smuzhiyun	    proto esp spi ${SPI_2} reqid 0 mode tunnel \
318*4882a593Smuzhiyun	    replay-window 4 replay-oseq 0x4 \
319*4882a593Smuzhiyun	    auth-trunc 'hmac(md5)' ${AUTH_2} 96 \
320*4882a593Smuzhiyun	    enc 'cbc(des3_ede)' ${ENC_2} \
321*4882a593Smuzhiyun	    sel src ${h2_6} dst ${h1_6}
322*4882a593Smuzhiyun}
323*4882a593Smuzhiyun
324*4882a593Smuzhiyuncleanup_xfrm_dev()
325*4882a593Smuzhiyun{
326*4882a593Smuzhiyun	ip -netns host1 li del xfrm0
327*4882a593Smuzhiyun	ip -netns host2 addr del ${XFRM2_4}/24 dev eth0
328*4882a593Smuzhiyun	ip -netns host2 addr del ${XFRM2_6}/64 dev eth0
329*4882a593Smuzhiyun}
330*4882a593Smuzhiyun
331*4882a593Smuzhiyunsetup_xfrm_dev()
332*4882a593Smuzhiyun{
333*4882a593Smuzhiyun	local vrfarg="vrf ${VRF}"
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun	ip -netns host1 li add type xfrm dev eth0 if_id ${IF_ID}
336*4882a593Smuzhiyun	ip -netns host1 li set xfrm0 ${vrfarg} up
337*4882a593Smuzhiyun	ip -netns host1 addr add ${XFRM1_4}/24 dev xfrm0
338*4882a593Smuzhiyun	ip -netns host1 addr add ${XFRM1_6}/64 dev xfrm0
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun	ip -netns host2 addr add ${XFRM2_4}/24 dev eth0
341*4882a593Smuzhiyun	ip -netns host2 addr add ${XFRM2_6}/64 dev eth0
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun	setup_xfrm ${XFRM1_4} ${XFRM2_4} ${XFRM1_6} ${XFRM2_6} "if_id ${IF_ID}"
344*4882a593Smuzhiyun}
345*4882a593Smuzhiyun
346*4882a593Smuzhiyunrun_tests()
347*4882a593Smuzhiyun{
348*4882a593Smuzhiyun	cleanup_xfrm
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun	# no IPsec
351*4882a593Smuzhiyun	run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4}
352*4882a593Smuzhiyun	log_test $? 0 "IPv4 no xfrm policy"
353*4882a593Smuzhiyun	run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6}
354*4882a593Smuzhiyun	log_test $? 0 "IPv6 no xfrm policy"
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun	# xfrm without VRF in sel
357*4882a593Smuzhiyun	setup_xfrm ${HOST1_4} ${HOST2_4} ${HOST1_6} ${HOST2_6}
358*4882a593Smuzhiyun	run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4}
359*4882a593Smuzhiyun	log_test $? 0 "IPv4 xfrm policy based on address"
360*4882a593Smuzhiyun	run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6}
361*4882a593Smuzhiyun	log_test $? 0 "IPv6 xfrm policy based on address"
362*4882a593Smuzhiyun	cleanup_xfrm
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun	# xfrm with VRF in sel
365*4882a593Smuzhiyun	# Known failure: ipv4 resets the flow oif after the lookup. Fix is
366*4882a593Smuzhiyun	# not straightforward.
367*4882a593Smuzhiyun	# setup_xfrm ${HOST1_4} ${HOST2_4} ${HOST1_6} ${HOST2_6} "dev ${VRF}"
368*4882a593Smuzhiyun	# run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4}
369*4882a593Smuzhiyun	# log_test $? 0 "IPv4 xfrm policy with VRF in selector"
370*4882a593Smuzhiyun	run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6}
371*4882a593Smuzhiyun	log_test $? 0 "IPv6 xfrm policy with VRF in selector"
372*4882a593Smuzhiyun	cleanup_xfrm
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun	# xfrm with enslaved device in sel
375*4882a593Smuzhiyun	# Known failures: combined with the above, __xfrm{4,6}_selector_match
376*4882a593Smuzhiyun	# needs to consider both l3mdev and enslaved device index.
377*4882a593Smuzhiyun	# setup_xfrm ${HOST1_4} ${HOST2_4} ${HOST1_6} ${HOST2_6} "dev eth0"
378*4882a593Smuzhiyun	# run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4}
379*4882a593Smuzhiyun	# log_test $? 0 "IPv4 xfrm policy with enslaved device in selector"
380*4882a593Smuzhiyun	# run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6}
381*4882a593Smuzhiyun	# log_test $? 0 "IPv6 xfrm policy with enslaved device in selector"
382*4882a593Smuzhiyun	# cleanup_xfrm
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun	# xfrm device
385*4882a593Smuzhiyun	setup_xfrm_dev
386*4882a593Smuzhiyun	run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${XFRM2_4}
387*4882a593Smuzhiyun	log_test $? 0 "IPv4 xfrm policy with xfrm device"
388*4882a593Smuzhiyun	run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${XFRM2_6}
389*4882a593Smuzhiyun	log_test $? 0 "IPv6 xfrm policy with xfrm device"
390*4882a593Smuzhiyun	cleanup_xfrm_dev
391*4882a593Smuzhiyun}
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun################################################################################
394*4882a593Smuzhiyun# usage
395*4882a593Smuzhiyun
396*4882a593Smuzhiyunusage()
397*4882a593Smuzhiyun{
398*4882a593Smuzhiyun        cat <<EOF
399*4882a593Smuzhiyunusage: ${0##*/} OPTS
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun        -p          Pause on fail
402*4882a593Smuzhiyun        -v          verbose mode (show commands and output)
403*4882a593Smuzhiyun
404*4882a593Smuzhiyundone
405*4882a593SmuzhiyunEOF
406*4882a593Smuzhiyun}
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun################################################################################
409*4882a593Smuzhiyun# main
410*4882a593Smuzhiyun
411*4882a593Smuzhiyunwhile getopts :pv o
412*4882a593Smuzhiyundo
413*4882a593Smuzhiyun	case $o in
414*4882a593Smuzhiyun		p) PAUSE_ON_FAIL=yes;;
415*4882a593Smuzhiyun		v) VERBOSE=$(($VERBOSE + 1));;
416*4882a593Smuzhiyun		h) usage; exit 0;;
417*4882a593Smuzhiyun		*) usage; exit 1;;
418*4882a593Smuzhiyun	esac
419*4882a593Smuzhiyundone
420*4882a593Smuzhiyun
421*4882a593Smuzhiyuncleanup 2>/dev/null
422*4882a593Smuzhiyunsetup
423*4882a593Smuzhiyun
424*4882a593Smuzhiyunecho
425*4882a593Smuzhiyunecho "No qdisc on VRF device"
426*4882a593Smuzhiyunrun_tests
427*4882a593Smuzhiyun
428*4882a593Smuzhiyunrun_cmd_host1 tc qdisc add dev ${VRF} root netem delay 100ms
429*4882a593Smuzhiyunecho
430*4882a593Smuzhiyunecho "netem qdisc on VRF device"
431*4882a593Smuzhiyunrun_tests
432*4882a593Smuzhiyun
433*4882a593Smuzhiyunprintf "\nTests passed: %3d\n" ${nsuccess}
434*4882a593Smuzhiyunprintf "Tests failed: %3d\n"   ${nfail}
435*4882a593Smuzhiyun
436*4882a593Smuzhiyunexit $ret
437