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