xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/net/l2tp.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker#!/bin/bash
2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
3*053f45beSAndroid Build Coastguard Worker#
4*053f45beSAndroid Build Coastguard Worker# L2TPv3 tunnel between 2 hosts
5*053f45beSAndroid Build Coastguard Worker#
6*053f45beSAndroid Build Coastguard Worker#            host-1          |   router   |     host-2
7*053f45beSAndroid Build Coastguard Worker#                            |            |
8*053f45beSAndroid Build Coastguard Worker#      lo          l2tp      |            |      l2tp           lo
9*053f45beSAndroid Build Coastguard Worker# 172.16.101.1  172.16.1.1   |            | 172.16.1.2    172.16.101.2
10*053f45beSAndroid Build Coastguard Worker#  fc00:101::1   fc00:1::1   |            |   fc00:1::2    fc00:101::2
11*053f45beSAndroid Build Coastguard Worker#                            |            |
12*053f45beSAndroid Build Coastguard Worker#                  eth0      |            |     eth0
13*053f45beSAndroid Build Coastguard Worker#                10.1.1.1    |            |   10.1.2.1
14*053f45beSAndroid Build Coastguard Worker#              2001:db8:1::1 |            | 2001:db8:2::1
15*053f45beSAndroid Build Coastguard Worker
16*053f45beSAndroid Build Coastguard WorkerVERBOSE=0
17*053f45beSAndroid Build Coastguard WorkerPAUSE_ON_FAIL=no
18*053f45beSAndroid Build Coastguard Worker
19*053f45beSAndroid Build Coastguard Workerwhich ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping)
20*053f45beSAndroid Build Coastguard Worker
21*053f45beSAndroid Build Coastguard Worker################################################################################
22*053f45beSAndroid Build Coastguard Worker#
23*053f45beSAndroid Build Coastguard Workerlog_test()
24*053f45beSAndroid Build Coastguard Worker{
25*053f45beSAndroid Build Coastguard Worker	local rc=$1
26*053f45beSAndroid Build Coastguard Worker	local expected=$2
27*053f45beSAndroid Build Coastguard Worker	local msg="$3"
28*053f45beSAndroid Build Coastguard Worker
29*053f45beSAndroid Build Coastguard Worker	if [ ${rc} -eq ${expected} ]; then
30*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [ OK ]\n" "${msg}"
31*053f45beSAndroid Build Coastguard Worker		nsuccess=$((nsuccess+1))
32*053f45beSAndroid Build Coastguard Worker	else
33*053f45beSAndroid Build Coastguard Worker		ret=1
34*053f45beSAndroid Build Coastguard Worker		nfail=$((nfail+1))
35*053f45beSAndroid Build Coastguard Worker		printf "TEST: %-60s  [FAIL]\n" "${msg}"
36*053f45beSAndroid Build Coastguard Worker		if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
37*053f45beSAndroid Build Coastguard Worker			echo
38*053f45beSAndroid Build Coastguard Worker			echo "hit enter to continue, 'q' to quit"
39*053f45beSAndroid Build Coastguard Worker			read a
40*053f45beSAndroid Build Coastguard Worker			[ "$a" = "q" ] && exit 1
41*053f45beSAndroid Build Coastguard Worker		fi
42*053f45beSAndroid Build Coastguard Worker	fi
43*053f45beSAndroid Build Coastguard Worker}
44*053f45beSAndroid Build Coastguard Worker
45*053f45beSAndroid Build Coastguard Workerrun_cmd()
46*053f45beSAndroid Build Coastguard Worker{
47*053f45beSAndroid Build Coastguard Worker	local ns
48*053f45beSAndroid Build Coastguard Worker	local cmd
49*053f45beSAndroid Build Coastguard Worker	local out
50*053f45beSAndroid Build Coastguard Worker	local rc
51*053f45beSAndroid Build Coastguard Worker
52*053f45beSAndroid Build Coastguard Worker	ns="$1"
53*053f45beSAndroid Build Coastguard Worker	shift
54*053f45beSAndroid Build Coastguard Worker	cmd="$*"
55*053f45beSAndroid Build Coastguard Worker
56*053f45beSAndroid Build Coastguard Worker	if [ "$VERBOSE" = "1" ]; then
57*053f45beSAndroid Build Coastguard Worker		printf "    COMMAND: $cmd\n"
58*053f45beSAndroid Build Coastguard Worker	fi
59*053f45beSAndroid Build Coastguard Worker
60*053f45beSAndroid Build Coastguard Worker	out=$(eval ip netns exec ${ns} ${cmd} 2>&1)
61*053f45beSAndroid Build Coastguard Worker	rc=$?
62*053f45beSAndroid Build Coastguard Worker	if [ "$VERBOSE" = "1" -a -n "$out" ]; then
63*053f45beSAndroid Build Coastguard Worker		echo "    $out"
64*053f45beSAndroid Build Coastguard Worker	fi
65*053f45beSAndroid Build Coastguard Worker
66*053f45beSAndroid Build Coastguard Worker	[ "$VERBOSE" = "1" ] && echo
67*053f45beSAndroid Build Coastguard Worker
68*053f45beSAndroid Build Coastguard Worker	return $rc
69*053f45beSAndroid Build Coastguard Worker}
70*053f45beSAndroid Build Coastguard Worker
71*053f45beSAndroid Build Coastguard Worker################################################################################
72*053f45beSAndroid Build Coastguard Worker# create namespaces and interconnects
73*053f45beSAndroid Build Coastguard Worker
74*053f45beSAndroid Build Coastguard Workercreate_ns()
75*053f45beSAndroid Build Coastguard Worker{
76*053f45beSAndroid Build Coastguard Worker	local ns=$1
77*053f45beSAndroid Build Coastguard Worker	local addr=$2
78*053f45beSAndroid Build Coastguard Worker	local addr6=$3
79*053f45beSAndroid Build Coastguard Worker
80*053f45beSAndroid Build Coastguard Worker	[ -z "${addr}" ] && addr="-"
81*053f45beSAndroid Build Coastguard Worker	[ -z "${addr6}" ] && addr6="-"
82*053f45beSAndroid Build Coastguard Worker
83*053f45beSAndroid Build Coastguard Worker	ip netns add ${ns}
84*053f45beSAndroid Build Coastguard Worker
85*053f45beSAndroid Build Coastguard Worker	ip -netns ${ns} link set lo up
86*053f45beSAndroid Build Coastguard Worker	if [ "${addr}" != "-" ]; then
87*053f45beSAndroid Build Coastguard Worker		ip -netns ${ns} addr add dev lo ${addr}
88*053f45beSAndroid Build Coastguard Worker	fi
89*053f45beSAndroid Build Coastguard Worker	if [ "${addr6}" != "-" ]; then
90*053f45beSAndroid Build Coastguard Worker		ip -netns ${ns} -6 addr add dev lo ${addr6}
91*053f45beSAndroid Build Coastguard Worker	fi
92*053f45beSAndroid Build Coastguard Worker
93*053f45beSAndroid Build Coastguard Worker	ip -netns ${ns} ro add unreachable default metric 8192
94*053f45beSAndroid Build Coastguard Worker	ip -netns ${ns} -6 ro add unreachable default metric 8192
95*053f45beSAndroid Build Coastguard Worker
96*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1
97*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
98*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1
99*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1
100*053f45beSAndroid Build Coastguard Worker	ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.accept_dad=0
101*053f45beSAndroid Build Coastguard Worker}
102*053f45beSAndroid Build Coastguard Worker
103*053f45beSAndroid Build Coastguard Worker# create veth pair to connect namespaces and apply addresses.
104*053f45beSAndroid Build Coastguard Workerconnect_ns()
105*053f45beSAndroid Build Coastguard Worker{
106*053f45beSAndroid Build Coastguard Worker	local ns1=$1
107*053f45beSAndroid Build Coastguard Worker	local ns1_dev=$2
108*053f45beSAndroid Build Coastguard Worker	local ns1_addr=$3
109*053f45beSAndroid Build Coastguard Worker	local ns1_addr6=$4
110*053f45beSAndroid Build Coastguard Worker	local ns2=$5
111*053f45beSAndroid Build Coastguard Worker	local ns2_dev=$6
112*053f45beSAndroid Build Coastguard Worker	local ns2_addr=$7
113*053f45beSAndroid Build Coastguard Worker	local ns2_addr6=$8
114*053f45beSAndroid Build Coastguard Worker
115*053f45beSAndroid Build Coastguard Worker	ip -netns ${ns1} li add ${ns1_dev} type veth peer name tmp
116*053f45beSAndroid Build Coastguard Worker	ip -netns ${ns1} li set ${ns1_dev} up
117*053f45beSAndroid Build Coastguard Worker	ip -netns ${ns1} li set tmp netns ${ns2} name ${ns2_dev}
118*053f45beSAndroid Build Coastguard Worker	ip -netns ${ns2} li set ${ns2_dev} up
119*053f45beSAndroid Build Coastguard Worker
120*053f45beSAndroid Build Coastguard Worker	if [ "${ns1_addr}" != "-" ]; then
121*053f45beSAndroid Build Coastguard Worker		ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr}
122*053f45beSAndroid Build Coastguard Worker		ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr}
123*053f45beSAndroid Build Coastguard Worker	fi
124*053f45beSAndroid Build Coastguard Worker
125*053f45beSAndroid Build Coastguard Worker	if [ "${ns1_addr6}" != "-" ]; then
126*053f45beSAndroid Build Coastguard Worker		ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr6}
127*053f45beSAndroid Build Coastguard Worker		ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr6}
128*053f45beSAndroid Build Coastguard Worker	fi
129*053f45beSAndroid Build Coastguard Worker}
130*053f45beSAndroid Build Coastguard Worker
131*053f45beSAndroid Build Coastguard Worker################################################################################
132*053f45beSAndroid Build Coastguard Worker# test setup
133*053f45beSAndroid Build Coastguard Worker
134*053f45beSAndroid Build Coastguard Workercleanup()
135*053f45beSAndroid Build Coastguard Worker{
136*053f45beSAndroid Build Coastguard Worker	local ns
137*053f45beSAndroid Build Coastguard Worker
138*053f45beSAndroid Build Coastguard Worker	for ns in host-1 host-2 router
139*053f45beSAndroid Build Coastguard Worker	do
140*053f45beSAndroid Build Coastguard Worker		ip netns del ${ns} 2>/dev/null
141*053f45beSAndroid Build Coastguard Worker	done
142*053f45beSAndroid Build Coastguard Worker}
143*053f45beSAndroid Build Coastguard Worker
144*053f45beSAndroid Build Coastguard Workersetup_l2tp_ipv4()
145*053f45beSAndroid Build Coastguard Worker{
146*053f45beSAndroid Build Coastguard Worker	#
147*053f45beSAndroid Build Coastguard Worker	# configure l2tpv3 tunnel on host-1
148*053f45beSAndroid Build Coastguard Worker	#
149*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 l2tp add tunnel tunnel_id 1041 peer_tunnel_id 1042 \
150*053f45beSAndroid Build Coastguard Worker			 encap ip local 10.1.1.1 remote 10.1.2.1
151*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 l2tp add session name l2tp4 tunnel_id 1041 \
152*053f45beSAndroid Build Coastguard Worker			 session_id 1041 peer_session_id 1042
153*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 link set dev l2tp4 up
154*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 addr add dev l2tp4 172.16.1.1 peer 172.16.1.2
155*053f45beSAndroid Build Coastguard Worker
156*053f45beSAndroid Build Coastguard Worker	#
157*053f45beSAndroid Build Coastguard Worker	# configure l2tpv3 tunnel on host-2
158*053f45beSAndroid Build Coastguard Worker	#
159*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 l2tp add tunnel tunnel_id 1042 peer_tunnel_id 1041 \
160*053f45beSAndroid Build Coastguard Worker			 encap ip local 10.1.2.1 remote 10.1.1.1
161*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 l2tp add session name l2tp4 tunnel_id 1042 \
162*053f45beSAndroid Build Coastguard Worker			 session_id 1042 peer_session_id 1041
163*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 link set dev l2tp4 up
164*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 addr add dev l2tp4 172.16.1.2 peer 172.16.1.1
165*053f45beSAndroid Build Coastguard Worker
166*053f45beSAndroid Build Coastguard Worker	#
167*053f45beSAndroid Build Coastguard Worker	# add routes to loopback addresses
168*053f45beSAndroid Build Coastguard Worker	#
169*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 ro add 172.16.101.2/32 via 172.16.1.2
170*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 ro add 172.16.101.1/32 via 172.16.1.1
171*053f45beSAndroid Build Coastguard Worker}
172*053f45beSAndroid Build Coastguard Worker
173*053f45beSAndroid Build Coastguard Workersetup_l2tp_ipv6()
174*053f45beSAndroid Build Coastguard Worker{
175*053f45beSAndroid Build Coastguard Worker	#
176*053f45beSAndroid Build Coastguard Worker	# configure l2tpv3 tunnel on host-1
177*053f45beSAndroid Build Coastguard Worker	#
178*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 l2tp add tunnel tunnel_id 1061 peer_tunnel_id 1062 \
179*053f45beSAndroid Build Coastguard Worker			 encap ip local 2001:db8:1::1 remote 2001:db8:2::1
180*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 l2tp add session name l2tp6 tunnel_id 1061 \
181*053f45beSAndroid Build Coastguard Worker			 session_id 1061 peer_session_id 1062
182*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 link set dev l2tp6 up
183*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 addr add dev l2tp6 fc00:1::1 peer fc00:1::2
184*053f45beSAndroid Build Coastguard Worker
185*053f45beSAndroid Build Coastguard Worker	#
186*053f45beSAndroid Build Coastguard Worker	# configure l2tpv3 tunnel on host-2
187*053f45beSAndroid Build Coastguard Worker	#
188*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 l2tp add tunnel tunnel_id 1062 peer_tunnel_id 1061 \
189*053f45beSAndroid Build Coastguard Worker			 encap ip local 2001:db8:2::1 remote 2001:db8:1::1
190*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 l2tp add session name l2tp6 tunnel_id 1062 \
191*053f45beSAndroid Build Coastguard Worker			 session_id 1062 peer_session_id 1061
192*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 link set dev l2tp6 up
193*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 addr add dev l2tp6 fc00:1::2 peer fc00:1::1
194*053f45beSAndroid Build Coastguard Worker
195*053f45beSAndroid Build Coastguard Worker	#
196*053f45beSAndroid Build Coastguard Worker	# add routes to loopback addresses
197*053f45beSAndroid Build Coastguard Worker	#
198*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 -6 ro add fc00:101::2/128 via fc00:1::2
199*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 -6 ro add fc00:101::1/128 via fc00:1::1
200*053f45beSAndroid Build Coastguard Worker}
201*053f45beSAndroid Build Coastguard Worker
202*053f45beSAndroid Build Coastguard Workersetup()
203*053f45beSAndroid Build Coastguard Worker{
204*053f45beSAndroid Build Coastguard Worker	# start clean
205*053f45beSAndroid Build Coastguard Worker	cleanup
206*053f45beSAndroid Build Coastguard Worker
207*053f45beSAndroid Build Coastguard Worker	set -e
208*053f45beSAndroid Build Coastguard Worker	create_ns host-1 172.16.101.1/32 fc00:101::1/128
209*053f45beSAndroid Build Coastguard Worker	create_ns host-2 172.16.101.2/32 fc00:101::2/128
210*053f45beSAndroid Build Coastguard Worker	create_ns router
211*053f45beSAndroid Build Coastguard Worker
212*053f45beSAndroid Build Coastguard Worker	connect_ns host-1 eth0 10.1.1.1/24 2001:db8:1::1/64 \
213*053f45beSAndroid Build Coastguard Worker	           router eth1 10.1.1.2/24 2001:db8:1::2/64
214*053f45beSAndroid Build Coastguard Worker
215*053f45beSAndroid Build Coastguard Worker	connect_ns host-2 eth0 10.1.2.1/24 2001:db8:2::1/64 \
216*053f45beSAndroid Build Coastguard Worker	           router eth2 10.1.2.2/24 2001:db8:2::2/64
217*053f45beSAndroid Build Coastguard Worker
218*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 ro add 10.1.2.0/24 via 10.1.1.2
219*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 -6 ro add 2001:db8:2::/64 via 2001:db8:1::2
220*053f45beSAndroid Build Coastguard Worker
221*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 ro add 10.1.1.0/24 via 10.1.2.2
222*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 -6 ro add 2001:db8:1::/64 via 2001:db8:2::2
223*053f45beSAndroid Build Coastguard Worker
224*053f45beSAndroid Build Coastguard Worker	setup_l2tp_ipv4
225*053f45beSAndroid Build Coastguard Worker	setup_l2tp_ipv6
226*053f45beSAndroid Build Coastguard Worker	set +e
227*053f45beSAndroid Build Coastguard Worker}
228*053f45beSAndroid Build Coastguard Worker
229*053f45beSAndroid Build Coastguard Workersetup_ipsec()
230*053f45beSAndroid Build Coastguard Worker{
231*053f45beSAndroid Build Coastguard Worker	#
232*053f45beSAndroid Build Coastguard Worker	# IPv4
233*053f45beSAndroid Build Coastguard Worker	#
234*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ip xfrm policy add \
235*053f45beSAndroid Build Coastguard Worker		src 10.1.1.1 dst 10.1.2.1 dir out \
236*053f45beSAndroid Build Coastguard Worker		tmpl proto esp mode transport
237*053f45beSAndroid Build Coastguard Worker
238*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ip xfrm policy add \
239*053f45beSAndroid Build Coastguard Worker		src 10.1.2.1 dst 10.1.1.1 dir in \
240*053f45beSAndroid Build Coastguard Worker		tmpl proto esp mode transport
241*053f45beSAndroid Build Coastguard Worker
242*053f45beSAndroid Build Coastguard Worker	run_cmd host-2 ip xfrm policy add \
243*053f45beSAndroid Build Coastguard Worker		src 10.1.1.1 dst 10.1.2.1 dir in \
244*053f45beSAndroid Build Coastguard Worker		tmpl proto esp mode transport
245*053f45beSAndroid Build Coastguard Worker
246*053f45beSAndroid Build Coastguard Worker	run_cmd host-2 ip xfrm policy add \
247*053f45beSAndroid Build Coastguard Worker		src 10.1.2.1 dst 10.1.1.1 dir out \
248*053f45beSAndroid Build Coastguard Worker		tmpl proto esp mode transport
249*053f45beSAndroid Build Coastguard Worker
250*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 xfrm state add \
251*053f45beSAndroid Build Coastguard Worker		src 10.1.1.1 dst 10.1.2.1 \
252*053f45beSAndroid Build Coastguard Worker		spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \
253*053f45beSAndroid Build Coastguard Worker		0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
254*053f45beSAndroid Build Coastguard Worker
255*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 xfrm state add \
256*053f45beSAndroid Build Coastguard Worker		src 10.1.2.1 dst 10.1.1.1 \
257*053f45beSAndroid Build Coastguard Worker		spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \
258*053f45beSAndroid Build Coastguard Worker		0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
259*053f45beSAndroid Build Coastguard Worker
260*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 xfrm state add \
261*053f45beSAndroid Build Coastguard Worker		src 10.1.1.1 dst 10.1.2.1 \
262*053f45beSAndroid Build Coastguard Worker		spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \
263*053f45beSAndroid Build Coastguard Worker		0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
264*053f45beSAndroid Build Coastguard Worker
265*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 xfrm state add \
266*053f45beSAndroid Build Coastguard Worker		src 10.1.2.1 dst 10.1.1.1 \
267*053f45beSAndroid Build Coastguard Worker		spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \
268*053f45beSAndroid Build Coastguard Worker		0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
269*053f45beSAndroid Build Coastguard Worker
270*053f45beSAndroid Build Coastguard Worker	#
271*053f45beSAndroid Build Coastguard Worker	# IPV6
272*053f45beSAndroid Build Coastguard Worker	#
273*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ip -6 xfrm policy add \
274*053f45beSAndroid Build Coastguard Worker		src 2001:db8:1::1 dst 2001:db8:2::1 dir out \
275*053f45beSAndroid Build Coastguard Worker		tmpl proto esp mode transport
276*053f45beSAndroid Build Coastguard Worker
277*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ip -6 xfrm policy add \
278*053f45beSAndroid Build Coastguard Worker		src 2001:db8:2::1 dst 2001:db8:1::1 dir in \
279*053f45beSAndroid Build Coastguard Worker		tmpl proto esp mode transport
280*053f45beSAndroid Build Coastguard Worker
281*053f45beSAndroid Build Coastguard Worker	run_cmd host-2 ip -6 xfrm policy add \
282*053f45beSAndroid Build Coastguard Worker		src 2001:db8:1::1 dst 2001:db8:2::1 dir in \
283*053f45beSAndroid Build Coastguard Worker		tmpl proto esp mode transport
284*053f45beSAndroid Build Coastguard Worker
285*053f45beSAndroid Build Coastguard Worker	run_cmd host-2 ip -6 xfrm policy add \
286*053f45beSAndroid Build Coastguard Worker		src 2001:db8:2::1 dst 2001:db8:1::1 dir out \
287*053f45beSAndroid Build Coastguard Worker		tmpl proto esp mode transport
288*053f45beSAndroid Build Coastguard Worker
289*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 -6 xfrm state add \
290*053f45beSAndroid Build Coastguard Worker		src 2001:db8:1::1 dst 2001:db8:2::1 \
291*053f45beSAndroid Build Coastguard Worker		spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \
292*053f45beSAndroid Build Coastguard Worker		0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
293*053f45beSAndroid Build Coastguard Worker
294*053f45beSAndroid Build Coastguard Worker	ip -netns host-1 -6 xfrm state add \
295*053f45beSAndroid Build Coastguard Worker		src 2001:db8:2::1 dst 2001:db8:1::1 \
296*053f45beSAndroid Build Coastguard Worker		spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \
297*053f45beSAndroid Build Coastguard Worker		0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
298*053f45beSAndroid Build Coastguard Worker
299*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 -6 xfrm state add \
300*053f45beSAndroid Build Coastguard Worker		src 2001:db8:1::1 dst 2001:db8:2::1 \
301*053f45beSAndroid Build Coastguard Worker		spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \
302*053f45beSAndroid Build Coastguard Worker		0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
303*053f45beSAndroid Build Coastguard Worker
304*053f45beSAndroid Build Coastguard Worker	ip -netns host-2 -6 xfrm state add \
305*053f45beSAndroid Build Coastguard Worker		src 2001:db8:2::1 dst 2001:db8:1::1 \
306*053f45beSAndroid Build Coastguard Worker		spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \
307*053f45beSAndroid Build Coastguard Worker		0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
308*053f45beSAndroid Build Coastguard Worker}
309*053f45beSAndroid Build Coastguard Worker
310*053f45beSAndroid Build Coastguard Workerteardown_ipsec()
311*053f45beSAndroid Build Coastguard Worker{
312*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ip xfrm state flush
313*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ip xfrm policy flush
314*053f45beSAndroid Build Coastguard Worker	run_cmd host-2 ip xfrm state flush
315*053f45beSAndroid Build Coastguard Worker	run_cmd host-2 ip xfrm policy flush
316*053f45beSAndroid Build Coastguard Worker}
317*053f45beSAndroid Build Coastguard Worker
318*053f45beSAndroid Build Coastguard Worker################################################################################
319*053f45beSAndroid Build Coastguard Worker# generate traffic through tunnel for various cases
320*053f45beSAndroid Build Coastguard Worker
321*053f45beSAndroid Build Coastguard Workerrun_ping()
322*053f45beSAndroid Build Coastguard Worker{
323*053f45beSAndroid Build Coastguard Worker	local desc="$1"
324*053f45beSAndroid Build Coastguard Worker
325*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ping -c1 -w1 172.16.1.2
326*053f45beSAndroid Build Coastguard Worker	log_test $? 0 "IPv4 basic L2TP tunnel ${desc}"
327*053f45beSAndroid Build Coastguard Worker
328*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ping -c1 -w1 -I 172.16.101.1 172.16.101.2
329*053f45beSAndroid Build Coastguard Worker	log_test $? 0 "IPv4 route through L2TP tunnel ${desc}"
330*053f45beSAndroid Build Coastguard Worker
331*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ${ping6} -c1 -w1 fc00:1::2
332*053f45beSAndroid Build Coastguard Worker	log_test $? 0 "IPv6 basic L2TP tunnel ${desc}"
333*053f45beSAndroid Build Coastguard Worker
334*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ${ping6} -c1 -w1 -I fc00:101::1 fc00:101::2
335*053f45beSAndroid Build Coastguard Worker	log_test $? 0 "IPv6 route through L2TP tunnel ${desc}"
336*053f45beSAndroid Build Coastguard Worker}
337*053f45beSAndroid Build Coastguard Worker
338*053f45beSAndroid Build Coastguard Workerrun_tests()
339*053f45beSAndroid Build Coastguard Worker{
340*053f45beSAndroid Build Coastguard Worker	local desc
341*053f45beSAndroid Build Coastguard Worker
342*053f45beSAndroid Build Coastguard Worker	setup
343*053f45beSAndroid Build Coastguard Worker	run_ping
344*053f45beSAndroid Build Coastguard Worker
345*053f45beSAndroid Build Coastguard Worker	setup_ipsec
346*053f45beSAndroid Build Coastguard Worker	run_ping "- with IPsec"
347*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ping -c1 -w1 172.16.1.2
348*053f45beSAndroid Build Coastguard Worker	log_test $? 0 "IPv4 basic L2TP tunnel ${desc}"
349*053f45beSAndroid Build Coastguard Worker
350*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ping -c1 -w1 -I 172.16.101.1 172.16.101.2
351*053f45beSAndroid Build Coastguard Worker	log_test $? 0 "IPv4 route through L2TP tunnel ${desc}"
352*053f45beSAndroid Build Coastguard Worker
353*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ${ping6} -c1 -w1 fc00:1::2
354*053f45beSAndroid Build Coastguard Worker	log_test $? 0 "IPv6 basic L2TP tunnel - with IPsec"
355*053f45beSAndroid Build Coastguard Worker
356*053f45beSAndroid Build Coastguard Worker	run_cmd host-1 ${ping6} -c1 -w1 -I fc00:101::1 fc00:101::2
357*053f45beSAndroid Build Coastguard Worker	log_test $? 0 "IPv6 route through L2TP tunnel - with IPsec"
358*053f45beSAndroid Build Coastguard Worker
359*053f45beSAndroid Build Coastguard Worker	teardown_ipsec
360*053f45beSAndroid Build Coastguard Worker	run_ping "- after IPsec teardown"
361*053f45beSAndroid Build Coastguard Worker}
362*053f45beSAndroid Build Coastguard Worker
363*053f45beSAndroid Build Coastguard Worker################################################################################
364*053f45beSAndroid Build Coastguard Worker# main
365*053f45beSAndroid Build Coastguard Worker
366*053f45beSAndroid Build Coastguard Workerdeclare -i nfail=0
367*053f45beSAndroid Build Coastguard Workerdeclare -i nsuccess=0
368*053f45beSAndroid Build Coastguard Worker
369*053f45beSAndroid Build Coastguard Workerwhile getopts :pv o
370*053f45beSAndroid Build Coastguard Workerdo
371*053f45beSAndroid Build Coastguard Worker	case $o in
372*053f45beSAndroid Build Coastguard Worker		p) PAUSE_ON_FAIL=yes;;
373*053f45beSAndroid Build Coastguard Worker		v) VERBOSE=$(($VERBOSE + 1));;
374*053f45beSAndroid Build Coastguard Worker		*) exit 1;;
375*053f45beSAndroid Build Coastguard Worker	esac
376*053f45beSAndroid Build Coastguard Workerdone
377*053f45beSAndroid Build Coastguard Worker
378*053f45beSAndroid Build Coastguard Workerrun_tests
379*053f45beSAndroid Build Coastguard Workercleanup
380*053f45beSAndroid Build Coastguard Worker
381*053f45beSAndroid Build Coastguard Workerprintf "\nTests passed: %3d\n" ${nsuccess}
382*053f45beSAndroid Build Coastguard Workerprintf "Tests failed: %3d\n"   ${nfail}
383