t_ra.sh revision 1.28
1#	$NetBSD: t_ra.sh,v 1.28 2017/06/21 09:05:31 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:-false}
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
97create_rtadvdconfig_rltime()
98{
99	local time=$1
100
101	cat << _EOF > ${CONFIG}
102shmif0:\
103	:mtu#1300:maxinterval#4:mininterval#3:rltime#$time:
104_EOF
105	$DEBUG && cat ${CONFIG}
106}
107
108create_rtadvdconfig_vltime()
109{
110	local addr=$1
111	local time=$2
112
113	cat << _EOF > ${CONFIG}
114shmif0:\
115	:mtu#1300:maxinterval#4:mininterval#3:addr="$addr":vltime#$time:
116_EOF
117	$DEBUG && cat ${CONFIG}
118}
119
120start_rtadvd()
121{
122	local sock=$1
123	local pidfile=$2
124
125	export RUMP_SERVER=$sock
126	atf_check -s exit:0 rump.rtadvd -c ${CONFIG} -p $pidfile shmif0
127	while [ ! -f $pidfile ]; do
128		sleep 0.2
129	done
130	unset RUMP_SERVER
131}
132
133check_entries()
134{
135	local cli=$1
136	local srv=$2
137	local addr_prefix=$3
138	local mac_srv= ll_srv=
139
140	ll_srv=$(get_linklocal_addr $srv shmif0)
141	mac_srv=$(get_macaddr $srv shmif0)
142
143	export RUMP_SERVER=$cli
144	$DEBUG && dump_entries
145	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
146	atf_check -s exit:0 -o match:'advertised' rump.ndp -p
147	atf_check -s exit:0 -o match:"${ll_srv}%shmif0 \(reachable\)" rump.ndp -p
148	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
149	atf_check -s exit:0 \
150	    -o match:"$ll_srv%shmif0 +$mac_srv +shmif0 +$ONEDAYISH S R" \
151	    rump.ndp -n -a
152	atf_check -s exit:0 -o not-match:$addr_prefix rump.ndp -n -a
153	atf_check -s exit:0 \
154	    -o match:"$addr_prefix.+<(TENTATIVE,)?AUTOCONF>" \
155	    rump.ifconfig shmif0 inet6
156	unset RUMP_SERVER
157}
158
159dump_entries()
160{
161
162	echo ndp -n -a
163	rump.ndp -n -a
164	echo ndp -p
165	rump.ndp -p
166	echo ndp -r
167	rump.ndp -r
168}
169
170atf_test_case ra_basic cleanup
171ra_basic_head()
172{
173
174	atf_set "descr" "Tests for basic functions of router advaertisement(RA)"
175	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
176}
177
178ra_basic_body()
179{
180
181	rump_server_fs_start $RUMPSRV netinet6
182	rump_server_start $RUMPCLI netinet6
183
184	setup_shmif0 ${RUMPSRV} ${IP6SRV}
185	init_server $RUMPSRV
186
187	setup_shmif0 ${RUMPCLI} ${IP6CLI}
188	export RUMP_SERVER=${RUMPCLI}
189	$DEBUG && rump.ndp -n -a
190	atf_check -s exit:0 -o match:'= 0' rump.sysctl net.inet6.ip6.accept_rtadv
191	unset RUMP_SERVER
192
193	create_rtadvdconfig
194	start_rtadvd $RUMPSRV $PIDFILE
195	sleep $WAITTIME
196
197	export RUMP_SERVER=${RUMPCLI}
198	atf_check -s exit:0 -o empty rump.ndp -r
199	atf_check -s exit:0 -o not-match:'advertised' rump.ndp -p
200	atf_check -s exit:0 -o match:'linkmtu=0' rump.ndp -n -i shmif0
201	atf_check -s exit:0 -o not-match:'S R' rump.ndp -n -a
202	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
203	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
204	unset RUMP_SERVER
205
206	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
207	wait_term ${PIDFILE}
208
209	export RUMP_SERVER=${RUMPCLI}
210	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
211	unset RUMP_SERVER
212
213	start_rtadvd $RUMPSRV $PIDFILE
214	sleep $WAITTIME
215
216	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
217
218	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
219	wait_term ${PIDFILE}
220
221	rump_server_destroy_ifaces
222}
223
224ra_basic_cleanup()
225{
226
227	if [ -f ${PIDFILE} ]; then
228		kill -TERM `cat ${PIDFILE}`
229		wait_term ${PIDFILE}
230	fi
231
232	$DEBUG && dump
233	cleanup
234}
235
236atf_test_case ra_flush_prefix_entries cleanup
237ra_flush_prefix_entries_head()
238{
239
240	atf_set "descr" "Tests for flushing prefixes (ndp -P)"
241	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
242}
243
244ra_flush_prefix_entries_body()
245{
246
247	rump_server_fs_start $RUMPSRV netinet6
248	rump_server_start $RUMPCLI netinet6
249
250	setup_shmif0 ${RUMPSRV} ${IP6SRV}
251	setup_shmif0 ${RUMPCLI} ${IP6CLI}
252
253	init_server $RUMPSRV
254
255	create_rtadvdconfig
256
257	export RUMP_SERVER=${RUMPCLI}
258	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
259	unset RUMP_SERVER
260
261	start_rtadvd $RUMPSRV $PIDFILE
262	sleep $WAITTIME
263
264	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
265
266	export RUMP_SERVER=${RUMPCLI}
267
268	# Terminate rtadvd to prevent new RA messages from coming
269	# Note that ifconfig down; kill -TERM doesn't work
270	kill -KILL `cat ${PIDFILE}`
271
272	# Flush all the entries in the prefix list
273	atf_check -s exit:0 rump.ndp -P
274
275	$DEBUG && dump_entries
276	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
277	atf_check -s exit:0 -o empty rump.ndp -p
278	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
279	atf_check -s exit:0 -o match:"$ONEDAYISH S R" rump.ndp -n -a
280	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
281	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
282	unset RUMP_SERVER
283
284	rump_server_destroy_ifaces
285}
286
287ra_flush_prefix_entries_cleanup()
288{
289
290	$DEBUG && dump
291	cleanup
292}
293
294atf_test_case ra_flush_defrouter_entries cleanup
295ra_flush_defrouter_entries_head()
296{
297
298	atf_set "descr" "Tests for flushing default routers (ndp -R)"
299	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
300}
301
302ra_flush_defrouter_entries_body()
303{
304
305	rump_server_fs_start $RUMPSRV netinet6
306	rump_server_start $RUMPCLI netinet6
307
308	setup_shmif0 ${RUMPSRV} ${IP6SRV}
309	setup_shmif0 ${RUMPCLI} ${IP6CLI}
310
311	init_server $RUMPSRV
312
313	create_rtadvdconfig
314
315	export RUMP_SERVER=${RUMPCLI}
316	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
317	unset RUMP_SERVER
318
319	start_rtadvd $RUMPSRV $PIDFILE
320	sleep $WAITTIME
321
322	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
323
324	export RUMP_SERVER=${RUMPCLI}
325
326	# Terminate rtadvd to prevent new RA messages from coming
327	# Note that ifconfig down; kill -TERM doesn't work
328	kill -KILL `cat ${PIDFILE}`
329
330	# Flush all the entries in the default router list
331	atf_check -s exit:0 rump.ndp -R
332
333	$DEBUG && dump_entries
334	atf_check -s exit:0 -o empty rump.ndp -r
335	atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p
336	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
337	atf_check -s exit:0 -o match:"$ONEDAYISH S R" rump.ndp -n -a
338	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
339	atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
340	unset RUMP_SERVER
341
342	rump_server_destroy_ifaces
343}
344
345ra_flush_defrouter_entries_cleanup()
346{
347
348	$DEBUG && dump
349	cleanup
350}
351
352atf_test_case ra_delete_address cleanup
353ra_delete_address_head()
354{
355
356	atf_set "descr" "Tests for deleting auto-configured address"
357	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
358}
359
360ra_delete_address_body()
361{
362
363	rump_server_fs_start $RUMPSRV netinet6
364	rump_server_start $RUMPCLI netinet6
365
366	setup_shmif0 ${RUMPSRV} ${IP6SRV}
367	setup_shmif0 ${RUMPCLI} ${IP6CLI}
368
369	init_server $RUMPSRV
370
371	create_rtadvdconfig
372
373	export RUMP_SERVER=${RUMPCLI}
374	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
375	unset RUMP_SERVER
376
377	start_rtadvd $RUMPSRV $PIDFILE
378	sleep $WAITTIME
379
380	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
381
382	export RUMP_SERVER=${RUMPCLI}
383	$DEBUG && rump.ifconfig shmif0
384	atf_check -s exit:0 rump.ifconfig shmif0 inet6 \
385	    $(rump.ifconfig shmif0 |awk '/AUTOCONF/ {print $2}') delete
386	unset RUMP_SERVER
387
388	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
389	wait_term ${PIDFILE}
390
391	rump_server_destroy_ifaces
392}
393
394ra_delete_address_cleanup()
395{
396
397	if [ -f ${PIDFILE} ]; then
398		kill -TERM `cat ${PIDFILE}`
399		wait_term ${PIDFILE}
400	fi
401
402	$DEBUG && dump
403	cleanup
404}
405
406atf_test_case ra_multiple_routers cleanup
407ra_multiple_routers_head()
408{
409
410	atf_set "descr" "Tests for multiple routers"
411	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
412}
413
414ra_multiple_routers_body()
415{
416	local n=
417
418	rump_server_fs_start $RUMPSRV netinet6
419	rump_server_fs_start $RUMPSRV3 netinet6
420	rump_server_start $RUMPCLI netinet6
421
422	setup_shmif0 ${RUMPSRV} ${IP6SRV}
423	setup_shmif0 ${RUMPSRV3} ${IP6SRV3}
424	setup_shmif0 ${RUMPCLI} ${IP6CLI}
425
426	init_server $RUMPSRV
427	init_server $RUMPSRV3
428
429	create_rtadvdconfig
430
431	export RUMP_SERVER=${RUMPCLI}
432	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
433	unset RUMP_SERVER
434
435	start_rtadvd $RUMPSRV $PIDFILE
436	start_rtadvd $RUMPSRV3 $PIDFILE3
437	sleep $WAITTIME
438
439	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
440	check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX
441
442	export RUMP_SERVER=$RUMPCLI
443	# Two prefixes are advertised by differnt two routers
444	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
445	atf_check_equal $n 2
446	unset RUMP_SERVER
447
448	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
449	wait_term ${PIDFILE}
450	atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}`
451	wait_term ${PIDFILE3}
452
453	rump_server_destroy_ifaces
454}
455
456ra_multiple_routers_cleanup()
457{
458
459	if [ -f ${PIDFILE} ]; then
460		kill -TERM `cat ${PIDFILE}`
461		wait_term ${PIDFILE}
462	fi
463	if [ -f ${PIDFILE3} ]; then
464		kill -TERM `cat ${PIDFILE3}`
465		wait_term ${PIDFILE3}
466	fi
467
468	$DEBUG && dump
469	cleanup
470}
471
472atf_test_case ra_multiple_routers_single_prefix cleanup
473ra_multiple_routers_single_prefix_head()
474{
475
476	atf_set "descr" "Tests for multiple routers with a single prefix"
477	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
478}
479
480ra_multiple_routers_single_prefix_body()
481{
482	local n=
483
484	rump_server_fs_start $RUMPSRV netinet6
485	rump_server_fs_start $RUMPSRV1_2 netinet6
486	rump_server_start $RUMPCLI netinet6
487
488	setup_shmif0 ${RUMPSRV} ${IP6SRV}
489	setup_shmif0 ${RUMPSRV1_2} ${IP6SRV1_2}
490	setup_shmif0 ${RUMPCLI} ${IP6CLI}
491
492	init_server $RUMPSRV
493	init_server $RUMPSRV1_2
494
495	create_rtadvdconfig
496
497	export RUMP_SERVER=${RUMPCLI}
498	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
499	unset RUMP_SERVER
500
501	start_rtadvd $RUMPSRV $PIDFILE
502	start_rtadvd $RUMPSRV1_2 $PIDFILE1_2
503	sleep $WAITTIME
504
505	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
506	check_entries $RUMPCLI $RUMPSRV1_2 $IP6SRV_PREFIX
507
508	export RUMP_SERVER=$RUMPCLI
509	# One prefix is advertised by differnt two routers
510	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
511	atf_check_equal $n 1
512	unset RUMP_SERVER
513
514	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
515	wait_term ${PIDFILE}
516	atf_check -s exit:0 kill -TERM `cat ${PIDFILE1_2}`
517	wait_term ${PIDFILE1_2}
518
519	rump_server_destroy_ifaces
520}
521
522ra_multiple_routers_single_prefix_cleanup()
523{
524
525	if [ -f ${PIDFILE} ]; then
526		kill -TERM `cat ${PIDFILE}`
527		wait_term ${PIDFILE}
528	fi
529	if [ -f ${PIDFILE1_2} ]; then
530		kill -TERM `cat ${PIDFILE1_2}`
531		wait_term ${PIDFILE1_2}
532	fi
533
534	$DEBUG && dump
535	cleanup
536}
537
538atf_test_case ra_multiple_routers_maxifprefixes cleanup
539ra_multiple_routers_maxifprefixes_head()
540{
541
542	atf_set "descr" "Tests for exceeding the number of maximum prefixes"
543	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
544}
545
546ra_multiple_routers_maxifprefixes_body()
547{
548	local n=
549
550	rump_server_fs_start $RUMPSRV netinet6
551	rump_server_fs_start $RUMPSRV3 netinet6
552	rump_server_fs_start $RUMPSRV4 netinet6
553	rump_server_start $RUMPCLI netinet6
554
555	setup_shmif0 ${RUMPSRV} ${IP6SRV}
556	setup_shmif0 ${RUMPSRV3} ${IP6SRV3}
557	setup_shmif0 ${RUMPSRV4} ${IP6SRV4}
558	setup_shmif0 ${RUMPCLI} ${IP6CLI}
559
560	init_server $RUMPSRV
561	init_server $RUMPSRV3
562	init_server $RUMPSRV4
563
564	create_rtadvdconfig
565
566	export RUMP_SERVER=${RUMPCLI}
567	atf_check -s exit:0 -o match:'0.->.1' \
568	    rump.sysctl -w net.inet6.ip6.accept_rtadv=1
569	# Limit the maximum number of prefix entries to 2
570	atf_check -s exit:0 -o match:'16.->.2' \
571	    rump.sysctl -w net.inet6.ip6.maxifprefixes=2
572	unset RUMP_SERVER
573
574	start_rtadvd $RUMPSRV $PIDFILE
575	start_rtadvd $RUMPSRV3 $PIDFILE3
576	sleep $WAITTIME
577
578	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
579	check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX
580
581	start_rtadvd $RUMPSRV4 $PIDFILE4
582	sleep $WAITTIME
583
584	export RUMP_SERVER=${RUMPCLI}
585	$DEBUG && dump_entries
586	# There should remain two prefixes
587	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
588	atf_check_equal $n 2
589	# TODO check other conditions
590	unset RUMP_SERVER
591
592	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
593	wait_term ${PIDFILE}
594	atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}`
595	wait_term ${PIDFILE3}
596	atf_check -s exit:0 kill -TERM `cat ${PIDFILE4}`
597	wait_term ${PIDFILE4}
598
599	rump_server_destroy_ifaces
600}
601
602ra_multiple_routers_maxifprefixes_cleanup()
603{
604
605	if [ -f ${PIDFILE} ]; then
606		kill -TERM `cat ${PIDFILE}`
607		wait_term ${PIDFILE}
608	fi
609	if [ -f ${PIDFILE3} ]; then
610		kill -TERM `cat ${PIDFILE3}`
611		wait_term ${PIDFILE3}
612	fi
613	if [ -f ${PIDFILE4} ]; then
614		kill -TERM `cat ${PIDFILE4}`
615		wait_term ${PIDFILE4}
616	fi
617
618	$DEBUG && dump
619	cleanup
620}
621
622atf_test_case ra_temporary_address cleanup
623ra_temporary_address_head()
624{
625
626	atf_set "descr" "Tests for IPv6 temporary address"
627	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
628}
629
630check_echo_request_pkt()
631{
632	local pkt="$2 > $3: .+ echo request"
633
634	extract_new_packets $1 > ./out
635	$DEBUG && echo $pkt
636	$DEBUG && cat ./out
637	atf_check -s exit:0 -o match:"$pkt" cat ./out
638}
639
640ra_temporary_address_body()
641{
642	local ip_auto= ip_temp=
643
644	rump_server_fs_start $RUMPSRV netinet6
645	rump_server_start $RUMPCLI netinet6
646
647	setup_shmif0 $RUMPSRV $IP6SRV
648	init_server $RUMPSRV
649	setup_shmif0 $RUMPCLI $IP6CLI
650
651	export RUMP_SERVER=$RUMPCLI
652	atf_check -s exit:0 -o match:'0.->.1' \
653	    rump.sysctl -w net.inet6.ip6.accept_rtadv=1
654	atf_check -s exit:0 -o match:'0.->.1' \
655	    rump.sysctl -w net.inet6.ip6.use_tempaddr=1
656	unset RUMP_SERVER
657
658	create_rtadvdconfig
659	start_rtadvd $RUMPSRV $PIDFILE
660	sleep $WAITTIME
661
662	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
663
664	export RUMP_SERVER=$RUMPCLI
665
666	# Check temporary address
667	atf_check -s exit:0 \
668	    -o match:"$IP6SRV_PREFIX.+<(TENTATIVE,)?AUTOCONF,TEMPORARY>" \
669	    rump.ifconfig shmif0 inet6
670
671	#
672	# Testing net.inet6.ip6.prefer_tempaddr
673	#
674	atf_check -s exit:0 rump.ifconfig -w 10
675	$DEBUG && rump.ifconfig shmif0
676	ip_auto=$(rump.ifconfig shmif0 |awk '/<AUTOCONF>/ {sub(/\/[0-9]*/, ""); print $2;}')
677	ip_temp=$(rump.ifconfig shmif0 |awk '/<AUTOCONF,TEMPORARY>/ {sub(/\/[0-9]*/, ""); print $2;}')
678	$DEBUG && echo $ip_auto $ip_temp
679
680	# Ignore old packets
681	extract_new_packets bus1 > /dev/null
682
683	atf_check -s exit:0 -o ignore rump.ping6 -n -X 2 -c 1 $IP6SRV
684	# autoconf (non-temporal) address should be used as the source address
685	check_echo_request_pkt bus1 $ip_auto $IP6SRV
686
687	# Enable net.inet6.ip6.prefer_tempaddr
688	atf_check -s exit:0 -o match:'0.->.1' \
689	    rump.sysctl -w net.inet6.ip6.prefer_tempaddr=1
690
691	atf_check -s exit:0 -o ignore rump.ping6 -n -X 2 -c 1 $IP6SRV
692	# autoconf, temporal address should be used as the source address
693	check_echo_request_pkt bus1 $ip_temp $IP6SRV
694
695	unset RUMP_SERVER
696
697	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
698	wait_term $PIDFILE
699
700	rump_server_destroy_ifaces
701}
702
703ra_temporary_address_cleanup()
704{
705
706	if [ -f ${PIDFILE} ]; then
707		kill -TERM `cat ${PIDFILE}`
708		wait_term ${PIDFILE}
709	fi
710
711	$DEBUG && dump
712	cleanup
713}
714
715atf_test_case ra_defrouter_expiration cleanup
716ra_defrouter_expiration_head()
717{
718
719	atf_set "descr" "Tests for default router expiration"
720	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
721}
722
723ra_defrouter_expiration_body()
724{
725	local expire_time=5
726
727	rump_server_fs_start $RUMPSRV netinet6
728	rump_server_start $RUMPCLI netinet6
729
730	setup_shmif0 ${RUMPSRV} ${IP6SRV}
731	setup_shmif0 ${RUMPCLI} ${IP6CLI}
732
733	init_server $RUMPSRV
734
735	create_rtadvdconfig_rltime $expire_time
736
737	export RUMP_SERVER=${RUMPCLI}
738	atf_check -s exit:0 -o match:'0.->.1' \
739	    rump.sysctl -w net.inet6.ip6.accept_rtadv=1
740	unset RUMP_SERVER
741
742	start_rtadvd $RUMPSRV $PIDFILE
743	sleep $WAITTIME
744
745	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
746
747	export RUMP_SERVER=${RUMPCLI}
748
749	# Terminate rtadvd to prevent new RA messages from coming
750	# Note that ifconfig down; kill -TERM doesn't work
751	kill -KILL `cat ${PIDFILE}`
752
753	# Wait until the default routers and prefix entries are expired
754	sleep $expire_time
755
756	$DEBUG && dump_entries
757
758	# Give nd6_timer a chance to sweep default routers and prefix entries
759	sleep 2
760
761	$DEBUG && dump_entries
762	atf_check -s exit:0 -o not-match:'if=shmif0' rump.ndp -r
763	atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p
764	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
765	atf_check -s exit:0 -o match:"$ONEDAYISH S R" rump.ndp -n -a
766	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
767	atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
768	unset RUMP_SERVER
769
770	rump_server_destroy_ifaces
771}
772
773ra_defrouter_expiration_cleanup()
774{
775
776	$DEBUG && dump
777	cleanup
778}
779
780atf_test_case ra_prefix_expiration cleanup
781ra_prefix_expiration_head()
782{
783
784	atf_set "descr" "Tests for prefix expiration"
785	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
786}
787
788ra_prefix_expiration_body()
789{
790	local expire_time=5
791
792	rump_server_fs_start $RUMPSRV netinet6
793	rump_server_start $RUMPCLI netinet6
794
795	setup_shmif0 ${RUMPSRV} ${IP6SRV}
796	setup_shmif0 ${RUMPCLI} ${IP6CLI}
797
798	init_server $RUMPSRV
799
800	create_rtadvdconfig_vltime "${IP6SRV_PREFIX}:" $expire_time
801
802	export RUMP_SERVER=${RUMPCLI}
803	atf_check -s exit:0 -o match:'0.->.1' \
804	    rump.sysctl -w net.inet6.ip6.accept_rtadv=1
805	unset RUMP_SERVER
806
807	start_rtadvd $RUMPSRV $PIDFILE
808	sleep $WAITTIME
809
810	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
811
812	export RUMP_SERVER=${RUMPCLI}
813
814	# Terminate rtadvd to prevent new RA messages from coming
815	# Note that ifconfig down; kill -TERM doesn't work
816	kill -KILL `cat ${PIDFILE}`
817
818	# Wait until the default routers and prefix entries are expired
819	sleep $expire_time
820
821	$DEBUG && dump_entries
822
823	# Give nd6_timer a chance to sweep default routers and prefix entries
824	sleep 2
825
826	$DEBUG && dump_entries
827	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
828	atf_check -s exit:0 -o empty rump.ndp -p
829	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
830	atf_check -s exit:0 -o match:"$ONEDAYISH S R" rump.ndp -n -a
831	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
832	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
833	unset RUMP_SERVER
834
835	rump_server_destroy_ifaces
836}
837
838ra_prefix_expiration_cleanup()
839{
840
841	$DEBUG && dump
842	cleanup
843}
844
845atf_init_test_cases()
846{
847
848	atf_add_test_case ra_basic
849	atf_add_test_case ra_flush_prefix_entries
850	atf_add_test_case ra_flush_defrouter_entries
851	atf_add_test_case ra_delete_address
852	atf_add_test_case ra_multiple_routers
853	atf_add_test_case ra_multiple_routers_single_prefix
854	atf_add_test_case ra_multiple_routers_maxifprefixes
855	atf_add_test_case ra_temporary_address
856	atf_add_test_case ra_defrouter_expiration
857	atf_add_test_case ra_prefix_expiration
858}
859