xref: /netbsd-src/tests/net/if_l2tp/t_l2tp.sh (revision ce0ae1dfed2d6b9a7a859c9f194fcbdca575f123)
1#	$NetBSD: t_l2tp.sh,v 1.5 2019/08/19 03:22:05 ozaki-r Exp $
2#
3# Copyright (c) 2017 Internet Initiative Japan Inc.
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25# POSSIBILITY OF SUCH DAMAGE.
26#
27
28LAC1SOCK=unix://commsock1
29LAC2SOCK=unix://commsock2
30CLIENT1SOCK=unix://commsock3
31CLIENT2SOCK=unix://commsock4
32
33WAN_LINK=bus0
34LAC1_LAN_LINK=bus1
35LAC2_LAN_LINK=bus2
36
37LAC1_WANIP=10.0.0.1
38LAC1_SESSION=1234
39CLIENT1_LANIP=192.168.1.1
40LAC2_WANIP=10.0.0.2
41LAC2_SESSION=4321
42CLIENT2_LANIP=192.168.1.2
43
44LAC1_WANIP6=fc00::1
45CLIENT1_LANIP6=fc00:1::1
46LAC2_WANIP6=fc00::2
47CLIENT2_LANIP6=fc00:1::2
48
49TIMEOUT=5
50DEBUG=${DEBUG:-false}
51
52atf_test_case l2tp_create_destroy cleanup
53l2tp_create_destroy_head()
54{
55
56	atf_set "descr" "Test creating/destroying l2tp interfaces"
57	atf_set "require.progs" "rump_server"
58}
59
60l2tp_create_destroy_body()
61{
62
63	rump_server_start $LAC1SOCK l2tp
64
65	test_create_destroy_common $LAC1SOCK l2tp0
66}
67
68l2tp_create_destroy_cleanup()
69{
70
71	$DEBUG && dump
72	cleanup
73}
74
75setup_lac()
76{
77	sock=${1}
78	lanlink=${2}
79	wan=${3}
80	wan_mode=${4}
81
82
83	rump_server_add_iface ${sock} shmif0 ${lanlink}
84	rump_server_add_iface ${sock} shmif1 ${WAN_LINK}
85
86	export RUMP_SERVER=${sock}
87
88	if [ ${wan_mode} = "ipv6" ]; then
89		atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${wan}
90	else
91		atf_check -s exit:0 rump.ifconfig shmif1 inet ${wan} netmask 0xff000000
92	fi
93	atf_check -s exit:0 rump.ifconfig shmif0 up
94	atf_check -s exit:0 rump.ifconfig shmif1 up
95
96	unset RUMP_SERVER
97}
98
99test_lac()
100{
101	sock=${1}
102	wan=${2}
103	wan_mode=${3}
104
105	export RUMP_SERVER=${sock}
106
107	atf_check -s exit:0 -o match:shmif0 rump.ifconfig
108	atf_check -s exit:0 -o match:shmif1 rump.ifconfig
109	if [ ${wan_mode} = "ipv6" ]; then
110		atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${wan}
111	else
112		atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${wan}
113	fi
114
115	unset RUMP_SERVER
116}
117
118setup_client()
119{
120	sock=${1}
121	lanlink=${2}
122	lan=${3}
123	lan_mode=${4}
124
125	rump_server_add_iface ${sock} shmif0 ${lanlink}
126
127	export RUMP_SERVER=${sock}
128	if [ ${lan_mode} = "ipv6" ]; then
129		atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${lan}
130	else
131		atf_check -s exit:0 rump.ifconfig shmif0 inet ${lan} netmask 0xffffff00
132	fi
133	atf_check -s exit:0 rump.ifconfig shmif0 up
134
135	unset RUMP_SERVER
136}
137
138test_client()
139{
140	sock=${1}
141	lan=${2}
142	lan_mode=${3}
143
144	export RUMP_SERVER=${sock}
145
146	atf_check -s exit:0 -o match:shmif0 rump.ifconfig
147	if [ ${lan_mode} = "ipv6" ]; then
148		atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lan}
149	else
150		atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lan}
151	fi
152
153	unset RUMP_SERVER
154}
155
156setup()
157{
158	lan_mode=${1}
159	wan_mode=${2}
160
161	rump_server_start $LAC1SOCK netinet6 bridge l2tp
162	rump_server_start $LAC2SOCK netinet6 bridge l2tp
163	rump_server_start $CLIENT1SOCK netinet6 bridge l2tp
164	rump_server_start $CLIENT2SOCK netinet6 bridge l2tp
165
166	client1_lan=""
167	client2_lan=""
168	if [ ${lan_mode} = "ipv6" ]; then
169		client1_lan=${CLIENT1_LANIP6}
170		client2_lan=${CLIENT2_LANIP6}
171	else
172		client1_lan=${CLIENT1_LANIP}
173		client2_lan=${CLIENT2_LANIP}
174	fi
175
176	if [ ${wan_mode} = "ipv6" ]; then
177		setup_lac $LAC1SOCK $LAC1_LAN_LINK $LAC1_WANIP6 ${wan_mode}
178		setup_lac $LAC2SOCK $LAC2_LAN_LINK $LAC2_WANIP6 ${wan_mode}
179		setup_client $CLIENT1SOCK $LAC1_LAN_LINK \
180			     ${client1_lan} ${lan_mode}
181		setup_client $CLIENT2SOCK $LAC2_LAN_LINK \
182			     ${client2_lan} ${lan_mode}
183	else
184		setup_lac $LAC1SOCK $LAC1_LAN_LINK $LAC1_WANIP ${wan_mode}
185		setup_lac $LAC2SOCK $LAC2_LAN_LINK $LAC2_WANIP ${wan_mode}
186		setup_client $CLIENT1SOCK $LAC1_LAN_LINK \
187			     ${client1_lan} ${lan_mode}
188		setup_client $CLIENT2SOCK $LAC2_LAN_LINK \
189			     ${client2_lan} ${lan_mode}
190	fi
191}
192
193test_setup()
194{
195	lan_mode=${1}
196	wan_mode=${2}
197
198	client1_lan=""
199	client2_lan=""
200	if [ ${lan_mode} = "ipv6" ]; then
201		client1_lan=$CLIENT1_LANIP6
202		client2_lan=$CLIENT2_LANIP6
203	else
204		client1_lan=$CLIENT1_LANIP
205		client2_lan=$CLIENT2_LANIP
206	fi
207	if [ ${wan_mode} = "ipv6" ]; then
208		test_lac ${LAC1SOCK} $LAC1_WANIP6 ${wan_mode}
209		test_lac ${LAC2SOCK} $LAC2_WANIP6 ${wan_mode}
210		test_client ${CLIENT1SOCK} ${client1_lan} ${lan_mode}
211		test_client ${CLIENT2SOCK} ${client2_lan} ${lan_mode}
212	else
213		test_lac ${LAC1SOCK} $LAC1_WANIP ${wan_mode}
214		test_lac ${LAC2SOCK} $LAC2_WANIP ${wan_mode}
215		test_client ${CLIENT1SOCK} ${client1_lan} ${lan_mode}
216		test_client ${CLIENT2SOCK} ${client2_lan} ${lan_mode}
217	fi
218}
219
220setup_if_l2tp()
221{
222	sock=${1}
223	src=${2}
224	dst=${3}
225	src_session=${4}
226	dst_session=${5}
227
228	export RUMP_SERVER=${sock}
229
230	rump_server_add_iface $sock l2tp0
231	atf_check -s exit:0 rump.ifconfig l2tp0 tunnel ${src} ${dst}
232	atf_check -s exit:0 rump.ifconfig l2tp0 session ${src_session} ${dst_session}
233	atf_check -s exit:0 rump.ifconfig l2tp0 up
234
235	rump_server_add_iface $sock bridge0
236	atf_check -s exit:0 rump.ifconfig bridge0 up
237	export LD_PRELOAD=/usr/lib/librumphijack.so
238	atf_check -s exit:0 brconfig bridge0 add shmif0
239	atf_check -s exit:0 brconfig bridge0 add l2tp0
240	unset LD_PRELOAD
241
242	$DEBUG && rump.ifconfig -v l2tp0
243	$DEBUG && rump.ifconfig -v bridge0
244
245	unset RUMP_SERVER
246}
247
248setup_tunnel()
249{
250	wan_mode=${1}
251
252	src=""
253	dst=""
254	src_session=""
255	dst_session=""
256
257	if [ ${wan_mode} = "ipv6" ]; then
258		src=$LAC1_WANIP6
259		dst=$LAC2_WANIP6
260	else
261		src=$LAC1_WANIP
262		dst=$LAC2_WANIP
263	fi
264	src_session=${LAC1_SESSION}
265	dst_session=${LAC2_SESSION}
266	setup_if_l2tp $LAC1SOCK ${src} ${dst} ${src_session} ${dst_session}
267
268	if [ ${wan_mode} = "ipv6" ]; then
269		src=$LAC2_WANIP6
270		dst=$LAC1_WANIP6
271	else
272		src=$LAC2_WANIP
273		dst=$LAC1_WANIP
274	fi
275	src_session=${LAC2_SESSION}
276	dst_session=${LAC1_SESSION}
277	setup_if_l2tp $LAC2SOCK ${src} ${dst} ${src_session} ${dst_session}
278}
279
280test_setup_tunnel()
281{
282	mode=${1}
283
284	if [ ${mode} = "ipv6" ]; then
285		lac1_wan=$LAC1_WANIP6
286		lac2_wan=$LAC2_WANIP6
287	else
288		lac1_wan=$LAC1_WANIP
289		lac2_wan=$LAC2_WANIP
290	fi
291	export RUMP_SERVER=$LAC1SOCK
292	atf_check -s exit:0 -o match:l2tp0 rump.ifconfig
293	if [ ${mode} = "ipv6" ]; then
294	    atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lac2_wan}
295	else
296	    atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lac2_wan}
297	fi
298
299	export RUMP_SERVER=$LAC2SOCK
300	atf_check -s exit:0 -o match:l2tp0 rump.ifconfig
301	if [ ${mode} = "ipv6" ]; then
302	    atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lac1_wan}
303	else
304	    atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lac1_wan}
305	fi
306
307	unset RUMP_SERVER
308}
309
310teardown_tunnel()
311{
312	export RUMP_SERVER=$LAC1SOCK
313	atf_check -s exit:0 rump.ifconfig bridge0 destroy
314	atf_check -s exit:0 rump.ifconfig l2tp0 deletetunnel
315	atf_check -s exit:0 rump.ifconfig l2tp0 destroy
316
317	export RUMP_SERVER=$LAC2SOCK
318	atf_check -s exit:0 rump.ifconfig bridge0 destroy
319	atf_check -s exit:0 rump.ifconfig l2tp0 deletetunnel
320	atf_check -s exit:0 rump.ifconfig l2tp0 destroy
321
322	unset RUMP_SERVER
323}
324
325test_ping_failure()
326{
327	mode=$1
328
329	export RUMP_SERVER=$CLIENT1SOCK
330	if [ ${mode} = "ipv6" ]; then
331		atf_check -s not-exit:0 -o ignore -e ignore \
332			rump.ping6 -n -X $TIMEOUT -c 1 $CLIENT2_LANIP6
333	else
334		atf_check -s not-exit:0 -o ignore -e ignore \
335			rump.ping -n -w $TIMEOUT -c 1 $CLIENT2_LANIP
336	fi
337
338	export RUMP_SERVER=$CLIENT2SOCK
339	if [ ${mode} = "ipv6" ]; then
340		atf_check -s not-exit:0 -o ignore -e ignore \
341			rump.ping6 -n -X $TIMEOUT -c 1 $CLIENT1_LANIP6
342	else
343		atf_check -s not-exit:0 -o ignore -e ignore \
344			rump.ping -n -w $TIMEOUT -c 1 $CLIENT1_LANIP
345	fi
346
347	unset RUMP_SERVER
348}
349
350test_ping_success()
351{
352	mode=$1
353
354	export RUMP_SERVER=$CLIENT1SOCK
355	if [ ${mode} = "ipv6" ]; then
356		# XXX
357		# rump.ping6 rarely fails with the message that
358		# "failed to get receiving hop limit".
359		# This is a known issue being analyzed.
360		atf_check -s exit:0 -o ignore \
361			rump.ping6 -n -X $TIMEOUT -c 1 $CLIENT2_LANIP6
362	else
363		atf_check -s exit:0 -o ignore \
364			rump.ping -n -w $TIMEOUT -c 1 $CLIENT2_LANIP
365	fi
366	export RUMP_SERVER=$LAC1SOCK
367	$DEBUG && rump.ifconfig -v l2tp0
368	$DEBUG && rump.ifconfig -v bridge0
369	$DEBUG && rump.ifconfig -v shmif0
370
371	export RUMP_SERVER=$CLIENT2SOCK
372	if [ ${mode} = "ipv6" ]; then
373		atf_check -s exit:0 -o ignore \
374			rump.ping6 -n -X $TIMEOUT -c 1 $CLIENT1_LANIP6
375	else
376		atf_check -s exit:0 -o ignore \
377			rump.ping -n -w $TIMEOUT -c 1 $CLIENT1_LANIP
378	fi
379	export RUMP_SERVER=$LAC2SOCK
380	$DEBUG && rump.ifconfig -v l2tp0
381	$DEBUG && rump.ifconfig -v bridge0
382	$DEBUG && rump.ifconfig -v shmif0
383
384	unset RUMP_SERVER
385}
386
387basic_setup()
388{
389	lan_mode=$1
390	wan_mode=$2
391
392	setup ${lan_mode} ${wan_mode}
393	test_setup ${lan_mode} ${wan_mode}
394
395	# Enable once PR kern/49219 is fixed
396	#test_ping_failure
397
398	setup_tunnel ${wan_mode}
399	sleep 1
400	test_setup_tunnel ${wan_mode}
401}
402
403basic_test()
404{
405	lan_mode=$1
406	wan_mode=$2 # not use
407
408	test_ping_success ${lan_mode}
409}
410
411basic_teardown()
412{
413	lan_mode=$1
414	wan_mode=$2 # not use
415
416	teardown_tunnel
417	test_ping_failure ${lan_mode}
418}
419
420add_test()
421{
422	category=$1
423	desc=$2
424	lan_mode=$3
425	wan_mode=$4
426
427	name="l2tp_${category}_${lan_mode}over${wan_mode}"
428	fulldesc="Does ${lan_mode} over ${wan_mode} if_l2tp ${desc}"
429
430	atf_test_case ${name} cleanup
431	eval "${name}_head() {
432			atf_set descr \"${fulldesc}\"
433			atf_set require.progs rump_server
434		}
435	    ${name}_body() {
436			${category}_setup ${lan_mode} ${wan_mode}
437			${category}_test ${lan_mode} ${wan_mode}
438			${category}_teardown ${lan_mode} ${wan_mode}
439			rump_server_destroy_ifaces
440	    }
441	    ${name}_cleanup() {
442			\$DEBUG && dump
443			cleanup
444		}"
445	atf_add_test_case ${name}
446}
447
448add_test_allproto()
449{
450	category=$1
451	desc=$2
452
453	add_test ${category} "${desc}" ipv4 ipv4
454	add_test ${category} "${desc}" ipv4 ipv6
455	add_test ${category} "${desc}" ipv6 ipv4
456	add_test ${category} "${desc}" ipv6 ipv6
457}
458
459atf_init_test_cases()
460{
461
462	atf_add_test_case l2tp_create_destroy
463
464	add_test_allproto basic "basic tests"
465#	add_test_allproto recursive "recursive check tests"
466}
467