xref: /linux/tools/testing/selftests/net/vrf-xfrm-tests.sh (revision a23e1966932464e1c5226cb9ac4ce1d5fc10ba22)
13f251d74SDavid Ahern#!/bin/bash
23f251d74SDavid Ahern# SPDX-License-Identifier: GPL-2.0
33f251d74SDavid Ahern#
43f251d74SDavid Ahern# Various combinations of VRF with xfrms and qdisc.
53f251d74SDavid Ahern
661b12ebeSHangbin Liusource lib.sh
73f251d74SDavid AhernPAUSE_ON_FAIL=no
83f251d74SDavid AhernVERBOSE=0
93f251d74SDavid Ahernret=0
103f251d74SDavid Ahern
113f251d74SDavid AhernHOST1_4=192.168.1.1
123f251d74SDavid AhernHOST2_4=192.168.1.2
133f251d74SDavid AhernHOST1_6=2001:db8:1::1
143f251d74SDavid AhernHOST2_6=2001:db8:1::2
153f251d74SDavid Ahern
163f251d74SDavid AhernXFRM1_4=10.0.1.1
173f251d74SDavid AhernXFRM2_4=10.0.1.2
183f251d74SDavid AhernXFRM1_6=fc00:1000::1
193f251d74SDavid AhernXFRM2_6=fc00:1000::2
203f251d74SDavid AhernIF_ID=123
213f251d74SDavid Ahern
223f251d74SDavid AhernVRF=red
233f251d74SDavid AhernTABLE=300
243f251d74SDavid Ahern
253f251d74SDavid AhernAUTH_1=0xd94fcfea65fddf21dc6e0d24a0253508
263f251d74SDavid AhernAUTH_2=0xdc6e0d24a0253508d94fcfea65fddf21
273f251d74SDavid AhernENC_1=0xfc46c20f8048be9725930ff3fb07ac2a91f0347dffeacf62
283f251d74SDavid AhernENC_2=0x3fb07ac2a91f0347dffeacf62fc46c20f8048be9725930ff
293f251d74SDavid AhernSPI_1=0x02122b77
303f251d74SDavid AhernSPI_2=0x2b770212
313f251d74SDavid Ahern
323f251d74SDavid Ahernwhich ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping)
333f251d74SDavid Ahern
343f251d74SDavid Ahern################################################################################
353f251d74SDavid Ahern#
363f251d74SDavid Ahernlog_test()
373f251d74SDavid Ahern{
383f251d74SDavid Ahern	local rc=$1
393f251d74SDavid Ahern	local expected=$2
403f251d74SDavid Ahern	local msg="$3"
413f251d74SDavid Ahern
423f251d74SDavid Ahern	if [ ${rc} -eq ${expected} ]; then
433f251d74SDavid Ahern		printf "TEST: %-60s  [ OK ]\n" "${msg}"
443f251d74SDavid Ahern		nsuccess=$((nsuccess+1))
453f251d74SDavid Ahern	else
463f251d74SDavid Ahern		ret=1
473f251d74SDavid Ahern		nfail=$((nfail+1))
483f251d74SDavid Ahern		printf "TEST: %-60s  [FAIL]\n" "${msg}"
493f251d74SDavid Ahern		if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
503f251d74SDavid Ahern			echo
513f251d74SDavid Ahern			echo "hit enter to continue, 'q' to quit"
523f251d74SDavid Ahern			read a
533f251d74SDavid Ahern			[ "$a" = "q" ] && exit 1
543f251d74SDavid Ahern		fi
553f251d74SDavid Ahern	fi
563f251d74SDavid Ahern}
573f251d74SDavid Ahern
583f251d74SDavid Ahernrun_cmd_host1()
593f251d74SDavid Ahern{
603f251d74SDavid Ahern	local cmd="$*"
613f251d74SDavid Ahern	local out
623f251d74SDavid Ahern	local rc
633f251d74SDavid Ahern
643f251d74SDavid Ahern	if [ "$VERBOSE" = "1" ]; then
653f251d74SDavid Ahern		printf "    COMMAND: $cmd\n"
663f251d74SDavid Ahern	fi
673f251d74SDavid Ahern
6861b12ebeSHangbin Liu	out=$(eval ip netns exec $host1 $cmd 2>&1)
693f251d74SDavid Ahern	rc=$?
703f251d74SDavid Ahern	if [ "$VERBOSE" = "1" ]; then
713f251d74SDavid Ahern		if [ -n "$out" ]; then
723f251d74SDavid Ahern			echo
733f251d74SDavid Ahern			echo "    $out"
743f251d74SDavid Ahern		fi
753f251d74SDavid Ahern		echo
763f251d74SDavid Ahern	fi
773f251d74SDavid Ahern
783f251d74SDavid Ahern	return $rc
793f251d74SDavid Ahern}
803f251d74SDavid Ahern
813f251d74SDavid Ahern################################################################################
823f251d74SDavid Ahern# create namespaces for hosts and sws
833f251d74SDavid Ahern
843f251d74SDavid Aherncreate_vrf()
853f251d74SDavid Ahern{
863f251d74SDavid Ahern	local ns=$1
873f251d74SDavid Ahern	local vrf=$2
883f251d74SDavid Ahern	local table=$3
893f251d74SDavid Ahern
903f251d74SDavid Ahern	if [ -n "${ns}" ]; then
913f251d74SDavid Ahern		ns="-netns ${ns}"
923f251d74SDavid Ahern	fi
933f251d74SDavid Ahern
943f251d74SDavid Ahern	ip ${ns} link add ${vrf} type vrf table ${table}
953f251d74SDavid Ahern	ip ${ns} link set ${vrf} up
963f251d74SDavid Ahern	ip ${ns} route add vrf ${vrf} unreachable default metric 8192
973f251d74SDavid Ahern	ip ${ns} -6 route add vrf ${vrf} unreachable default metric 8192
983f251d74SDavid Ahern
993f251d74SDavid Ahern	ip ${ns} addr add 127.0.0.1/8 dev ${vrf}
1003f251d74SDavid Ahern	ip ${ns} -6 addr add ::1 dev ${vrf} nodad
1013f251d74SDavid Ahern
1023f251d74SDavid Ahern	ip ${ns} ru del pref 0
1033f251d74SDavid Ahern	ip ${ns} ru add pref 32765 from all lookup local
1043f251d74SDavid Ahern	ip ${ns} -6 ru del pref 0
1053f251d74SDavid Ahern	ip ${ns} -6 ru add pref 32765 from all lookup local
1063f251d74SDavid Ahern}
1073f251d74SDavid Ahern
1083f251d74SDavid Aherncreate_ns()
1093f251d74SDavid Ahern{
1103f251d74SDavid Ahern	local ns=$1
1113f251d74SDavid Ahern	local addr=$2
1123f251d74SDavid Ahern	local addr6=$3
1133f251d74SDavid Ahern
1143f251d74SDavid Ahern	[ -z "${addr}" ] && addr="-"
1153f251d74SDavid Ahern	[ -z "${addr6}" ] && addr6="-"
1163f251d74SDavid Ahern
1173f251d74SDavid Ahern	if [ "${addr}" != "-" ]; then
1183f251d74SDavid Ahern		ip -netns ${ns} addr add dev lo ${addr}
1193f251d74SDavid Ahern	fi
1203f251d74SDavid Ahern	if [ "${addr6}" != "-" ]; then
1213f251d74SDavid Ahern		ip -netns ${ns} -6 addr add dev lo ${addr6}
1223f251d74SDavid Ahern	fi
1233f251d74SDavid Ahern
1243f251d74SDavid Ahern	ip -netns ${ns} ro add unreachable default metric 8192
1253f251d74SDavid Ahern	ip -netns ${ns} -6 ro add unreachable default metric 8192
1263f251d74SDavid Ahern
1273f251d74SDavid Ahern	ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1
1283f251d74SDavid Ahern	ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
1293f251d74SDavid Ahern	ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1
1303f251d74SDavid Ahern	ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1
1313f251d74SDavid Ahern	ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.accept_dad=0
1323f251d74SDavid Ahern}
1333f251d74SDavid Ahern
1343f251d74SDavid Ahern# create veth pair to connect namespaces and apply addresses.
1353f251d74SDavid Ahernconnect_ns()
1363f251d74SDavid Ahern{
1373f251d74SDavid Ahern	local ns1=$1
1383f251d74SDavid Ahern	local ns1_dev=$2
1393f251d74SDavid Ahern	local ns1_addr=$3
1403f251d74SDavid Ahern	local ns1_addr6=$4
1413f251d74SDavid Ahern	local ns2=$5
1423f251d74SDavid Ahern	local ns2_dev=$6
1433f251d74SDavid Ahern	local ns2_addr=$7
1443f251d74SDavid Ahern	local ns2_addr6=$8
1453f251d74SDavid Ahern	local ns1arg
1463f251d74SDavid Ahern	local ns2arg
1473f251d74SDavid Ahern
1483f251d74SDavid Ahern	if [ -n "${ns1}" ]; then
1493f251d74SDavid Ahern		ns1arg="-netns ${ns1}"
1503f251d74SDavid Ahern	fi
1513f251d74SDavid Ahern	if [ -n "${ns2}" ]; then
1523f251d74SDavid Ahern		ns2arg="-netns ${ns2}"
1533f251d74SDavid Ahern	fi
1543f251d74SDavid Ahern
1553f251d74SDavid Ahern	ip ${ns1arg} li add ${ns1_dev} type veth peer name tmp
1563f251d74SDavid Ahern	ip ${ns1arg} li set ${ns1_dev} up
1573f251d74SDavid Ahern	ip ${ns1arg} li set tmp netns ${ns2} name ${ns2_dev}
1583f251d74SDavid Ahern	ip ${ns2arg} li set ${ns2_dev} up
1593f251d74SDavid Ahern
1603f251d74SDavid Ahern	if [ "${ns1_addr}" != "-" ]; then
1613f251d74SDavid Ahern		ip ${ns1arg} addr add dev ${ns1_dev} ${ns1_addr}
1623f251d74SDavid Ahern		ip ${ns2arg} addr add dev ${ns2_dev} ${ns2_addr}
1633f251d74SDavid Ahern	fi
1643f251d74SDavid Ahern
1653f251d74SDavid Ahern	if [ "${ns1_addr6}" != "-" ]; then
1663f251d74SDavid Ahern		ip ${ns1arg} addr add dev ${ns1_dev} ${ns1_addr6} nodad
1673f251d74SDavid Ahern		ip ${ns2arg} addr add dev ${ns2_dev} ${ns2_addr6} nodad
1683f251d74SDavid Ahern	fi
1693f251d74SDavid Ahern}
1703f251d74SDavid Ahern
1713f251d74SDavid Ahern################################################################################
1723f251d74SDavid Ahern
1733f251d74SDavid Aherncleanup()
1743f251d74SDavid Ahern{
17561b12ebeSHangbin Liu	cleanup_ns $host1 $host2
1763f251d74SDavid Ahern}
1773f251d74SDavid Ahern
1783f251d74SDavid Ahernsetup()
1793f251d74SDavid Ahern{
18061b12ebeSHangbin Liu	setup_ns host1 host2
18161b12ebeSHangbin Liu	create_ns "$host1"
18261b12ebeSHangbin Liu	create_ns "$host2"
1833f251d74SDavid Ahern
18461b12ebeSHangbin Liu	connect_ns "$host1" eth0 ${HOST1_4}/24 ${HOST1_6}/64 \
18561b12ebeSHangbin Liu	           "$host2" eth0 ${HOST2_4}/24 ${HOST2_6}/64
1863f251d74SDavid Ahern
18761b12ebeSHangbin Liu	create_vrf "$host1" ${VRF} ${TABLE}
18861b12ebeSHangbin Liu	ip -netns $host1 link set dev eth0 master ${VRF}
1893f251d74SDavid Ahern}
1903f251d74SDavid Ahern
1913f251d74SDavid Aherncleanup_xfrm()
1923f251d74SDavid Ahern{
19361b12ebeSHangbin Liu	for ns in $host1 $host2
1943f251d74SDavid Ahern	do
1953f251d74SDavid Ahern		for x in state policy
1963f251d74SDavid Ahern		do
1973f251d74SDavid Ahern			ip -netns ${ns} xfrm ${x} flush
1983f251d74SDavid Ahern			ip -6 -netns ${ns} xfrm ${x} flush
1993f251d74SDavid Ahern		done
2003f251d74SDavid Ahern	done
2013f251d74SDavid Ahern}
2023f251d74SDavid Ahern
2033f251d74SDavid Ahernsetup_xfrm()
2043f251d74SDavid Ahern{
2053f251d74SDavid Ahern	local h1_4=$1
2063f251d74SDavid Ahern	local h2_4=$2
2073f251d74SDavid Ahern	local h1_6=$3
2083f251d74SDavid Ahern	local h2_6=$4
2093f251d74SDavid Ahern	local devarg="$5"
2103f251d74SDavid Ahern
2113f251d74SDavid Ahern	#
2123f251d74SDavid Ahern	# policy
2133f251d74SDavid Ahern	#
2143f251d74SDavid Ahern
2153f251d74SDavid Ahern	# host1 - IPv4 out
21661b12ebeSHangbin Liu	ip -netns $host1 xfrm policy add \
2173f251d74SDavid Ahern	  src ${h1_4} dst ${h2_4} ${devarg} dir out \
2183f251d74SDavid Ahern	  tmpl src ${HOST1_4} dst ${HOST2_4} proto esp mode tunnel
2193f251d74SDavid Ahern
2203f251d74SDavid Ahern	# host2 - IPv4 in
22161b12ebeSHangbin Liu	ip -netns $host2 xfrm policy add \
2223f251d74SDavid Ahern	  src ${h1_4} dst ${h2_4} dir in \
2233f251d74SDavid Ahern	  tmpl src ${HOST1_4} dst ${HOST2_4} proto esp mode tunnel
2243f251d74SDavid Ahern
2253f251d74SDavid Ahern	# host1 - IPv4 in
22661b12ebeSHangbin Liu	ip -netns $host1 xfrm policy add \
2273f251d74SDavid Ahern	  src ${h2_4} dst ${h1_4} ${devarg} dir in \
2283f251d74SDavid Ahern	  tmpl src ${HOST2_4} dst ${HOST1_4} proto esp mode tunnel
2293f251d74SDavid Ahern
2303f251d74SDavid Ahern	# host2 - IPv4 out
23161b12ebeSHangbin Liu	ip -netns $host2 xfrm policy add \
2323f251d74SDavid Ahern	  src ${h2_4} dst ${h1_4} dir out \
2333f251d74SDavid Ahern	  tmpl src ${HOST2_4} dst ${HOST1_4} proto esp mode tunnel
2343f251d74SDavid Ahern
2353f251d74SDavid Ahern
2363f251d74SDavid Ahern	# host1 - IPv6 out
23761b12ebeSHangbin Liu	ip -6 -netns $host1 xfrm policy add \
2383f251d74SDavid Ahern	  src ${h1_6} dst ${h2_6} ${devarg} dir out \
2393f251d74SDavid Ahern	  tmpl src ${HOST1_6} dst ${HOST2_6} proto esp mode tunnel
2403f251d74SDavid Ahern
2413f251d74SDavid Ahern	# host2 - IPv6 in
24261b12ebeSHangbin Liu	ip -6 -netns $host2 xfrm policy add \
2433f251d74SDavid Ahern	  src ${h1_6} dst ${h2_6} dir in \
2443f251d74SDavid Ahern	  tmpl src ${HOST1_6} dst ${HOST2_6} proto esp mode tunnel
2453f251d74SDavid Ahern
2463f251d74SDavid Ahern	# host1 - IPv6 in
24761b12ebeSHangbin Liu	ip -6 -netns $host1 xfrm policy add \
2483f251d74SDavid Ahern	  src ${h2_6} dst ${h1_6} ${devarg} dir in \
2493f251d74SDavid Ahern	  tmpl src ${HOST2_6} dst ${HOST1_6} proto esp mode tunnel
2503f251d74SDavid Ahern
2513f251d74SDavid Ahern	# host2 - IPv6 out
25261b12ebeSHangbin Liu	ip -6 -netns $host2 xfrm policy add \
2533f251d74SDavid Ahern	  src ${h2_6} dst ${h1_6} dir out \
2543f251d74SDavid Ahern	  tmpl src ${HOST2_6} dst ${HOST1_6} proto esp mode tunnel
2553f251d74SDavid Ahern
2563f251d74SDavid Ahern	#
2573f251d74SDavid Ahern	# state
2583f251d74SDavid Ahern	#
25961b12ebeSHangbin Liu	ip -netns $host1 xfrm state add src ${HOST1_4} dst ${HOST2_4} \
2603f251d74SDavid Ahern	    proto esp spi ${SPI_1} reqid 0 mode tunnel \
2613f251d74SDavid Ahern	    replay-window 4 replay-oseq 0x4 \
262cb43c60eSMagali Lemes	    auth-trunc 'hmac(sha1)' ${AUTH_1} 96 \
263cb43c60eSMagali Lemes	    enc 'cbc(aes)' ${ENC_1} \
2643f251d74SDavid Ahern	    sel src ${h1_4} dst ${h2_4} ${devarg}
2653f251d74SDavid Ahern
26661b12ebeSHangbin Liu	ip -netns $host2 xfrm state add src ${HOST1_4} dst ${HOST2_4} \
2673f251d74SDavid Ahern	    proto esp spi ${SPI_1} reqid 0 mode tunnel \
2683f251d74SDavid Ahern	    replay-window 4 replay-oseq 0x4 \
269cb43c60eSMagali Lemes	    auth-trunc 'hmac(sha1)' ${AUTH_1} 96 \
270cb43c60eSMagali Lemes	    enc 'cbc(aes)' ${ENC_1} \
2713f251d74SDavid Ahern	    sel src ${h1_4} dst ${h2_4}
2723f251d74SDavid Ahern
2733f251d74SDavid Ahern
27461b12ebeSHangbin Liu	ip -netns $host1 xfrm state add src ${HOST2_4} dst ${HOST1_4} \
2753f251d74SDavid Ahern	    proto esp spi ${SPI_2} reqid 0 mode tunnel \
2763f251d74SDavid Ahern	    replay-window 4 replay-oseq 0x4 \
277cb43c60eSMagali Lemes	    auth-trunc 'hmac(sha1)' ${AUTH_2} 96 \
278cb43c60eSMagali Lemes	    enc 'cbc(aes)' ${ENC_2} \
2793f251d74SDavid Ahern	    sel src ${h2_4} dst ${h1_4} ${devarg}
2803f251d74SDavid Ahern
28161b12ebeSHangbin Liu	ip -netns $host2 xfrm state add src ${HOST2_4} dst ${HOST1_4} \
2823f251d74SDavid Ahern	    proto esp spi ${SPI_2} reqid 0 mode tunnel \
2833f251d74SDavid Ahern	    replay-window 4 replay-oseq 0x4 \
284cb43c60eSMagali Lemes	    auth-trunc 'hmac(sha1)' ${AUTH_2} 96 \
285cb43c60eSMagali Lemes	    enc 'cbc(aes)' ${ENC_2} \
2863f251d74SDavid Ahern	    sel src ${h2_4} dst ${h1_4}
2873f251d74SDavid Ahern
2883f251d74SDavid Ahern
28961b12ebeSHangbin Liu	ip -6 -netns $host1 xfrm state add src ${HOST1_6} dst ${HOST2_6} \
2903f251d74SDavid Ahern	    proto esp spi ${SPI_1} reqid 0 mode tunnel \
2913f251d74SDavid Ahern	    replay-window 4 replay-oseq 0x4 \
292cb43c60eSMagali Lemes	    auth-trunc 'hmac(sha1)' ${AUTH_1} 96 \
293cb43c60eSMagali Lemes	    enc 'cbc(aes)' ${ENC_1} \
2943f251d74SDavid Ahern	    sel src ${h1_6} dst ${h2_6} ${devarg}
2953f251d74SDavid Ahern
29661b12ebeSHangbin Liu	ip -6 -netns $host2 xfrm state add src ${HOST1_6} dst ${HOST2_6} \
2973f251d74SDavid Ahern	    proto esp spi ${SPI_1} reqid 0 mode tunnel \
2983f251d74SDavid Ahern	    replay-window 4 replay-oseq 0x4 \
299cb43c60eSMagali Lemes	    auth-trunc 'hmac(sha1)' ${AUTH_1} 96 \
300cb43c60eSMagali Lemes	    enc 'cbc(aes)' ${ENC_1} \
3013f251d74SDavid Ahern	    sel src ${h1_6} dst ${h2_6}
3023f251d74SDavid Ahern
3033f251d74SDavid Ahern
30461b12ebeSHangbin Liu	ip -6 -netns $host1 xfrm state add src ${HOST2_6} dst ${HOST1_6} \
3053f251d74SDavid Ahern	    proto esp spi ${SPI_2} reqid 0 mode tunnel \
3063f251d74SDavid Ahern	    replay-window 4 replay-oseq 0x4 \
307cb43c60eSMagali Lemes	    auth-trunc 'hmac(sha1)' ${AUTH_2} 96 \
308cb43c60eSMagali Lemes	    enc 'cbc(aes)' ${ENC_2} \
3093f251d74SDavid Ahern	    sel src ${h2_6} dst ${h1_6} ${devarg}
3103f251d74SDavid Ahern
31161b12ebeSHangbin Liu	ip -6 -netns $host2 xfrm state add src ${HOST2_6} dst ${HOST1_6} \
3123f251d74SDavid Ahern	    proto esp spi ${SPI_2} reqid 0 mode tunnel \
3133f251d74SDavid Ahern	    replay-window 4 replay-oseq 0x4 \
314cb43c60eSMagali Lemes	    auth-trunc 'hmac(sha1)' ${AUTH_2} 96 \
315cb43c60eSMagali Lemes	    enc 'cbc(aes)' ${ENC_2} \
3163f251d74SDavid Ahern	    sel src ${h2_6} dst ${h1_6}
3173f251d74SDavid Ahern}
3183f251d74SDavid Ahern
3193f251d74SDavid Aherncleanup_xfrm_dev()
3203f251d74SDavid Ahern{
32161b12ebeSHangbin Liu	ip -netns $host1 li del xfrm0
32261b12ebeSHangbin Liu	ip -netns $host2 addr del ${XFRM2_4}/24 dev eth0
32361b12ebeSHangbin Liu	ip -netns $host2 addr del ${XFRM2_6}/64 dev eth0
3243f251d74SDavid Ahern}
3253f251d74SDavid Ahern
3263f251d74SDavid Ahernsetup_xfrm_dev()
3273f251d74SDavid Ahern{
3283f251d74SDavid Ahern	local vrfarg="vrf ${VRF}"
3293f251d74SDavid Ahern
33061b12ebeSHangbin Liu	ip -netns $host1 li add type xfrm dev eth0 if_id ${IF_ID}
33161b12ebeSHangbin Liu	ip -netns $host1 li set xfrm0 ${vrfarg} up
33261b12ebeSHangbin Liu	ip -netns $host1 addr add ${XFRM1_4}/24 dev xfrm0
33361b12ebeSHangbin Liu	ip -netns $host1 addr add ${XFRM1_6}/64 dev xfrm0
3343f251d74SDavid Ahern
33561b12ebeSHangbin Liu	ip -netns $host2 addr add ${XFRM2_4}/24 dev eth0
33661b12ebeSHangbin Liu	ip -netns $host2 addr add ${XFRM2_6}/64 dev eth0
3373f251d74SDavid Ahern
3383f251d74SDavid Ahern	setup_xfrm ${XFRM1_4} ${XFRM2_4} ${XFRM1_6} ${XFRM2_6} "if_id ${IF_ID}"
3393f251d74SDavid Ahern}
3403f251d74SDavid Ahern
3413f251d74SDavid Ahernrun_tests()
3423f251d74SDavid Ahern{
3433f251d74SDavid Ahern	cleanup_xfrm
3443f251d74SDavid Ahern
3453f251d74SDavid Ahern	# no IPsec
3463f251d74SDavid Ahern	run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4}
3473f251d74SDavid Ahern	log_test $? 0 "IPv4 no xfrm policy"
3483f251d74SDavid Ahern	run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6}
3493f251d74SDavid Ahern	log_test $? 0 "IPv6 no xfrm policy"
3503f251d74SDavid Ahern
3513f251d74SDavid Ahern	# xfrm without VRF in sel
3523f251d74SDavid Ahern	setup_xfrm ${HOST1_4} ${HOST2_4} ${HOST1_6} ${HOST2_6}
3533f251d74SDavid Ahern	run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4}
3543f251d74SDavid Ahern	log_test $? 0 "IPv4 xfrm policy based on address"
3553f251d74SDavid Ahern	run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6}
3563f251d74SDavid Ahern	log_test $? 0 "IPv6 xfrm policy based on address"
3573f251d74SDavid Ahern	cleanup_xfrm
3583f251d74SDavid Ahern
3593f251d74SDavid Ahern	# xfrm with VRF in sel
3603f251d74SDavid Ahern	# Known failure: ipv4 resets the flow oif after the lookup. Fix is
3613f251d74SDavid Ahern	# not straightforward.
3623f251d74SDavid Ahern	# setup_xfrm ${HOST1_4} ${HOST2_4} ${HOST1_6} ${HOST2_6} "dev ${VRF}"
3633f251d74SDavid Ahern	# run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4}
3643f251d74SDavid Ahern	# log_test $? 0 "IPv4 xfrm policy with VRF in selector"
3653f251d74SDavid Ahern	run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6}
3663f251d74SDavid Ahern	log_test $? 0 "IPv6 xfrm policy with VRF in selector"
3673f251d74SDavid Ahern	cleanup_xfrm
3683f251d74SDavid Ahern
3693f251d74SDavid Ahern	# xfrm with enslaved device in sel
3703f251d74SDavid Ahern	# Known failures: combined with the above, __xfrm{4,6}_selector_match
3713f251d74SDavid Ahern	# needs to consider both l3mdev and enslaved device index.
3723f251d74SDavid Ahern	# setup_xfrm ${HOST1_4} ${HOST2_4} ${HOST1_6} ${HOST2_6} "dev eth0"
3733f251d74SDavid Ahern	# run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${HOST2_4}
3743f251d74SDavid Ahern	# log_test $? 0 "IPv4 xfrm policy with enslaved device in selector"
3753f251d74SDavid Ahern	# run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${HOST2_6}
3763f251d74SDavid Ahern	# log_test $? 0 "IPv6 xfrm policy with enslaved device in selector"
3773f251d74SDavid Ahern	# cleanup_xfrm
3783f251d74SDavid Ahern
3793f251d74SDavid Ahern	# xfrm device
3803f251d74SDavid Ahern	setup_xfrm_dev
3813f251d74SDavid Ahern	run_cmd_host1 ip vrf exec ${VRF} ping -c1 -w1 ${XFRM2_4}
3823f251d74SDavid Ahern	log_test $? 0 "IPv4 xfrm policy with xfrm device"
3833f251d74SDavid Ahern	run_cmd_host1 ip vrf exec ${VRF} ${ping6} -c1 -w1 ${XFRM2_6}
3843f251d74SDavid Ahern	log_test $? 0 "IPv6 xfrm policy with xfrm device"
3853f251d74SDavid Ahern	cleanup_xfrm_dev
3863f251d74SDavid Ahern}
3873f251d74SDavid Ahern
3883f251d74SDavid Ahern################################################################################
3893f251d74SDavid Ahern# usage
3903f251d74SDavid Ahern
3913f251d74SDavid Ahernusage()
3923f251d74SDavid Ahern{
3933f251d74SDavid Ahern        cat <<EOF
3943f251d74SDavid Ahernusage: ${0##*/} OPTS
3953f251d74SDavid Ahern
3963f251d74SDavid Ahern        -p          Pause on fail
3973f251d74SDavid Ahern        -v          verbose mode (show commands and output)
3983f251d74SDavid Ahern
3993f251d74SDavid Aherndone
4003f251d74SDavid AhernEOF
4013f251d74SDavid Ahern}
4023f251d74SDavid Ahern
4033f251d74SDavid Ahern################################################################################
4043f251d74SDavid Ahern# main
4053f251d74SDavid Ahern
4063f251d74SDavid Ahernwhile getopts :pv o
4073f251d74SDavid Aherndo
4083f251d74SDavid Ahern	case $o in
4093f251d74SDavid Ahern		p) PAUSE_ON_FAIL=yes;;
4103f251d74SDavid Ahern		v) VERBOSE=$(($VERBOSE + 1));;
4113f251d74SDavid Ahern		h) usage; exit 0;;
4123f251d74SDavid Ahern		*) usage; exit 1;;
4133f251d74SDavid Ahern	esac
4143f251d74SDavid Aherndone
4153f251d74SDavid Ahern
4163f251d74SDavid Aherncleanup 2>/dev/null
4173f251d74SDavid Ahernsetup
4183f251d74SDavid Ahern
4193f251d74SDavid Ahernecho
4203f251d74SDavid Ahernecho "No qdisc on VRF device"
4213f251d74SDavid Ahernrun_tests
4223f251d74SDavid Ahern
4233f251d74SDavid Ahernrun_cmd_host1 tc qdisc add dev ${VRF} root netem delay 100ms
4243f251d74SDavid Ahernecho
4253f251d74SDavid Ahernecho "netem qdisc on VRF device"
4263f251d74SDavid Ahernrun_tests
4273f251d74SDavid Ahern
4283f251d74SDavid Ahernprintf "\nTests passed: %3d\n" ${nsuccess}
4293f251d74SDavid Ahernprintf "Tests failed: %3d\n"   ${nfail}
4303f251d74SDavid Ahern
4313f251d74SDavid Ahernexit $ret
432