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