1313535Sngie#	$NetBSD: t_gif.sh,v 1.9 2016/12/21 09:46:39 ozaki-r Exp $
2303980Sngie#
3303980Sngie# Copyright (c) 2015 Internet Initiative Japan Inc.
4303980Sngie# All rights reserved.
5303980Sngie#
6303980Sngie# Redistribution and use in source and binary forms, with or without
7303980Sngie# modification, are permitted provided that the following conditions
8303980Sngie# are met:
9303980Sngie# 1. Redistributions of source code must retain the above copyright
10303980Sngie#    notice, this list of conditions and the following disclaimer.
11303980Sngie# 2. Redistributions in binary form must reproduce the above copyright
12303980Sngie#    notice, this list of conditions and the following disclaimer in the
13303980Sngie#    documentation and/or other materials provided with the distribution.
14303980Sngie#
15303980Sngie# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16303980Sngie# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17303980Sngie# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18303980Sngie# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19303980Sngie# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20303980Sngie# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21303980Sngie# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22303980Sngie# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23303980Sngie# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24303980Sngie# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25303980Sngie# POSSIBILITY OF SUCH DAMAGE.
26303980Sngie#
27303980Sngie
28303980SngieSOCK1=unix://commsock1 # for ROUTER1
29303980SngieSOCK2=unix://commsock2 # for ROUTER2
30303980SngieROUTER1_LANIP=192.168.1.1
31303980SngieROUTER1_LANNET=192.168.1.0/24
32303980SngieROUTER1_WANIP=10.0.0.1
33303980SngieROUTER1_GIFIP=172.16.1.1
34303980SngieROUTER1_WANIP_DUMMY=10.0.0.11
35303980SngieROUTER1_GIFIP_DUMMY=172.16.11.1
36303980SngieROUTER1_GIFIP_RECURSIVE1=172.16.101.1
37303980SngieROUTER1_GIFIP_RECURSIVE2=172.16.201.1
38303980SngieROUTER2_LANIP=192.168.2.1
39303980SngieROUTER2_LANNET=192.168.2.0/24
40303980SngieROUTER2_WANIP=10.0.0.2
41303980SngieROUTER2_GIFIP=172.16.2.1
42303980SngieROUTER2_WANIP_DUMMY=10.0.0.12
43303980SngieROUTER2_GIFIP_DUMMY=172.16.12.1
44303980SngieROUTER2_GIFIP_RECURSIVE1=172.16.102.1
45303980SngieROUTER2_GIFIP_RECURSIVE2=172.16.202.1
46303980Sngie
47303980SngieROUTER1_LANIP6=fc00:1::1
48303980SngieROUTER1_LANNET6=fc00:1::/64
49303980SngieROUTER1_WANIP6=fc00::1
50303980SngieROUTER1_GIFIP6=fc00:3::1
51303980SngieROUTER1_WANIP6_DUMMY=fc00::11
52303980SngieROUTER1_GIFIP6_DUMMY=fc00:13::1
53303980SngieROUTER1_GIFIP6_RECURSIVE1=fc00:103::1
54303980SngieROUTER1_GIFIP6_RECURSIVE2=fc00:203::1
55303980SngieROUTER2_LANIP6=fc00:2::1
56303980SngieROUTER2_LANNET6=fc00:2::/64
57303980SngieROUTER2_WANIP6=fc00::2
58303980SngieROUTER2_GIFIP6=fc00:4::1
59303980SngieROUTER2_WANIP6_DUMMY=fc00::12
60303980SngieROUTER2_GIFIP6_DUMMY=fc00:14::1
61303980SngieROUTER2_GIFIP6_RECURSIVE1=fc00:104::1
62303980SngieROUTER2_GIFIP6_RECURSIVE2=fc00:204::1
63303980Sngie
64313535SngieDEBUG=${DEBUG:-true}
65303980SngieTIMEOUT=5
66303980Sngie
67303980Sngiesetup_router()
68303980Sngie{
69303980Sngie	sock=${1}
70303980Sngie	lan=${2}
71303980Sngie	lan_mode=${3}
72303980Sngie	wan=${4}
73303980Sngie	wan_mode=${5}
74303980Sngie
75313535Sngie	rump_server_add_iface $sock shmif0 bus0
76313535Sngie	rump_server_add_iface $sock shmif1 bus1
77313535Sngie
78303980Sngie	export RUMP_SERVER=${sock}
79303980Sngie	if [ ${lan_mode} = "ipv6" ]; then
80303980Sngie		atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${lan}
81303980Sngie	else
82303980Sngie		atf_check -s exit:0 rump.ifconfig shmif0 inet ${lan} netmask 0xffffff00
83303980Sngie	fi
84303980Sngie	atf_check -s exit:0 rump.ifconfig shmif0 up
85303980Sngie	rump.ifconfig shmif0
86303980Sngie
87303980Sngie	if [ ${wan_mode} = "ipv6" ]; then
88303980Sngie		atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${wan}
89303980Sngie	else
90303980Sngie		atf_check -s exit:0 rump.ifconfig shmif1 inet ${wan} netmask 0xff000000
91303980Sngie	fi
92303980Sngie	atf_check -s exit:0 rump.ifconfig shmif1 up
93303980Sngie	rump.ifconfig shmif1
94303980Sngie}
95303980Sngie
96303980Sngietest_router()
97303980Sngie{
98303980Sngie	sock=${1}
99303980Sngie	lan=${2}
100303980Sngie	lan_mode=${3}
101303980Sngie	wan=${4}
102303980Sngie	wan_mode=${5}
103303980Sngie
104303980Sngie	export RUMP_SERVER=${sock}
105303980Sngie	atf_check -s exit:0 -o match:shmif0 rump.ifconfig
106303980Sngie	if [ ${lan_mode} = "ipv6" ]; then
107303980Sngie		atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${lan}
108303980Sngie	else
109303980Sngie		atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lan}
110303980Sngie	fi
111303980Sngie
112303980Sngie	atf_check -s exit:0 -o match:shmif1 rump.ifconfig
113303980Sngie	if [ ${wan_mode} = "ipv6" ]; then
114303980Sngie		atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${wan}
115303980Sngie	else
116303980Sngie		atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${wan}
117303980Sngie	fi
118303980Sngie}
119303980Sngie
120303980Sngiesetup()
121303980Sngie{
122303980Sngie	inner=${1}
123303980Sngie	outer=${2}
124303980Sngie
125313535Sngie	rump_server_start $SOCK1 netinet6 gif
126313535Sngie	rump_server_start $SOCK2 netinet6 gif
127303980Sngie
128303980Sngie	router1_lan=""
129303980Sngie	router1_lan_mode=""
130303980Sngie	router2_lan=""
131303980Sngie	router2_lan_mode=""
132303980Sngie	if [ ${inner} = "ipv6" ]; then
133303980Sngie		router1_lan=$ROUTER1_LANIP6
134303980Sngie		router1_lan_mode="ipv6"
135303980Sngie		router2_lan=$ROUTER2_LANIP6
136303980Sngie		router2_lan_mode="ipv6"
137303980Sngie	else
138303980Sngie		router1_lan=$ROUTER1_LANIP
139303980Sngie		router1_lan_mode="ipv4"
140303980Sngie		router2_lan=$ROUTER2_LANIP
141303980Sngie		router2_lan_mode="ipv4"
142303980Sngie	fi
143303980Sngie
144303980Sngie	if [ ${outer} = "ipv6" ]; then
145303980Sngie		setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
146303980Sngie			$ROUTER1_WANIP6 ipv6
147303980Sngie		setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
148303980Sngie			$ROUTER2_WANIP6 ipv6
149303980Sngie	else
150303980Sngie		setup_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
151303980Sngie			$ROUTER1_WANIP ipv4
152303980Sngie		setup_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
153303980Sngie			$ROUTER2_WANIP ipv4
154303980Sngie	fi
155303980Sngie}
156303980Sngie
157303980Sngietest_setup()
158303980Sngie{
159303980Sngie	inner=${1}
160303980Sngie	outer=${2}
161303980Sngie
162303980Sngie	router1_lan=""
163303980Sngie	router1_lan_mode=""
164303980Sngie	router2_lan=""
165303980Sngie	router2_lan_mode=""
166303980Sngie	if [ ${inner} = "ipv6" ]; then
167303980Sngie		router1_lan=$ROUTER1_LANIP6
168303980Sngie		router1_lan_mode="ipv6"
169303980Sngie		router2_lan=$ROUTER2_LANIP6
170303980Sngie		router2_lan_mode="ipv6"
171303980Sngie	else
172303980Sngie		router1_lan=$ROUTER1_LANIP
173303980Sngie		router1_lan_mode="ipv4"
174303980Sngie		router2_lan=$ROUTER2_LANIP
175303980Sngie		router2_lan_mode="ipv4"
176303980Sngie	fi
177303980Sngie	if [ ${outer} = "ipv6" ]; then
178303980Sngie		test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
179303980Sngie			$ROUTER1_WANIP6 ipv6
180303980Sngie		test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
181303980Sngie			$ROUTER2_WANIP6 ipv6
182303980Sngie	else
183303980Sngie		test_router $SOCK1 ${router1_lan} ${router1_lan_mode} \
184303980Sngie			$ROUTER1_WANIP ipv4
185303980Sngie		test_router $SOCK2 ${router2_lan} ${router2_lan_mode} \
186303980Sngie			$ROUTER2_WANIP ipv4
187303980Sngie	fi
188303980Sngie}
189303980Sngie
190303980Sngiesetup_if_gif()
191303980Sngie{
192303980Sngie	sock=${1}
193303980Sngie	addr=${2}
194303980Sngie	remote=${3}
195303980Sngie	inner=${4}
196303980Sngie	src=${5}
197303980Sngie	dst=${6}
198303980Sngie	peernet=${7}
199303980Sngie
200303980Sngie	export RUMP_SERVER=${sock}
201303980Sngie	atf_check -s exit:0 rump.ifconfig gif0 create
202303980Sngie	atf_check -s exit:0 rump.ifconfig gif0 tunnel ${src} ${dst}
203303980Sngie	if [ ${inner} = "ipv6" ]; then
204303980Sngie		atf_check -s exit:0 rump.ifconfig gif0 inet6 ${addr}/128 ${remote}
205303980Sngie		atf_check -s exit:0 -o ignore rump.route add -inet6 ${peernet} ${addr}
206303980Sngie	else
207303980Sngie		atf_check -s exit:0 rump.ifconfig gif0 inet ${addr}/32 ${remote}
208303980Sngie		atf_check -s exit:0 -o ignore rump.route add -inet ${peernet} ${addr}
209303980Sngie	fi
210303980Sngie
211303980Sngie	rump.ifconfig gif0
212303980Sngie	rump.route -nL show
213303980Sngie}
214303980Sngie
215303980Sngiesetup_tunnel()
216303980Sngie{
217303980Sngie	inner=${1}
218303980Sngie	outer=${2}
219303980Sngie
220303980Sngie	addr=""
221303980Sngie	remote=""
222303980Sngie	src=""
223303980Sngie	dst=""
224303980Sngie	peernet=""
225303980Sngie
226303980Sngie	if [ ${inner} = "ipv6" ]; then
227303980Sngie		addr=$ROUTER1_GIFIP6
228303980Sngie		remote=$ROUTER2_GIFIP6
229303980Sngie		peernet=$ROUTER2_LANNET6
230303980Sngie	else
231303980Sngie		addr=$ROUTER1_GIFIP
232303980Sngie		remote=$ROUTER2_GIFIP
233303980Sngie		peernet=$ROUTER2_LANNET
234303980Sngie	fi
235303980Sngie	if [ ${outer} = "ipv6" ]; then
236303980Sngie		src=$ROUTER1_WANIP6
237303980Sngie		dst=$ROUTER2_WANIP6
238303980Sngie	else
239303980Sngie		src=$ROUTER1_WANIP
240303980Sngie		dst=$ROUTER2_WANIP
241303980Sngie	fi
242303980Sngie	setup_if_gif $SOCK1 ${addr} ${remote} ${inner} \
243303980Sngie		     ${src} ${dst} ${peernet}
244303980Sngie
245303980Sngie	if [ $inner = "ipv6" ]; then
246303980Sngie		addr=$ROUTER2_GIFIP6
247303980Sngie		remote=$ROUTER1_GIFIP6
248303980Sngie		peernet=$ROUTER1_LANNET6
249303980Sngie	else
250303980Sngie		addr=$ROUTER2_GIFIP
251303980Sngie		remote=$ROUTER1_GIFIP
252303980Sngie		peernet=$ROUTER1_LANNET
253303980Sngie	fi
254303980Sngie	if [ $outer = "ipv6" ]; then
255303980Sngie		src=$ROUTER2_WANIP6
256303980Sngie		dst=$ROUTER1_WANIP6
257303980Sngie	else
258303980Sngie		src=$ROUTER2_WANIP
259303980Sngie		dst=$ROUTER1_WANIP
260303980Sngie	fi
261303980Sngie	setup_if_gif $SOCK2 ${addr} ${remote} ${inner} \
262303980Sngie		     ${src} ${dst} ${peernet}
263303980Sngie}
264303980Sngie
265303980Sngietest_setup_tunnel()
266303980Sngie{
267303980Sngie	mode=${1}
268303980Sngie
269303980Sngie	peernet=""
270303980Sngie	opt=""
271303980Sngie	if [ ${mode} = "ipv6" ]; then
272303980Sngie		peernet=$ROUTER2_LANNET6
273303980Sngie		opt="-inet6"
274303980Sngie	else
275303980Sngie		peernet=$ROUTER2_LANNET
276303980Sngie		opt="-inet"
277303980Sngie	fi
278303980Sngie	export RUMP_SERVER=$SOCK1
279303980Sngie	atf_check -s exit:0 -o match:gif0 rump.ifconfig
280303980Sngie	atf_check -s exit:0 -o match:gif0 rump.route -nL get ${opt} ${peernet}
281303980Sngie
282303980Sngie	if [ ${mode} = "ipv6" ]; then
283303980Sngie		peernet=$ROUTER1_LANNET6
284303980Sngie		opt="-inet6"
285303980Sngie	else
286303980Sngie		peernet=$ROUTER1_LANNET
287303980Sngie		opt="-inet"
288303980Sngie	fi
289303980Sngie	export RUMP_SERVER=$SOCK2
290303980Sngie	atf_check -s exit:0 -o match:gif0 rump.ifconfig
291303980Sngie	atf_check -s exit:0 -o match:gif0 rump.route -nL get ${opt} ${peernet}
292303980Sngie}
293303980Sngie
294303980Sngieteardown_tunnel()
295303980Sngie{
296303980Sngie	export RUMP_SERVER=$SOCK1
297303980Sngie	atf_check -s exit:0 rump.ifconfig gif0 deletetunnel
298303980Sngie	atf_check -s exit:0 rump.ifconfig gif0 destroy
299303980Sngie
300303980Sngie	export RUMP_SERVER=$SOCK2
301303980Sngie	atf_check -s exit:0 rump.ifconfig gif0 deletetunnel
302303980Sngie	atf_check -s exit:0 rump.ifconfig gif0 destroy
303303980Sngie}
304303980Sngie
305303980Sngiesetup_dummy_if_gif()
306303980Sngie{
307303980Sngie	sock=${1}
308303980Sngie	addr=${2}
309303980Sngie	remote=${3}
310303980Sngie	inner=${4}
311303980Sngie	src=${5}
312303980Sngie	dst=${6}
313303980Sngie
314303980Sngie	export RUMP_SERVER=${sock}
315303980Sngie	atf_check -s exit:0 rump.ifconfig gif1 create
316303980Sngie	atf_check -s exit:0 rump.ifconfig gif1 tunnel ${src} ${dst}
317303980Sngie	if [ ${inner} = "ipv6" ]; then
318303980Sngie		atf_check -s exit:0 rump.ifconfig gif1 inet6 ${addr}/128 ${remote}
319303980Sngie	else
320303980Sngie		atf_check -s exit:0 rump.ifconfig gif1 inet ${addr}/32 ${remote}
321303980Sngie	fi
322303980Sngie
323303980Sngie	rump.ifconfig gif1
324303980Sngie}
325303980Sngie
326303980Sngiesetup_dummy_tunnel()
327303980Sngie{
328303980Sngie	inner=${1}
329303980Sngie	outer=${2}
330303980Sngie
331303980Sngie	addr=""
332303980Sngie	remote=""
333303980Sngie	src=""
334303980Sngie	dst=""
335303980Sngie
336303980Sngie	if [ ${inner} = "ipv6" ]; then
337303980Sngie		addr=$ROUTER1_GIFIP6_DUMMY
338303980Sngie		remote=$ROUTER2_GIFIP6_DUMMY
339303980Sngie	else
340303980Sngie		addr=$ROUTER1_GIFIP_DUMMY
341303980Sngie		remote=$ROUTER2_GIFIP_DUMMY
342303980Sngie	fi
343303980Sngie	if [ ${outer} = "ipv6" ]; then
344303980Sngie		src=$ROUTER1_WANIP6_DUMMY
345303980Sngie		dst=$ROUTER2_WANIP6_DUMMY
346303980Sngie	else
347303980Sngie		src=$ROUTER1_WANIP_DUMMY
348303980Sngie		dst=$ROUTER2_WANIP_DUMMY
349303980Sngie	fi
350303980Sngie	setup_dummy_if_gif $SOCK1 ${addr} ${remote} ${inner} \
351303980Sngie			   ${src} ${dst}
352303980Sngie
353303980Sngie	if [ $inner = "ipv6" ]; then
354303980Sngie		addr=$ROUTER2_GIFIP6_DUMMY
355303980Sngie		remote=$ROUTER1_GIFIP6_DUMMY
356303980Sngie	else
357303980Sngie		addr=$ROUTER2_GIFIP_DUMMY
358303980Sngie		remote=$ROUTER1_GIFIP_DUMMY
359303980Sngie	fi
360303980Sngie	if [ $outer = "ipv6" ]; then
361303980Sngie		src=$ROUTER2_WANIP6_DUMMY
362303980Sngie		dst=$ROUTER1_WANIP6_DUMMY
363303980Sngie	else
364303980Sngie		src=$ROUTER2_WANIP_DUMMY
365303980Sngie		dst=$ROUTER1_WANIP_DUMMY
366303980Sngie	fi
367303980Sngie	setup_dummy_if_gif $SOCK2 ${addr} ${remote} ${inner} \
368303980Sngie			   ${src} ${dst}
369303980Sngie}
370303980Sngie
371303980Sngietest_setup_dummy_tunnel()
372303980Sngie{
373303980Sngie	export RUMP_SERVER=$SOCK1
374303980Sngie	atf_check -s exit:0 -o match:gif1 rump.ifconfig
375303980Sngie
376303980Sngie	export RUMP_SERVER=$SOCK2
377303980Sngie	atf_check -s exit:0 -o match:gif1 rump.ifconfig
378303980Sngie}
379303980Sngie
380303980Sngieteardown_dummy_tunnel()
381303980Sngie{
382303980Sngie	export RUMP_SERVER=$SOCK1
383303980Sngie	atf_check -s exit:0 rump.ifconfig gif1 deletetunnel
384303980Sngie	atf_check -s exit:0 rump.ifconfig gif1 destroy
385303980Sngie
386303980Sngie	export RUMP_SERVER=$SOCK2
387303980Sngie	atf_check -s exit:0 rump.ifconfig gif1 deletetunnel
388303980Sngie	atf_check -s exit:0 rump.ifconfig gif1 destroy
389303980Sngie}
390303980Sngie
391303980Sngiesetup_recursive_if_gif()
392303980Sngie{
393303980Sngie	sock=${1}
394303980Sngie	gif=${2}
395303980Sngie	addr=${3}
396303980Sngie	remote=${4}
397303980Sngie	inner=${5}
398303980Sngie	src=${6}
399303980Sngie	dst=${7}
400303980Sngie
401303980Sngie	export RUMP_SERVER=${sock}
402303980Sngie	atf_check -s exit:0 rump.ifconfig ${gif} create
403303980Sngie	atf_check -s exit:0 rump.ifconfig ${gif} tunnel ${src} ${dst}
404303980Sngie	if [ ${inner} = "ipv6" ]; then
405303980Sngie		atf_check -s exit:0 rump.ifconfig ${gif} inet6 ${addr}/128 ${remote}
406303980Sngie	else
407303980Sngie		atf_check -s exit:0 rump.ifconfig ${gif} inet ${addr}/32 ${remote}
408303980Sngie	fi
409303980Sngie
410303980Sngie	rump.ifconfig ${gif}
411303980Sngie}
412303980Sngie
413303980Sngie# test in ROUTER1 only
414303980Sngiesetup_recursive_tunnels()
415303980Sngie{
416303980Sngie	mode=${1}
417303980Sngie
418303980Sngie	addr=""
419303980Sngie	remote=""
420303980Sngie	src=""
421303980Sngie	dst=""
422303980Sngie
423303980Sngie	if [ ${mode} = "ipv6" ]; then
424303980Sngie		addr=$ROUTER1_GIFIP6_RECURSIVE1
425303980Sngie		remote=$ROUTER2_GIFIP6_RECURSIVE1
426303980Sngie		src=$ROUTER1_GIFIP6
427303980Sngie		dst=$ROUTER2_GIFIP6
428303980Sngie	else
429303980Sngie		addr=$ROUTER1_GIFIP_RECURSIVE1
430303980Sngie		remote=$ROUTER2_GIFIP_RECURSIVE1
431303980Sngie		src=$ROUTER1_GIFIP
432303980Sngie		dst=$ROUTER2_GIFIP
433303980Sngie	fi
434303980Sngie	setup_recursive_if_gif $SOCK1 gif1 ${addr} ${remote} ${mode} \
435303980Sngie		      ${src} ${dst}
436303980Sngie
437303980Sngie	if [ ${mode} = "ipv6" ]; then
438303980Sngie		addr=$ROUTER1_GIFIP6_RECURSIVE2
439303980Sngie		remote=$ROUTER2_GIFIP6_RECURSIVE2
440303980Sngie		src=$ROUTER1_GIFIP6_RECURSIVE1
441303980Sngie		dst=$ROUTER2_GIFIP6_RECURSIVE1
442303980Sngie	else
443303980Sngie		addr=$ROUTER1_GIFIP_RECURSIVE2
444303980Sngie		remote=$ROUTER2_GIFIP_RECURSIVE2
445303980Sngie		src=$ROUTER1_GIFIP_RECURSIVE1
446303980Sngie		dst=$ROUTER2_GIFIP_RECURSIVE1
447303980Sngie	fi
448303980Sngie	setup_recursive_if_gif $SOCK1 gif2 ${addr} ${remote} ${mode} \
449303980Sngie		      ${src} ${dst}
450303980Sngie}
451303980Sngie
452303980Sngie# test in router1 only
453303980Sngietest_recursive_check()
454303980Sngie{
455303980Sngie	mode=$1
456303980Sngie
457303980Sngie	export RUMP_SERVER=$SOCK1
458303980Sngie	if [ ${mode} = "ipv6" ]; then
459303980Sngie		atf_check -s not-exit:0 -o ignore -e ignore \
460303980Sngie			rump.ping6 -n -X $TIMEOUT -c 1 $ROUTER2_GIFIP6_RECURSIVE2
461303980Sngie	else
462303980Sngie		atf_check -s not-exit:0 -o ignore -e ignore \
463303980Sngie			rump.ping -n -w $TIMEOUT -c 1 $ROUTER2_GIFIP_RECURSIVE2
464303980Sngie	fi
465303980Sngie
466303980Sngie	atf_check -o match:'gif0: recursively called too many times' \
467303980Sngie		-x "$HIJACKING dmesg"
468303980Sngie
469303980Sngie	$HIJACKING dmesg
470303980Sngie}
471303980Sngie
472303980Sngieteardown_recursive_tunnels()
473303980Sngie{
474303980Sngie	export RUMP_SERVER=$SOCK1
475303980Sngie	atf_check -s exit:0 rump.ifconfig gif1 deletetunnel
476303980Sngie	atf_check -s exit:0 rump.ifconfig gif1 destroy
477303980Sngie	atf_check -s exit:0 rump.ifconfig gif2 deletetunnel
478303980Sngie	atf_check -s exit:0 rump.ifconfig gif2 destroy
479303980Sngie}
480303980Sngie
481303980Sngietest_ping_failure()
482303980Sngie{
483303980Sngie	mode=$1
484303980Sngie
485303980Sngie	export RUMP_SERVER=$SOCK1
486303980Sngie	if [ ${mode} = "ipv6" ]; then
487303980Sngie		atf_check -s not-exit:0 -o ignore -e ignore \
488303980Sngie			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \
489303980Sngie			$ROUTER2_LANIP6
490303980Sngie	else
491303980Sngie		atf_check -s not-exit:0 -o ignore -e ignore \
492303980Sngie			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
493303980Sngie			$ROUTER2_LANIP
494303980Sngie	fi
495303980Sngie
496303980Sngie	export RUMP_SERVER=$SOCK2
497303980Sngie	if [ ${mode} = "ipv6" ]; then
498303980Sngie		atf_check -s not-exit:0 -o ignore -e ignore \
499303980Sngie			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \
500303980Sngie			$ROUTER1_LANIP6
501303980Sngie	else
502303980Sngie		atf_check -s not-exit:0 -o ignore -e ignore \
503303980Sngie			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
504303980Sngie			$ROUTER2_LANIP
505303980Sngie	fi
506303980Sngie}
507303980Sngie
508303980Sngietest_ping_success()
509303980Sngie{
510303980Sngie	mode=$1
511303980Sngie
512303980Sngie	export RUMP_SERVER=$SOCK1
513303980Sngie	rump.ifconfig -v gif0
514303980Sngie	if [ ${mode} = "ipv6" ]; then
515303980Sngie		# XXX
516303980Sngie		# rump.ping6 rarely fails with the message that
517303980Sngie		# "failed to get receiving hop limit".
518303980Sngie		# This is a known issue being analyzed.
519303980Sngie		atf_check -s exit:0 -o ignore \
520303980Sngie			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER1_LANIP6 \
521303980Sngie			$ROUTER2_LANIP6
522303980Sngie	else
523303980Sngie		atf_check -s exit:0 -o ignore \
524303980Sngie			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
525303980Sngie			$ROUTER2_LANIP
526303980Sngie	fi
527303980Sngie	rump.ifconfig -v gif0
528303980Sngie
529303980Sngie	export RUMP_SERVER=$SOCK2
530303980Sngie	rump.ifconfig -v gif0
531303980Sngie	if [ ${mode} = "ipv6" ]; then
532303980Sngie		atf_check -s exit:0 -o ignore \
533303980Sngie			rump.ping6 -n -X $TIMEOUT -c 1 -S $ROUTER2_LANIP6 \
534303980Sngie			$ROUTER1_LANIP6
535303980Sngie	else
536303980Sngie		atf_check -s exit:0 -o ignore \
537303980Sngie			rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER2_LANIP \
538303980Sngie			$ROUTER1_LANIP
539303980Sngie	fi
540303980Sngie	rump.ifconfig -v gif0
541303980Sngie}
542303980Sngie
543303980Sngietest_change_tunnel_duplicate()
544303980Sngie{
545303980Sngie	mode=$1
546303980Sngie
547303980Sngie	newsrc=""
548303980Sngie	newdst=""
549303980Sngie	if [ ${mode} = "ipv6" ]; then
550303980Sngie		newsrc=$ROUTER1_WANIP6_DUMMY
551303980Sngie		newdst=$ROUTER2_WANIP6_DUMMY
552303980Sngie	else
553303980Sngie		newsrc=$ROUTER1_WANIP_DUMMY
554303980Sngie		newdst=$ROUTER2_WANIP_DUMMY
555303980Sngie	fi
556303980Sngie	export RUMP_SERVER=$SOCK1
557303980Sngie	rump.ifconfig -v gif0
558303980Sngie	rump.ifconfig -v gif1
559303980Sngie	atf_check -s exit:0 -e match:SIOCSLIFPHYADDR \
560303980Sngie		rump.ifconfig gif0 tunnel ${newsrc} ${newdst}
561303980Sngie	rump.ifconfig -v gif0
562303980Sngie	rump.ifconfig -v gif1
563303980Sngie
564303980Sngie	if [ ${mode} = "ipv6" ]; then
565303980Sngie		newsrc=$ROUTER2_WANIP6_DUMMY
566303980Sngie		newdst=$ROUTER1_WANIP6_DUMMY
567303980Sngie	else
568303980Sngie		newsrc=$ROUTER2_WANIP_DUMMY
569303980Sngie		newdst=$ROUTER1_WANIP_DUMMY
570303980Sngie	fi
571303980Sngie	export RUMP_SERVER=$SOCK2
572303980Sngie	rump.ifconfig -v gif0
573303980Sngie	rump.ifconfig -v gif1
574303980Sngie	atf_check -s exit:0 -e match:SIOCSLIFPHYADDR \
575303980Sngie		rump.ifconfig gif0 tunnel ${newsrc} ${newdst}
576303980Sngie	rump.ifconfig -v gif0
577303980Sngie	rump.ifconfig -v gif1
578303980Sngie}
579303980Sngie
580303980Sngietest_change_tunnel_success()
581303980Sngie{
582303980Sngie	mode=$1
583303980Sngie
584303980Sngie	newsrc=""
585303980Sngie	newdst=""
586303980Sngie	if [ ${mode} = "ipv6" ]; then
587303980Sngie		newsrc=$ROUTER1_WANIP6_DUMMY
588303980Sngie		newdst=$ROUTER2_WANIP6_DUMMY
589303980Sngie	else
590303980Sngie		newsrc=$ROUTER1_WANIP_DUMMY
591303980Sngie		newdst=$ROUTER2_WANIP_DUMMY
592303980Sngie	fi
593303980Sngie	export RUMP_SERVER=$SOCK1
594303980Sngie	rump.ifconfig -v gif0
595303980Sngie	atf_check -s exit:0 \
596303980Sngie		rump.ifconfig gif0 tunnel ${newsrc} ${newdst}
597303980Sngie	rump.ifconfig -v gif0
598303980Sngie
599303980Sngie	if [ ${mode} = "ipv6" ]; then
600303980Sngie		newsrc=$ROUTER2_WANIP6_DUMMY
601303980Sngie		newdst=$ROUTER1_WANIP6_DUMMY
602303980Sngie	else
603303980Sngie		newsrc=$ROUTER2_WANIP_DUMMY
604303980Sngie		newdst=$ROUTER1_WANIP_DUMMY
605303980Sngie	fi
606303980Sngie	export RUMP_SERVER=$SOCK2
607303980Sngie	rump.ifconfig -v gif0
608303980Sngie	atf_check -s exit:0 \
609303980Sngie		rump.ifconfig gif0 tunnel ${newsrc} ${newdst}
610303980Sngie	rump.ifconfig -v gif0
611303980Sngie}
612303980Sngie
613303980Sngiebasic_setup()
614303980Sngie{
615303980Sngie	inner=$1
616303980Sngie	outer=$2
617303980Sngie
618303980Sngie	setup ${inner} ${outer}
619303980Sngie	test_setup ${inner} ${outer}
620303980Sngie
621303980Sngie	# Enable once PR kern/49219 is fixed
622303980Sngie	#test_ping_failure
623303980Sngie
624303980Sngie	setup_tunnel ${inner} ${outer}
625303980Sngie	sleep 1
626303980Sngie	test_setup_tunnel ${inner}
627303980Sngie}
628303980Sngie
629303980Sngiebasic_test()
630303980Sngie{
631303980Sngie	inner=$1
632303980Sngie	outer=$2 # not use
633303980Sngie
634303980Sngie	test_ping_success ${inner}
635303980Sngie}
636303980Sngie
637303980Sngiebasic_teardown()
638303980Sngie{
639303980Sngie	inner=$1
640303980Sngie	outer=$2 # not use
641303980Sngie
642303980Sngie	teardown_tunnel
643303980Sngie	test_ping_failure ${inner}
644303980Sngie}
645303980Sngie
646303980Sngieioctl_setup()
647303980Sngie{
648303980Sngie	inner=$1
649303980Sngie	outer=$2
650303980Sngie
651303980Sngie	setup ${inner} ${outer}
652303980Sngie	test_setup ${inner} ${outer}
653303980Sngie
654303980Sngie	# Enable once PR kern/49219 is fixed
655303980Sngie	#test_ping_failure
656303980Sngie
657303980Sngie	setup_tunnel ${inner} ${outer}
658303980Sngie	setup_dummy_tunnel ${inner} ${outer}
659303980Sngie	sleep 1
660303980Sngie	test_setup_tunnel ${inner}
661303980Sngie}
662303980Sngie
663303980Sngieioctl_test()
664303980Sngie{
665303980Sngie	inner=$1
666303980Sngie	outer=$2
667303980Sngie
668303980Sngie	test_ping_success ${inner}
669303980Sngie
670303980Sngie	test_change_tunnel_duplicate ${outer}
671303980Sngie
672303980Sngie	teardown_dummy_tunnel
673303980Sngie	test_change_tunnel_success ${outer}
674303980Sngie}
675303980Sngie
676303980Sngieioctl_teardown()
677303980Sngie{
678303980Sngie	inner=$1
679303980Sngie	outer=$2 # not use
680303980Sngie
681303980Sngie	teardown_tunnel
682303980Sngie	test_ping_failure ${inner}
683303980Sngie}
684303980Sngie
685303980Sngierecursive_setup()
686303980Sngie{
687303980Sngie	inner=$1
688303980Sngie	outer=$2
689303980Sngie
690303980Sngie	setup ${inner} ${outer}
691303980Sngie	test_setup ${inner} ${outer}
692303980Sngie
693303980Sngie	# Enable once PR kern/49219 is fixed
694303980Sngie	#test_ping_failure
695303980Sngie
696303980Sngie	setup_tunnel ${inner} ${outer}
697303980Sngie	setup_recursive_tunnels ${inner}
698303980Sngie	sleep 1
699303980Sngie	test_setup_tunnel ${inner}
700303980Sngie}
701303980Sngie
702303980Sngierecursive_test()
703303980Sngie{
704303980Sngie	inner=$1
705303980Sngie	outer=$2 # not use
706303980Sngie
707303980Sngie	test_recursive_check ${inner}
708303980Sngie}
709303980Sngie
710303980Sngierecursive_teardown()
711303980Sngie{
712303980Sngie	inner=$1 # not use
713303980Sngie	outer=$2 # not use
714303980Sngie
715303980Sngie	teardown_recursive_tunnels
716303980Sngie	teardown_tunnel
717303980Sngie}
718303980Sngie
719303980Sngieadd_test()
720303980Sngie{
721303980Sngie	category=$1
722303980Sngie	desc=$2
723303980Sngie	inner=$3
724303980Sngie	outer=$4
725303980Sngie
726313535Sngie	name="gif_${category}_${inner}over${outer}"
727303980Sngie	fulldesc="Does ${inner} over ${outer} if_gif ${desc}"
728303980Sngie
729303980Sngie	atf_test_case ${name} cleanup
730303980Sngie	eval "${name}_head() { \
731303980Sngie			atf_set \"descr\" \"${fulldesc}\"; \
732303980Sngie			atf_set \"require.progs\" \"rump_server\"; \
733303980Sngie		}; \
734303980Sngie	    ${name}_body() { \
735303980Sngie			${category}_setup ${inner} ${outer}; \
736303980Sngie			${category}_test ${inner} ${outer}; \
737303980Sngie			${category}_teardown ${inner} ${outer}; \
738313535Sngie			rump_server_destroy_ifaces; \
739303980Sngie	    }; \
740303980Sngie	    ${name}_cleanup() { \
741313535Sngie			$DEBUG && dump; \
742303980Sngie			cleanup; \
743303980Sngie		}"
744303980Sngie	atf_add_test_case ${name}
745303980Sngie}
746303980Sngie
747303980Sngieadd_test_allproto()
748303980Sngie{
749303980Sngie	category=$1
750303980Sngie	desc=$2
751303980Sngie
752303980Sngie	add_test ${category} "${desc}" ipv4 ipv4
753303980Sngie	add_test ${category} "${desc}" ipv4 ipv6
754303980Sngie	add_test ${category} "${desc}" ipv6 ipv4
755303980Sngie	add_test ${category} "${desc}" ipv6 ipv6
756303980Sngie}
757303980Sngie
758303980Sngieatf_init_test_cases()
759303980Sngie{
760303980Sngie	add_test_allproto basic "basic tests"
761303980Sngie	add_test_allproto ioctl "ioctl tests"
762303980Sngie	add_test_allproto recursive "recursive check tests"
763303980Sngie}
764