t_ra.sh revision 1.11
1#	$NetBSD: t_ra.sh,v 1.11 2016/12/16 09:10:37 ozaki-r Exp $
2#
3# Copyright (c) 2015 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
28RUMPSRV=unix://r1
29RUMPCLI=unix://r2
30IP6SRV=fc00:1::1
31IP6CLI=fc00:2::2
32PIDFILE=./rump.rtadvd.pid
33CONFIG=./rtadvd.conf
34DEBUG=${DEBUG:-true}
35
36init_server()
37{
38
39	export RUMP_SERVER=$1
40	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.forwarding=1
41	export LD_PRELOAD=/usr/lib/librumphijack.so
42	atf_check -s exit:0 mkdir -p /rump/var/chroot/rtadvd
43	unset LD_PRELOAD
44	unset RUMP_SERVER
45}
46
47setup_shmif0()
48{
49	local sock=$1
50	local IP6ADDR=$2
51
52	rump_server_add_iface $sock shmif0 bus1
53
54	export RUMP_SERVER=$sock
55	atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6ADDR}
56	atf_check -s exit:0 rump.ifconfig shmif0 up
57	atf_check -s exit:0 rump.ifconfig -w 10
58
59	$DEBUG && rump.ifconfig
60}
61
62wait_term()
63{
64	local PIDFILE=${1}
65	shift
66
67	while [ -f ${PIDFILE} ]
68	do
69		sleep 0.2
70	done
71
72	return 0
73}
74
75create_rtadvdconfig()
76{
77
78	cat << _EOF > ${CONFIG}
79shmif0:\
80	:mtu#1300:maxinterval#4:mininterval#3:
81_EOF
82}
83
84start_rtadvd()
85{
86	local sock=$1
87	local pidfile=$2
88
89	export RUMP_SERVER=$sock
90	atf_check -s exit:0 rump.rtadvd -c ${CONFIG} -p $pidfile shmif0
91	atf_check -s exit:0 sleep 3
92	atf_check -s exit:0 -o ignore -e empty cat $pidfile
93	unset RUMP_SERVER
94}
95
96check_entries()
97{
98
99	export RUMP_SERVER=$1
100	$DEBUG && dump_entries
101	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
102	atf_check -s exit:0 -o match:'advertised' rump.ndp -p
103	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
104	atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
105	atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
106	atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
107	unset RUMP_SERVER
108}
109
110dump_entries()
111{
112
113	echo ndp -n -a
114	rump.ndp -n -a
115	echo ndp -p
116	rump.ndp -p
117	echo ndp -r
118	rump.ndp -r
119}
120
121atf_test_case ra_basic cleanup
122ra_basic_head()
123{
124
125	atf_set "descr" "Tests for basic functions of router advaertisement(RA)"
126	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
127}
128
129ra_basic_body()
130{
131
132	rump_server_fs_start $RUMPSRV netinet6
133	rump_server_start $RUMPCLI netinet6
134
135	setup_shmif0 ${RUMPSRV} ${IP6SRV}
136	init_server $RUMPSRV
137
138	setup_shmif0 ${RUMPCLI} ${IP6CLI}
139	export RUMP_SERVER=${RUMPCLI}
140	$DEBUG && rump.ndp -n -a
141	atf_check -s exit:0 -o match:'= 0' rump.sysctl net.inet6.ip6.accept_rtadv
142	unset RUMP_SERVER
143
144	create_rtadvdconfig
145	start_rtadvd $RUMPSRV $PIDFILE
146
147	export RUMP_SERVER=${RUMPCLI}
148	atf_check -s exit:0 -o empty rump.ndp -r
149	atf_check -s exit:0 -o not-match:'advertised' rump.ndp -p
150	atf_check -s exit:0 -o match:'linkmtu=0' rump.ndp -n -i shmif0
151	atf_check -s exit:0 -o not-match:'S R' rump.ndp -n -a
152	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
153	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
154	unset RUMP_SERVER
155
156	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
157	wait_term ${PIDFILE}
158
159	export RUMP_SERVER=${RUMPCLI}
160	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
161	unset RUMP_SERVER
162
163	start_rtadvd $RUMPSRV $PIDFILE
164
165	check_entries $RUMPCLI
166
167	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
168	wait_term ${PIDFILE}
169
170	rump_server_destroy_ifaces
171}
172
173ra_basic_cleanup()
174{
175
176	if [ -f ${PIDFILE} ]; then
177		kill -TERM `cat ${PIDFILE}`
178		wait_term ${PIDFILE}
179	fi
180
181	$DEBUG && dump
182	cleanup
183}
184
185atf_test_case ra_flush_prefix_entries cleanup
186ra_flush_prefix_entries_head()
187{
188
189	atf_set "descr" "Tests for flushing prefixes (ndp -P)"
190	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
191}
192
193ra_flush_prefix_entries_body()
194{
195
196	rump_server_fs_start $RUMPSRV netinet6
197	rump_server_start $RUMPCLI netinet6
198
199	setup_shmif0 ${RUMPSRV} ${IP6SRV}
200	setup_shmif0 ${RUMPCLI} ${IP6CLI}
201
202	init_server $RUMPSRV
203
204	create_rtadvdconfig
205
206	export RUMP_SERVER=${RUMPCLI}
207	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
208	unset RUMP_SERVER
209
210	start_rtadvd $RUMPSRV $PIDFILE
211
212	check_entries $RUMPCLI
213
214	export RUMP_SERVER=${RUMPCLI}
215
216	# Terminate rtadvd to prevent new RA messages from coming
217	# Note that ifconfig down; kill -TERM doesn't work
218	kill -KILL `cat ${PIDFILE}`
219
220	# Flush all the entries in the prefix list
221	atf_check -s exit:0 rump.ndp -P
222
223	$DEBUG && dump_entries
224	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
225	atf_check -s exit:0 -o empty rump.ndp -p
226	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
227	atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
228	atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
229	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
230	unset RUMP_SERVER
231
232	rump_server_destroy_ifaces
233}
234
235ra_flush_prefix_entries_cleanup()
236{
237
238	$DEBUG && dump
239	cleanup
240}
241
242atf_test_case ra_flush_defrouter_entries cleanup
243ra_flush_defrouter_entries_head()
244{
245
246	atf_set "descr" "Tests for flushing default routers (ndp -R)"
247	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
248}
249
250ra_flush_defrouter_entries_body()
251{
252
253	rump_server_fs_start $RUMPSRV netinet6
254	rump_server_start $RUMPCLI netinet6
255
256	setup_shmif0 ${RUMPSRV} ${IP6SRV}
257	setup_shmif0 ${RUMPCLI} ${IP6CLI}
258
259	init_server $RUMPSRV
260
261	create_rtadvdconfig
262
263	export RUMP_SERVER=${RUMPCLI}
264	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
265	unset RUMP_SERVER
266
267	start_rtadvd $RUMPSRV $PIDFILE
268
269	check_entries $RUMPCLI
270
271	export RUMP_SERVER=${RUMPCLI}
272
273	# Terminate rtadvd to prevent new RA messages from coming
274	# Note that ifconfig down; kill -TERM doesn't work
275	kill -KILL `cat ${PIDFILE}`
276
277	# Flush all the entries in the default router list
278	atf_check -s exit:0 rump.ndp -R
279
280	$DEBUG && dump_entries
281	atf_check -s exit:0 -o empty rump.ndp -r
282	atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p
283	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
284	atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
285	atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
286	atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
287	unset RUMP_SERVER
288
289	rump_server_destroy_ifaces
290}
291
292ra_flush_defrouter_entries_cleanup()
293{
294
295	$DEBUG && dump
296	cleanup
297}
298
299atf_test_case ra_delete_address cleanup
300ra_delete_address_head()
301{
302
303	atf_set "descr" "Tests for deleting auto-configured address"
304	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
305}
306
307ra_delete_address_body()
308{
309
310	rump_server_fs_start $RUMPSRV netinet6
311	rump_server_start $RUMPCLI netinet6
312
313	setup_shmif0 ${RUMPSRV} ${IP6SRV}
314	setup_shmif0 ${RUMPCLI} ${IP6CLI}
315
316	init_server $RUMPSRV
317
318	create_rtadvdconfig
319
320	export RUMP_SERVER=${RUMPCLI}
321	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
322	unset RUMP_SERVER
323
324	start_rtadvd $RUMPSRV $PIDFILE
325
326	check_entries $RUMPCLI
327
328	export RUMP_SERVER=${RUMPCLI}
329	$DEBUG && rump.ifconfig shmif0
330	atf_check -s exit:0 rump.ifconfig shmif0 inet6 \
331	    $(rump.ifconfig shmif0 |awk '/AUTOCONF/ {print $2}') delete
332	unset RUMP_SERVER
333
334	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
335	wait_term ${PIDFILE}
336
337	rump_server_destroy_ifaces
338}
339
340ra_delete_address_cleanup()
341{
342
343	if [ -f ${PIDFILE} ]; then
344		kill -TERM `cat ${PIDFILE}`
345		wait_term ${PIDFILE}
346	fi
347
348	$DEBUG && dump
349	cleanup
350}
351
352atf_init_test_cases()
353{
354
355	atf_add_test_case ra_basic
356	atf_add_test_case ra_flush_prefix_entries
357	atf_add_test_case ra_flush_defrouter_entries
358	atf_add_test_case ra_delete_address
359}
360