t_ra.sh revision 1.14
1#	$NetBSD: t_ra.sh,v 1.14 2016/12/19 02:27:02 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
29RUMPSRV1_2=unix://r12
30RUMPCLI=unix://r2
31RUMPSRV3=unix://r3
32IP6SRV=fc00:1::1
33IP6SRV1_2=fc00:1::2
34IP6SRV_PREFIX=fc00:1:
35IP6CLI=fc00:2::2
36IP6SRV3=fc00:3::1
37IP6SRV3_PREFIX=fc00:3:
38PIDFILE=./rump.rtadvd.pid
39PIDFILE1_2=./rump.rtadvd.pid12
40PIDFILE3=./rump.rtadvd.pid3
41CONFIG=./rtadvd.conf
42DEBUG=${DEBUG:-true}
43
44init_server()
45{
46
47	export RUMP_SERVER=$1
48	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.forwarding=1
49	export LD_PRELOAD=/usr/lib/librumphijack.so
50	atf_check -s exit:0 mkdir -p /rump/var/chroot/rtadvd
51	unset LD_PRELOAD
52	unset RUMP_SERVER
53}
54
55setup_shmif0()
56{
57	local sock=$1
58	local IP6ADDR=$2
59
60	rump_server_add_iface $sock shmif0 bus1
61
62	export RUMP_SERVER=$sock
63	atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6ADDR}
64	atf_check -s exit:0 rump.ifconfig shmif0 up
65	atf_check -s exit:0 rump.ifconfig -w 10
66
67	$DEBUG && rump.ifconfig
68}
69
70wait_term()
71{
72	local PIDFILE=${1}
73	shift
74
75	while [ -f ${PIDFILE} ]
76	do
77		sleep 0.2
78	done
79
80	return 0
81}
82
83create_rtadvdconfig()
84{
85
86	cat << _EOF > ${CONFIG}
87shmif0:\
88	:mtu#1300:maxinterval#4:mininterval#3:
89_EOF
90}
91
92start_rtadvd()
93{
94	local sock=$1
95	local pidfile=$2
96
97	export RUMP_SERVER=$sock
98	atf_check -s exit:0 rump.rtadvd -c ${CONFIG} -p $pidfile shmif0
99	atf_check -s exit:0 sleep 3
100	atf_check -s exit:0 -o ignore -e empty cat $pidfile
101	unset RUMP_SERVER
102}
103
104check_entries()
105{
106	local cli=$1
107	local srv=$2
108	local addr_prefix=$3
109	local mac_srv= ll_srv=
110
111	ll_srv=$(get_linklocal_addr $srv shmif0)
112	mac_srv=$(get_macaddr $srv shmif0)
113
114	export RUMP_SERVER=$cli
115	$DEBUG && dump_entries
116	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
117	atf_check -s exit:0 -o match:'advertised' rump.ndp -p
118	atf_check -s exit:0 -o match:"${ll_srv}%shmif0 \(reachable\)" rump.ndp -p
119	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
120	atf_check -s exit:0 \
121	    -o match:"$ll_srv%shmif0 +$mac_srv +shmif0 +(23h59m|1d0h0m)..s S R" \
122	    rump.ndp -n -a
123	atf_check -s exit:0 -o match:$addr_prefix rump.ndp -n -a
124	atf_check -s exit:0 -o match:$addr_prefix rump.ifconfig shmif0 inet6
125	unset RUMP_SERVER
126}
127
128dump_entries()
129{
130
131	echo ndp -n -a
132	rump.ndp -n -a
133	echo ndp -p
134	rump.ndp -p
135	echo ndp -r
136	rump.ndp -r
137}
138
139atf_test_case ra_basic cleanup
140ra_basic_head()
141{
142
143	atf_set "descr" "Tests for basic functions of router advaertisement(RA)"
144	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
145}
146
147ra_basic_body()
148{
149
150	rump_server_fs_start $RUMPSRV netinet6
151	rump_server_start $RUMPCLI netinet6
152
153	setup_shmif0 ${RUMPSRV} ${IP6SRV}
154	init_server $RUMPSRV
155
156	setup_shmif0 ${RUMPCLI} ${IP6CLI}
157	export RUMP_SERVER=${RUMPCLI}
158	$DEBUG && rump.ndp -n -a
159	atf_check -s exit:0 -o match:'= 0' rump.sysctl net.inet6.ip6.accept_rtadv
160	unset RUMP_SERVER
161
162	create_rtadvdconfig
163	start_rtadvd $RUMPSRV $PIDFILE
164
165	export RUMP_SERVER=${RUMPCLI}
166	atf_check -s exit:0 -o empty rump.ndp -r
167	atf_check -s exit:0 -o not-match:'advertised' rump.ndp -p
168	atf_check -s exit:0 -o match:'linkmtu=0' rump.ndp -n -i shmif0
169	atf_check -s exit:0 -o not-match:'S R' rump.ndp -n -a
170	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
171	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
172	unset RUMP_SERVER
173
174	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
175	wait_term ${PIDFILE}
176
177	export RUMP_SERVER=${RUMPCLI}
178	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
179	unset RUMP_SERVER
180
181	start_rtadvd $RUMPSRV $PIDFILE
182
183	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
184
185	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
186	wait_term ${PIDFILE}
187
188	rump_server_destroy_ifaces
189}
190
191ra_basic_cleanup()
192{
193
194	if [ -f ${PIDFILE} ]; then
195		kill -TERM `cat ${PIDFILE}`
196		wait_term ${PIDFILE}
197	fi
198
199	$DEBUG && dump
200	cleanup
201}
202
203atf_test_case ra_flush_prefix_entries cleanup
204ra_flush_prefix_entries_head()
205{
206
207	atf_set "descr" "Tests for flushing prefixes (ndp -P)"
208	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
209}
210
211ra_flush_prefix_entries_body()
212{
213
214	rump_server_fs_start $RUMPSRV netinet6
215	rump_server_start $RUMPCLI netinet6
216
217	setup_shmif0 ${RUMPSRV} ${IP6SRV}
218	setup_shmif0 ${RUMPCLI} ${IP6CLI}
219
220	init_server $RUMPSRV
221
222	create_rtadvdconfig
223
224	export RUMP_SERVER=${RUMPCLI}
225	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
226	unset RUMP_SERVER
227
228	start_rtadvd $RUMPSRV $PIDFILE
229
230	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
231
232	export RUMP_SERVER=${RUMPCLI}
233
234	# Terminate rtadvd to prevent new RA messages from coming
235	# Note that ifconfig down; kill -TERM doesn't work
236	kill -KILL `cat ${PIDFILE}`
237
238	# Flush all the entries in the prefix list
239	atf_check -s exit:0 rump.ndp -P
240
241	$DEBUG && dump_entries
242	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
243	atf_check -s exit:0 -o empty rump.ndp -p
244	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
245	atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
246	atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
247	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
248	unset RUMP_SERVER
249
250	rump_server_destroy_ifaces
251}
252
253ra_flush_prefix_entries_cleanup()
254{
255
256	$DEBUG && dump
257	cleanup
258}
259
260atf_test_case ra_flush_defrouter_entries cleanup
261ra_flush_defrouter_entries_head()
262{
263
264	atf_set "descr" "Tests for flushing default routers (ndp -R)"
265	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
266}
267
268ra_flush_defrouter_entries_body()
269{
270
271	rump_server_fs_start $RUMPSRV netinet6
272	rump_server_start $RUMPCLI netinet6
273
274	setup_shmif0 ${RUMPSRV} ${IP6SRV}
275	setup_shmif0 ${RUMPCLI} ${IP6CLI}
276
277	init_server $RUMPSRV
278
279	create_rtadvdconfig
280
281	export RUMP_SERVER=${RUMPCLI}
282	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
283	unset RUMP_SERVER
284
285	start_rtadvd $RUMPSRV $PIDFILE
286
287	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
288
289	export RUMP_SERVER=${RUMPCLI}
290
291	# Terminate rtadvd to prevent new RA messages from coming
292	# Note that ifconfig down; kill -TERM doesn't work
293	kill -KILL `cat ${PIDFILE}`
294
295	# Flush all the entries in the default router list
296	atf_check -s exit:0 rump.ndp -R
297
298	$DEBUG && dump_entries
299	atf_check -s exit:0 -o empty rump.ndp -r
300	atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p
301	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
302	atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
303	atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
304	atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
305	unset RUMP_SERVER
306
307	rump_server_destroy_ifaces
308}
309
310ra_flush_defrouter_entries_cleanup()
311{
312
313	$DEBUG && dump
314	cleanup
315}
316
317atf_test_case ra_delete_address cleanup
318ra_delete_address_head()
319{
320
321	atf_set "descr" "Tests for deleting auto-configured address"
322	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
323}
324
325ra_delete_address_body()
326{
327
328	rump_server_fs_start $RUMPSRV netinet6
329	rump_server_start $RUMPCLI netinet6
330
331	setup_shmif0 ${RUMPSRV} ${IP6SRV}
332	setup_shmif0 ${RUMPCLI} ${IP6CLI}
333
334	init_server $RUMPSRV
335
336	create_rtadvdconfig
337
338	export RUMP_SERVER=${RUMPCLI}
339	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
340	unset RUMP_SERVER
341
342	start_rtadvd $RUMPSRV $PIDFILE
343
344	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
345
346	export RUMP_SERVER=${RUMPCLI}
347	$DEBUG && rump.ifconfig shmif0
348	atf_check -s exit:0 rump.ifconfig shmif0 inet6 \
349	    $(rump.ifconfig shmif0 |awk '/AUTOCONF/ {print $2}') delete
350	unset RUMP_SERVER
351
352	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
353	wait_term ${PIDFILE}
354
355	rump_server_destroy_ifaces
356}
357
358ra_delete_address_cleanup()
359{
360
361	if [ -f ${PIDFILE} ]; then
362		kill -TERM `cat ${PIDFILE}`
363		wait_term ${PIDFILE}
364	fi
365
366	$DEBUG && dump
367	cleanup
368}
369
370atf_test_case ra_multiple_routers cleanup
371ra_multiple_routers_head()
372{
373
374	atf_set "descr" "Tests for multiple routers"
375	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
376}
377
378ra_multiple_routers_body()
379{
380	local n=
381
382	rump_server_fs_start $RUMPSRV netinet6
383	rump_server_fs_start $RUMPSRV3 netinet6
384	rump_server_start $RUMPCLI netinet6
385
386	setup_shmif0 ${RUMPSRV} ${IP6SRV}
387	setup_shmif0 ${RUMPSRV3} ${IP6SRV3}
388	setup_shmif0 ${RUMPCLI} ${IP6CLI}
389
390	init_server $RUMPSRV
391	init_server $RUMPSRV3
392
393	create_rtadvdconfig
394
395	export RUMP_SERVER=${RUMPCLI}
396	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
397	unset RUMP_SERVER
398
399	start_rtadvd $RUMPSRV $PIDFILE
400	start_rtadvd $RUMPSRV3 $PIDFILE3
401
402	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
403	check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX
404
405	export RUMP_SERVER=$RUMPCLI
406	# Two prefixes are advertised by differnt two routers
407	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
408	atf_check_equal $n 2
409	unset RUMP_SERVER
410
411	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
412	wait_term ${PIDFILE}
413	atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}`
414	wait_term ${PIDFILE3}
415
416	rump_server_destroy_ifaces
417}
418
419ra_multiple_routers_cleanup()
420{
421
422	if [ -f ${PIDFILE} ]; then
423		kill -TERM `cat ${PIDFILE}`
424		wait_term ${PIDFILE}
425	fi
426	if [ -f ${PIDFILE3} ]; then
427		kill -TERM `cat ${PIDFILE3}`
428		wait_term ${PIDFILE3}
429	fi
430
431	$DEBUG && dump
432	cleanup
433}
434
435atf_test_case ra_multiple_routers_single_prefix cleanup
436ra_multiple_routers_single_prefix_head()
437{
438
439	atf_set "descr" "Tests for multiple routers with a single prefix"
440	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
441}
442
443ra_multiple_routers_single_prefix_body()
444{
445	local n=
446
447	rump_server_fs_start $RUMPSRV netinet6
448	rump_server_fs_start $RUMPSRV1_2 netinet6
449	rump_server_start $RUMPCLI netinet6
450
451	setup_shmif0 ${RUMPSRV} ${IP6SRV}
452	setup_shmif0 ${RUMPSRV1_2} ${IP6SRV1_2}
453	setup_shmif0 ${RUMPCLI} ${IP6CLI}
454
455	init_server $RUMPSRV
456	init_server $RUMPSRV1_2
457
458	create_rtadvdconfig
459
460	export RUMP_SERVER=${RUMPCLI}
461	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
462	unset RUMP_SERVER
463
464	start_rtadvd $RUMPSRV $PIDFILE
465	start_rtadvd $RUMPSRV1_2 $PIDFILE1_2
466
467	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
468	check_entries $RUMPCLI $RUMPSRV1_2 $IP6SRV_PREFIX
469
470	export RUMP_SERVER=$RUMPCLI
471	# One prefix is advertised by differnt two routers
472	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
473	atf_check_equal $n 1
474	unset RUMP_SERVER
475
476	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
477	wait_term ${PIDFILE}
478	atf_check -s exit:0 kill -TERM `cat ${PIDFILE1_2}`
479	wait_term ${PIDFILE1_2}
480
481	rump_server_destroy_ifaces
482}
483
484ra_multiple_routers_single_prefix_cleanup()
485{
486
487	if [ -f ${PIDFILE} ]; then
488		kill -TERM `cat ${PIDFILE}`
489		wait_term ${PIDFILE}
490	fi
491	if [ -f ${PIDFILE1_2} ]; then
492		kill -TERM `cat ${PIDFILE1_2}`
493		wait_term ${PIDFILE1_2}
494	fi
495
496	$DEBUG && dump
497	cleanup
498}
499
500atf_init_test_cases()
501{
502
503	atf_add_test_case ra_basic
504	atf_add_test_case ra_flush_prefix_entries
505	atf_add_test_case ra_flush_defrouter_entries
506	atf_add_test_case ra_delete_address
507	atf_add_test_case ra_multiple_routers
508	atf_add_test_case ra_multiple_routers_single_prefix
509}
510