t_ra.sh revision 1.29
1#	$NetBSD: t_ra.sh,v 1.29 2017/06/22 09:56:48 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 not-match:'fc00:1:' rump.ndp -n -a
338	atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
339	unset RUMP_SERVER
340
341	rump_server_destroy_ifaces
342}
343
344ra_flush_defrouter_entries_cleanup()
345{
346
347	$DEBUG && dump
348	cleanup
349}
350
351atf_test_case ra_delete_address cleanup
352ra_delete_address_head()
353{
354
355	atf_set "descr" "Tests for deleting auto-configured address"
356	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
357}
358
359ra_delete_address_body()
360{
361
362	rump_server_fs_start $RUMPSRV netinet6
363	rump_server_start $RUMPCLI netinet6
364
365	setup_shmif0 ${RUMPSRV} ${IP6SRV}
366	setup_shmif0 ${RUMPCLI} ${IP6CLI}
367
368	init_server $RUMPSRV
369
370	create_rtadvdconfig
371
372	export RUMP_SERVER=${RUMPCLI}
373	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
374	unset RUMP_SERVER
375
376	start_rtadvd $RUMPSRV $PIDFILE
377	sleep $WAITTIME
378
379	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
380
381	export RUMP_SERVER=${RUMPCLI}
382	$DEBUG && rump.ifconfig shmif0
383	atf_check -s exit:0 rump.ifconfig shmif0 inet6 \
384	    $(rump.ifconfig shmif0 |awk '/AUTOCONF/ {print $2}') delete
385	unset RUMP_SERVER
386
387	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
388	wait_term ${PIDFILE}
389
390	rump_server_destroy_ifaces
391}
392
393ra_delete_address_cleanup()
394{
395
396	if [ -f ${PIDFILE} ]; then
397		kill -TERM `cat ${PIDFILE}`
398		wait_term ${PIDFILE}
399	fi
400
401	$DEBUG && dump
402	cleanup
403}
404
405atf_test_case ra_multiple_routers cleanup
406ra_multiple_routers_head()
407{
408
409	atf_set "descr" "Tests for multiple routers"
410	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
411}
412
413ra_multiple_routers_body()
414{
415	local n=
416
417	rump_server_fs_start $RUMPSRV netinet6
418	rump_server_fs_start $RUMPSRV3 netinet6
419	rump_server_start $RUMPCLI netinet6
420
421	setup_shmif0 ${RUMPSRV} ${IP6SRV}
422	setup_shmif0 ${RUMPSRV3} ${IP6SRV3}
423	setup_shmif0 ${RUMPCLI} ${IP6CLI}
424
425	init_server $RUMPSRV
426	init_server $RUMPSRV3
427
428	create_rtadvdconfig
429
430	export RUMP_SERVER=${RUMPCLI}
431	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
432	unset RUMP_SERVER
433
434	start_rtadvd $RUMPSRV $PIDFILE
435	start_rtadvd $RUMPSRV3 $PIDFILE3
436	sleep $WAITTIME
437
438	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
439	check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX
440
441	export RUMP_SERVER=$RUMPCLI
442	# Two prefixes are advertised by differnt two routers
443	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
444	atf_check_equal $n 2
445	unset RUMP_SERVER
446
447	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
448	wait_term ${PIDFILE}
449	atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}`
450	wait_term ${PIDFILE3}
451
452	rump_server_destroy_ifaces
453}
454
455ra_multiple_routers_cleanup()
456{
457
458	if [ -f ${PIDFILE} ]; then
459		kill -TERM `cat ${PIDFILE}`
460		wait_term ${PIDFILE}
461	fi
462	if [ -f ${PIDFILE3} ]; then
463		kill -TERM `cat ${PIDFILE3}`
464		wait_term ${PIDFILE3}
465	fi
466
467	$DEBUG && dump
468	cleanup
469}
470
471atf_test_case ra_multiple_routers_single_prefix cleanup
472ra_multiple_routers_single_prefix_head()
473{
474
475	atf_set "descr" "Tests for multiple routers with a single prefix"
476	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
477}
478
479ra_multiple_routers_single_prefix_body()
480{
481	local n=
482
483	rump_server_fs_start $RUMPSRV netinet6
484	rump_server_fs_start $RUMPSRV1_2 netinet6
485	rump_server_start $RUMPCLI netinet6
486
487	setup_shmif0 ${RUMPSRV} ${IP6SRV}
488	setup_shmif0 ${RUMPSRV1_2} ${IP6SRV1_2}
489	setup_shmif0 ${RUMPCLI} ${IP6CLI}
490
491	init_server $RUMPSRV
492	init_server $RUMPSRV1_2
493
494	create_rtadvdconfig
495
496	export RUMP_SERVER=${RUMPCLI}
497	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
498	unset RUMP_SERVER
499
500	start_rtadvd $RUMPSRV $PIDFILE
501	start_rtadvd $RUMPSRV1_2 $PIDFILE1_2
502	sleep $WAITTIME
503
504	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
505	check_entries $RUMPCLI $RUMPSRV1_2 $IP6SRV_PREFIX
506
507	export RUMP_SERVER=$RUMPCLI
508	# One prefix is advertised by differnt two routers
509	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
510	atf_check_equal $n 1
511	unset RUMP_SERVER
512
513	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
514	wait_term ${PIDFILE}
515	atf_check -s exit:0 kill -TERM `cat ${PIDFILE1_2}`
516	wait_term ${PIDFILE1_2}
517
518	rump_server_destroy_ifaces
519}
520
521ra_multiple_routers_single_prefix_cleanup()
522{
523
524	if [ -f ${PIDFILE} ]; then
525		kill -TERM `cat ${PIDFILE}`
526		wait_term ${PIDFILE}
527	fi
528	if [ -f ${PIDFILE1_2} ]; then
529		kill -TERM `cat ${PIDFILE1_2}`
530		wait_term ${PIDFILE1_2}
531	fi
532
533	$DEBUG && dump
534	cleanup
535}
536
537atf_test_case ra_multiple_routers_maxifprefixes cleanup
538ra_multiple_routers_maxifprefixes_head()
539{
540
541	atf_set "descr" "Tests for exceeding the number of maximum prefixes"
542	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
543}
544
545ra_multiple_routers_maxifprefixes_body()
546{
547	local n=
548
549	rump_server_fs_start $RUMPSRV netinet6
550	rump_server_fs_start $RUMPSRV3 netinet6
551	rump_server_fs_start $RUMPSRV4 netinet6
552	rump_server_start $RUMPCLI netinet6
553
554	setup_shmif0 ${RUMPSRV} ${IP6SRV}
555	setup_shmif0 ${RUMPSRV3} ${IP6SRV3}
556	setup_shmif0 ${RUMPSRV4} ${IP6SRV4}
557	setup_shmif0 ${RUMPCLI} ${IP6CLI}
558
559	init_server $RUMPSRV
560	init_server $RUMPSRV3
561	init_server $RUMPSRV4
562
563	create_rtadvdconfig
564
565	export RUMP_SERVER=${RUMPCLI}
566	atf_check -s exit:0 -o match:'0.->.1' \
567	    rump.sysctl -w net.inet6.ip6.accept_rtadv=1
568	# Limit the maximum number of prefix entries to 2
569	atf_check -s exit:0 -o match:'16.->.2' \
570	    rump.sysctl -w net.inet6.ip6.maxifprefixes=2
571	unset RUMP_SERVER
572
573	start_rtadvd $RUMPSRV $PIDFILE
574	start_rtadvd $RUMPSRV3 $PIDFILE3
575	sleep $WAITTIME
576
577	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
578	check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX
579
580	start_rtadvd $RUMPSRV4 $PIDFILE4
581	sleep $WAITTIME
582
583	export RUMP_SERVER=${RUMPCLI}
584	$DEBUG && dump_entries
585	# There should remain two prefixes
586	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
587	atf_check_equal $n 2
588	# TODO check other conditions
589	unset RUMP_SERVER
590
591	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
592	wait_term ${PIDFILE}
593	atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}`
594	wait_term ${PIDFILE3}
595	atf_check -s exit:0 kill -TERM `cat ${PIDFILE4}`
596	wait_term ${PIDFILE4}
597
598	rump_server_destroy_ifaces
599}
600
601ra_multiple_routers_maxifprefixes_cleanup()
602{
603
604	if [ -f ${PIDFILE} ]; then
605		kill -TERM `cat ${PIDFILE}`
606		wait_term ${PIDFILE}
607	fi
608	if [ -f ${PIDFILE3} ]; then
609		kill -TERM `cat ${PIDFILE3}`
610		wait_term ${PIDFILE3}
611	fi
612	if [ -f ${PIDFILE4} ]; then
613		kill -TERM `cat ${PIDFILE4}`
614		wait_term ${PIDFILE4}
615	fi
616
617	$DEBUG && dump
618	cleanup
619}
620
621atf_test_case ra_temporary_address cleanup
622ra_temporary_address_head()
623{
624
625	atf_set "descr" "Tests for IPv6 temporary address"
626	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
627}
628
629check_echo_request_pkt()
630{
631	local pkt="$2 > $3: .+ echo request"
632
633	extract_new_packets $1 > ./out
634	$DEBUG && echo $pkt
635	$DEBUG && cat ./out
636	atf_check -s exit:0 -o match:"$pkt" cat ./out
637}
638
639ra_temporary_address_body()
640{
641	local ip_auto= ip_temp=
642
643	rump_server_fs_start $RUMPSRV netinet6
644	rump_server_start $RUMPCLI netinet6
645
646	setup_shmif0 $RUMPSRV $IP6SRV
647	init_server $RUMPSRV
648	setup_shmif0 $RUMPCLI $IP6CLI
649
650	export RUMP_SERVER=$RUMPCLI
651	atf_check -s exit:0 -o match:'0.->.1' \
652	    rump.sysctl -w net.inet6.ip6.accept_rtadv=1
653	atf_check -s exit:0 -o match:'0.->.1' \
654	    rump.sysctl -w net.inet6.ip6.use_tempaddr=1
655	unset RUMP_SERVER
656
657	create_rtadvdconfig
658	start_rtadvd $RUMPSRV $PIDFILE
659	sleep $WAITTIME
660
661	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
662
663	export RUMP_SERVER=$RUMPCLI
664
665	# Check temporary address
666	atf_check -s exit:0 \
667	    -o match:"$IP6SRV_PREFIX.+<(TENTATIVE,)?AUTOCONF,TEMPORARY>" \
668	    rump.ifconfig shmif0 inet6
669
670	#
671	# Testing net.inet6.ip6.prefer_tempaddr
672	#
673	atf_check -s exit:0 rump.ifconfig -w 10
674	$DEBUG && rump.ifconfig shmif0
675	ip_auto=$(rump.ifconfig shmif0 |awk '/<AUTOCONF>/ {sub(/\/[0-9]*/, ""); print $2;}')
676	ip_temp=$(rump.ifconfig shmif0 |awk '/<AUTOCONF,TEMPORARY>/ {sub(/\/[0-9]*/, ""); print $2;}')
677	$DEBUG && echo $ip_auto $ip_temp
678
679	# Ignore old packets
680	extract_new_packets bus1 > /dev/null
681
682	atf_check -s exit:0 -o ignore rump.ping6 -n -X 2 -c 1 $IP6SRV
683	# autoconf (non-temporal) address should be used as the source address
684	check_echo_request_pkt bus1 $ip_auto $IP6SRV
685
686	# Enable net.inet6.ip6.prefer_tempaddr
687	atf_check -s exit:0 -o match:'0.->.1' \
688	    rump.sysctl -w net.inet6.ip6.prefer_tempaddr=1
689
690	atf_check -s exit:0 -o ignore rump.ping6 -n -X 2 -c 1 $IP6SRV
691	# autoconf, temporal address should be used as the source address
692	check_echo_request_pkt bus1 $ip_temp $IP6SRV
693
694	unset RUMP_SERVER
695
696	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
697	wait_term $PIDFILE
698
699	rump_server_destroy_ifaces
700}
701
702ra_temporary_address_cleanup()
703{
704
705	if [ -f ${PIDFILE} ]; then
706		kill -TERM `cat ${PIDFILE}`
707		wait_term ${PIDFILE}
708	fi
709
710	$DEBUG && dump
711	cleanup
712}
713
714atf_test_case ra_defrouter_expiration cleanup
715ra_defrouter_expiration_head()
716{
717
718	atf_set "descr" "Tests for default router expiration"
719	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
720}
721
722ra_defrouter_expiration_body()
723{
724	local expire_time=5
725
726	rump_server_fs_start $RUMPSRV netinet6
727	rump_server_start $RUMPCLI netinet6
728
729	setup_shmif0 ${RUMPSRV} ${IP6SRV}
730	setup_shmif0 ${RUMPCLI} ${IP6CLI}
731
732	init_server $RUMPSRV
733
734	create_rtadvdconfig_rltime $expire_time
735
736	export RUMP_SERVER=${RUMPCLI}
737	atf_check -s exit:0 -o match:'0.->.1' \
738	    rump.sysctl -w net.inet6.ip6.accept_rtadv=1
739	unset RUMP_SERVER
740
741	start_rtadvd $RUMPSRV $PIDFILE
742	sleep $WAITTIME
743
744	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
745
746	export RUMP_SERVER=${RUMPCLI}
747
748	# Terminate rtadvd to prevent new RA messages from coming
749	# Note that ifconfig down; kill -TERM doesn't work
750	kill -KILL `cat ${PIDFILE}`
751
752	# Wait until the default routers and prefix entries are expired
753	sleep $expire_time
754
755	$DEBUG && dump_entries
756
757	# Give nd6_timer a chance to sweep default routers and prefix entries
758	sleep 2
759
760	$DEBUG && dump_entries
761	atf_check -s exit:0 -o not-match:'if=shmif0' rump.ndp -r
762	atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p
763	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
764	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
765	atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
766	unset RUMP_SERVER
767
768	rump_server_destroy_ifaces
769}
770
771ra_defrouter_expiration_cleanup()
772{
773
774	$DEBUG && dump
775	cleanup
776}
777
778atf_test_case ra_prefix_expiration cleanup
779ra_prefix_expiration_head()
780{
781
782	atf_set "descr" "Tests for prefix expiration"
783	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
784}
785
786ra_prefix_expiration_body()
787{
788	local expire_time=5
789
790	rump_server_fs_start $RUMPSRV netinet6
791	rump_server_start $RUMPCLI netinet6
792
793	setup_shmif0 ${RUMPSRV} ${IP6SRV}
794	setup_shmif0 ${RUMPCLI} ${IP6CLI}
795
796	init_server $RUMPSRV
797
798	create_rtadvdconfig_vltime "${IP6SRV_PREFIX}:" $expire_time
799
800	export RUMP_SERVER=${RUMPCLI}
801	atf_check -s exit:0 -o match:'0.->.1' \
802	    rump.sysctl -w net.inet6.ip6.accept_rtadv=1
803	unset RUMP_SERVER
804
805	start_rtadvd $RUMPSRV $PIDFILE
806	sleep $WAITTIME
807
808	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
809
810	export RUMP_SERVER=${RUMPCLI}
811
812	# Terminate rtadvd to prevent new RA messages from coming
813	# Note that ifconfig down; kill -TERM doesn't work
814	kill -KILL `cat ${PIDFILE}`
815
816	# Wait until the default routers and prefix entries are expired
817	sleep $expire_time
818
819	$DEBUG && dump_entries
820
821	# Give nd6_timer a chance to sweep default routers and prefix entries
822	sleep 2
823
824	$DEBUG && dump_entries
825	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
826	atf_check -s exit:0 -o empty rump.ndp -p
827	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
828	atf_check -s exit:0 -o match:"$ONEDAYISH S R" rump.ndp -n -a
829	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
830	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
831	unset RUMP_SERVER
832
833	rump_server_destroy_ifaces
834}
835
836ra_prefix_expiration_cleanup()
837{
838
839	$DEBUG && dump
840	cleanup
841}
842
843atf_init_test_cases()
844{
845
846	atf_add_test_case ra_basic
847	atf_add_test_case ra_flush_prefix_entries
848	atf_add_test_case ra_flush_defrouter_entries
849	atf_add_test_case ra_delete_address
850	atf_add_test_case ra_multiple_routers
851	atf_add_test_case ra_multiple_routers_single_prefix
852	atf_add_test_case ra_multiple_routers_maxifprefixes
853	atf_add_test_case ra_temporary_address
854	atf_add_test_case ra_defrouter_expiration
855	atf_add_test_case ra_prefix_expiration
856}
857