t_ra.sh revision 313535
11556Srgrimes#	$NetBSD: t_ra.sh,v 1.20 2017/01/11 03:15:44 ozaki-r Exp $
21556Srgrimes#
31556Srgrimes# Copyright (c) 2015 Internet Initiative Japan Inc.
41556Srgrimes# All rights reserved.
51556Srgrimes#
61556Srgrimes# Redistribution and use in source and binary forms, with or without
71556Srgrimes# modification, are permitted provided that the following conditions
81556Srgrimes# are met:
91556Srgrimes# 1. Redistributions of source code must retain the above copyright
101556Srgrimes#    notice, this list of conditions and the following disclaimer.
111556Srgrimes# 2. Redistributions in binary form must reproduce the above copyright
121556Srgrimes#    notice, this list of conditions and the following disclaimer in the
131556Srgrimes#    documentation and/or other materials provided with the distribution.
141556Srgrimes#
151556Srgrimes# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
161556Srgrimes# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
171556Srgrimes# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
181556Srgrimes# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
191556Srgrimes# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
201556Srgrimes# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
211556Srgrimes# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
221556Srgrimes# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
231556Srgrimes# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
241556Srgrimes# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
251556Srgrimes# POSSIBILITY OF SUCH DAMAGE.
261556Srgrimes#
271556Srgrimes
281556SrgrimesRUMPSRV=unix://r1
291556SrgrimesRUMPSRV1_2=unix://r12
3090143SmarkmRUMPCLI=unix://r2
311556SrgrimesRUMPSRV3=unix://r3
3228052SsteveRUMPSRV4=unix://r4
3390143SmarkmIP6SRV=fc00:1::1
3428052SsteveIP6SRV1_2=fc00:1::2
3599110SobrienIP6SRV_PREFIX=fc00:1:
3699110SobrienIP6CLI=fc00:2::2
371556SrgrimesIP6SRV3=fc00:3::1
381556SrgrimesIP6SRV3_PREFIX=fc00:3:
391556SrgrimesIP6SRV4=fc00:4::1
401556SrgrimesIP6SRV4_PREFIX=fc00:4:
411556SrgrimesPIDFILE=./rump.rtadvd.pid
4228054SstevePIDFILE1_2=./rump.rtadvd.pid12
4328054SstevePIDFILE3=./rump.rtadvd.pid3
441556SrgrimesPIDFILE4=./rump.rtadvd.pid4
451556SrgrimesCONFIG=./rtadvd.conf
461556SrgrimesWAITTIME=2
471556SrgrimesDEBUG=${DEBUG:-true}
481556Srgrimes
491556Srgrimesinit_server()
501556Srgrimes{
511556Srgrimes
521556Srgrimes	export RUMP_SERVER=$1
53109504Sjmallett	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.forwarding=1
5490110Simp	export LD_PRELOAD=/usr/lib/librumphijack.so
551556Srgrimes	atf_check -s exit:0 mkdir -p /rump/var/chroot/rtadvd
561556Srgrimes	unset LD_PRELOAD
5769896Smckusick	unset RUMP_SERVER
581556Srgrimes}
591556Srgrimes
60130827Sgadsetup_shmif0()
61130827Sgad{
621556Srgrimes	local sock=$1
631556Srgrimes	local IP6ADDR=$2
641556Srgrimes
65110411Ssobomax	rump_server_add_iface $sock shmif0 bus1
6690143Smarkm
67225868Strasz	export RUMP_SERVER=$sock
68225868Strasz	atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6ADDR}
69225868Strasz	atf_check -s exit:0 rump.ifconfig shmif0 up
70225868Strasz	atf_check -s exit:0 rump.ifconfig -w 10
71225868Strasz
7297958Sjmallett	$DEBUG && rump.ifconfig
73225868Strasz}
74225868Strasz
75225868Straszwait_term()
76225868Strasz{
77225868Strasz	local PIDFILE=${1}
7897850Sjmallett	shift
79235851Skib
80225868Strasz	while [ -f ${PIDFILE} ]
81225868Strasz	do
82240645Szont		sleep 0.2
83225868Strasz	done
84225868Strasz
85225868Strasz	return 0
86225868Strasz}
87225868Strasz
88225868Straszcreate_rtadvdconfig()
89225868Strasz{
90267904Spluknet
91254943Swill	cat << _EOF > ${CONFIG}
92225868Straszshmif0:\
93267904Spluknet	:mtu#1300:maxinterval#4:mininterval#3:
94225868Strasz_EOF
95225868Strasz}
96225868Strasz
97225868Straszstart_rtadvd()
98225868Strasz{
99331471Sjhb	local sock=$1
100225868Strasz	local pidfile=$2
101225868Strasz
102225868Strasz	export RUMP_SERVER=$sock
103225868Strasz	atf_check -s exit:0 rump.rtadvd -c ${CONFIG} -p $pidfile shmif0
104225868Strasz	while [ ! -f $pidfile ]; do
105225868Strasz		sleep 0.2
106225868Strasz	done
107225868Strasz	unset RUMP_SERVER
108225868Strasz}
109225868Strasz
110225868Straszcheck_entries()
111225868Strasz{
112225868Strasz	local cli=$1
113225868Strasz	local srv=$2
114225868Strasz	local addr_prefix=$3
115225868Strasz	local mac_srv= ll_srv=
116225868Strasz
117225868Strasz	ll_srv=$(get_linklocal_addr $srv shmif0)
118225868Strasz	mac_srv=$(get_macaddr $srv shmif0)
119225868Strasz
120225868Strasz	export RUMP_SERVER=$cli
121225868Strasz	$DEBUG && dump_entries
122225868Strasz	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
123225868Strasz	atf_check -s exit:0 -o match:'advertised' rump.ndp -p
124225868Strasz	atf_check -s exit:0 -o match:"${ll_srv}%shmif0 \(reachable\)" rump.ndp -p
125225868Strasz	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
126225868Strasz	atf_check -s exit:0 \
127225868Strasz	    -o match:"$ll_srv%shmif0 +$mac_srv +shmif0 +(23h59m|1d0h0m)..s S R" \
128225868Strasz	    rump.ndp -n -a
129225868Strasz	atf_check -s exit:0 -o match:$addr_prefix rump.ndp -n -a
130225868Strasz	atf_check -s exit:0 -o match:"$addr_prefix.+<AUTOCONF>" \
131225868Strasz	    rump.ifconfig shmif0 inet6
132225868Strasz	unset RUMP_SERVER
133225868Strasz}
134225868Strasz
135225868Straszdump_entries()
136225868Strasz{
137225868Strasz
138225868Strasz	echo ndp -n -a
139225868Strasz	rump.ndp -n -a
140225868Strasz	echo ndp -p
141225868Strasz	rump.ndp -p
142225868Strasz	echo ndp -r
143225868Strasz	rump.ndp -r
144225868Strasz}
145225868Strasz
14690143Smarkmatf_test_case ra_basic cleanup
147225868Straszra_basic_head()
148225868Strasz{
149240645Szont
150225868Strasz	atf_set "descr" "Tests for basic functions of router advaertisement(RA)"
151225868Strasz	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
152225868Strasz}
153225868Strasz
154225868Straszra_basic_body()
155225868Strasz{
156225868Strasz
157225868Strasz	rump_server_fs_start $RUMPSRV netinet6
158225868Strasz	rump_server_start $RUMPCLI netinet6
159225868Strasz
160225868Strasz	setup_shmif0 ${RUMPSRV} ${IP6SRV}
161225868Strasz	init_server $RUMPSRV
162225868Strasz
163225868Strasz	setup_shmif0 ${RUMPCLI} ${IP6CLI}
164225868Strasz	export RUMP_SERVER=${RUMPCLI}
165225868Strasz	$DEBUG && rump.ndp -n -a
166225868Strasz	atf_check -s exit:0 -o match:'= 0' rump.sysctl net.inet6.ip6.accept_rtadv
167225868Strasz	unset RUMP_SERVER
168225868Strasz
169225868Strasz	create_rtadvdconfig
170225868Strasz	start_rtadvd $RUMPSRV $PIDFILE
171225868Strasz	sleep $WAITTIME
172225868Strasz
173225868Strasz	export RUMP_SERVER=${RUMPCLI}
174225868Strasz	atf_check -s exit:0 -o empty rump.ndp -r
175225868Strasz	atf_check -s exit:0 -o not-match:'advertised' rump.ndp -p
176225868Strasz	atf_check -s exit:0 -o match:'linkmtu=0' rump.ndp -n -i shmif0
1771556Srgrimes	atf_check -s exit:0 -o not-match:'S R' rump.ndp -n -a
1781556Srgrimes	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
1791556Srgrimes	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
18090110Simp	unset RUMP_SERVER
1811556Srgrimes
1821556Srgrimes	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
1831556Srgrimes	wait_term ${PIDFILE}
18490143Smarkm
1851556Srgrimes	export RUMP_SERVER=${RUMPCLI}
1861556Srgrimes	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
1871556Srgrimes	unset RUMP_SERVER
1881556Srgrimes
1891556Srgrimes	start_rtadvd $RUMPSRV $PIDFILE
1901556Srgrimes	sleep $WAITTIME
1911556Srgrimes
1921556Srgrimes	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
1931556Srgrimes
1941556Srgrimes	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
1951556Srgrimes	wait_term ${PIDFILE}
1961556Srgrimes
1971556Srgrimes	rump_server_destroy_ifaces
1981556Srgrimes}
1991556Srgrimes
2001556Srgrimesra_basic_cleanup()
201109502Sjmallett{
2021556Srgrimes
20390143Smarkm	if [ -f ${PIDFILE} ]; then
2041556Srgrimes		kill -TERM `cat ${PIDFILE}`
20598050Sjmallett		wait_term ${PIDFILE}
20690143Smarkm	fi
20790143Smarkm
208109504Sjmallett	$DEBUG && dump
2091556Srgrimes	cleanup
2101556Srgrimes}
2111556Srgrimes
21297944Sjmallettatf_test_case ra_flush_prefix_entries cleanup
21398050Sjmallettra_flush_prefix_entries_head()
21498050Sjmallett{
21598050Sjmallett
21697944Sjmallett	atf_set "descr" "Tests for flushing prefixes (ndp -P)"
21798050Sjmallett	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
21898050Sjmallett}
21998050Sjmallett
22098050Sjmallettra_flush_prefix_entries_body()
22198050Sjmallett{
22298050Sjmallett
22398050Sjmallett	rump_server_fs_start $RUMPSRV netinet6
22498050Sjmallett	rump_server_start $RUMPCLI netinet6
225109504Sjmallett
2261556Srgrimes	setup_shmif0 ${RUMPSRV} ${IP6SRV}
227109502Sjmallett	setup_shmif0 ${RUMPCLI} ${IP6CLI}
228109502Sjmallett
229109502Sjmallett	init_server $RUMPSRV
230109502Sjmallett
231109502Sjmallett	create_rtadvdconfig
232109502Sjmallett
233109502Sjmallett	export RUMP_SERVER=${RUMPCLI}
234109502Sjmallett	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
235109502Sjmallett	unset RUMP_SERVER
236109502Sjmallett
2371556Srgrimes	start_rtadvd $RUMPSRV $PIDFILE
23897877Sjmallett	sleep $WAITTIME
239109504Sjmallett
240109504Sjmallett	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
241109504Sjmallett
242109504Sjmallett	export RUMP_SERVER=${RUMPCLI}
243109504Sjmallett
244109504Sjmallett	# Terminate rtadvd to prevent new RA messages from coming
24597848Sjmallett	# Note that ifconfig down; kill -TERM doesn't work
24697848Sjmallett	kill -KILL `cat ${PIDFILE}`
24797877Sjmallett
24897848Sjmallett	# Flush all the entries in the prefix list
249130999Sgad	atf_check -s exit:0 rump.ndp -P
2501556Srgrimes
25190143Smarkm	$DEBUG && dump_entries
252130999Sgad	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
253104026Sjmallett	atf_check -s exit:0 -o empty rump.ndp -p
254104026Sjmallett	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
255104026Sjmallett	atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
256104026Sjmallett	atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
2571556Srgrimes	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
2581556Srgrimes	unset RUMP_SERVER
2591556Srgrimes
260109504Sjmallett	rump_server_destroy_ifaces
2611556Srgrimes}
262156423Sgad
2631556Srgrimesra_flush_prefix_entries_cleanup()
264156423Sgad{
2651556Srgrimes
2661556Srgrimes	$DEBUG && dump
2671556Srgrimes	cleanup
2681556Srgrimes}
2691556Srgrimes
2701556Srgrimesatf_test_case ra_flush_defrouter_entries cleanup
2711556Srgrimesra_flush_defrouter_entries_head()
2721556Srgrimes{
2731556Srgrimes
274156423Sgad	atf_set "descr" "Tests for flushing default routers (ndp -R)"
275157559Sgad	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
276157559Sgad}
277157559Sgad
278157559Sgadra_flush_defrouter_entries_body()
279156423Sgad{
280157559Sgad
281157559Sgad	rump_server_fs_start $RUMPSRV netinet6
282157559Sgad	rump_server_start $RUMPCLI netinet6
283157559Sgad
284157559Sgad	setup_shmif0 ${RUMPSRV} ${IP6SRV}
285157559Sgad	setup_shmif0 ${RUMPCLI} ${IP6CLI}
286157559Sgad
287157559Sgad	init_server $RUMPSRV
288157559Sgad
289157559Sgad	create_rtadvdconfig
290157559Sgad
291189078Sattilio	export RUMP_SERVER=${RUMPCLI}
292189078Sattilio	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
293157559Sgad	unset RUMP_SERVER
294157559Sgad
295199351Snetchild	start_rtadvd $RUMPSRV $PIDFILE
296157559Sgad	sleep $WAITTIME
2971556Srgrimes
2981556Srgrimes	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
2991556Srgrimes
3001556Srgrimes	export RUMP_SERVER=${RUMPCLI}
3011556Srgrimes
302109504Sjmallett	# Terminate rtadvd to prevent new RA messages from coming
303109504Sjmallett	# Note that ifconfig down; kill -TERM doesn't work
304109504Sjmallett	kill -KILL `cat ${PIDFILE}`
3051556Srgrimes
3061556Srgrimes	# Flush all the entries in the default router list
3071556Srgrimes	atf_check -s exit:0 rump.ndp -R
3081556Srgrimes
30990110Simp	$DEBUG && dump_entries
3101556Srgrimes	atf_check -s exit:0 -o empty rump.ndp -r
31190143Smarkm	atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p
3121556Srgrimes	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
313	atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
314	atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
315	atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
316	unset RUMP_SERVER
317
318	rump_server_destroy_ifaces
319}
320
321ra_flush_defrouter_entries_cleanup()
322{
323
324	$DEBUG && dump
325	cleanup
326}
327
328atf_test_case ra_delete_address cleanup
329ra_delete_address_head()
330{
331
332	atf_set "descr" "Tests for deleting auto-configured address"
333	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
334}
335
336ra_delete_address_body()
337{
338
339	rump_server_fs_start $RUMPSRV netinet6
340	rump_server_start $RUMPCLI netinet6
341
342	setup_shmif0 ${RUMPSRV} ${IP6SRV}
343	setup_shmif0 ${RUMPCLI} ${IP6CLI}
344
345	init_server $RUMPSRV
346
347	create_rtadvdconfig
348
349	export RUMP_SERVER=${RUMPCLI}
350	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
351	unset RUMP_SERVER
352
353	start_rtadvd $RUMPSRV $PIDFILE
354	sleep $WAITTIME
355
356	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
357
358	export RUMP_SERVER=${RUMPCLI}
359	$DEBUG && rump.ifconfig shmif0
360	atf_check -s exit:0 rump.ifconfig shmif0 inet6 \
361	    $(rump.ifconfig shmif0 |awk '/AUTOCONF/ {print $2}') delete
362	unset RUMP_SERVER
363
364	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
365	wait_term ${PIDFILE}
366
367	rump_server_destroy_ifaces
368}
369
370ra_delete_address_cleanup()
371{
372
373	if [ -f ${PIDFILE} ]; then
374		kill -TERM `cat ${PIDFILE}`
375		wait_term ${PIDFILE}
376	fi
377
378	$DEBUG && dump
379	cleanup
380}
381
382atf_test_case ra_multiple_routers cleanup
383ra_multiple_routers_head()
384{
385
386	atf_set "descr" "Tests for multiple routers"
387	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
388}
389
390ra_multiple_routers_body()
391{
392	local n=
393
394	rump_server_fs_start $RUMPSRV netinet6
395	rump_server_fs_start $RUMPSRV3 netinet6
396	rump_server_start $RUMPCLI netinet6
397
398	setup_shmif0 ${RUMPSRV} ${IP6SRV}
399	setup_shmif0 ${RUMPSRV3} ${IP6SRV3}
400	setup_shmif0 ${RUMPCLI} ${IP6CLI}
401
402	init_server $RUMPSRV
403	init_server $RUMPSRV3
404
405	create_rtadvdconfig
406
407	export RUMP_SERVER=${RUMPCLI}
408	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
409	unset RUMP_SERVER
410
411	start_rtadvd $RUMPSRV $PIDFILE
412	start_rtadvd $RUMPSRV3 $PIDFILE3
413	sleep $WAITTIME
414
415	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
416	check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX
417
418	export RUMP_SERVER=$RUMPCLI
419	# Two prefixes are advertised by differnt two routers
420	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
421	atf_check_equal $n 2
422	unset RUMP_SERVER
423
424	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
425	wait_term ${PIDFILE}
426	atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}`
427	wait_term ${PIDFILE3}
428
429	rump_server_destroy_ifaces
430}
431
432ra_multiple_routers_cleanup()
433{
434
435	if [ -f ${PIDFILE} ]; then
436		kill -TERM `cat ${PIDFILE}`
437		wait_term ${PIDFILE}
438	fi
439	if [ -f ${PIDFILE3} ]; then
440		kill -TERM `cat ${PIDFILE3}`
441		wait_term ${PIDFILE3}
442	fi
443
444	$DEBUG && dump
445	cleanup
446}
447
448atf_test_case ra_multiple_routers_single_prefix cleanup
449ra_multiple_routers_single_prefix_head()
450{
451
452	atf_set "descr" "Tests for multiple routers with a single prefix"
453	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
454}
455
456ra_multiple_routers_single_prefix_body()
457{
458	local n=
459
460	rump_server_fs_start $RUMPSRV netinet6
461	rump_server_fs_start $RUMPSRV1_2 netinet6
462	rump_server_start $RUMPCLI netinet6
463
464	setup_shmif0 ${RUMPSRV} ${IP6SRV}
465	setup_shmif0 ${RUMPSRV1_2} ${IP6SRV1_2}
466	setup_shmif0 ${RUMPCLI} ${IP6CLI}
467
468	init_server $RUMPSRV
469	init_server $RUMPSRV1_2
470
471	create_rtadvdconfig
472
473	export RUMP_SERVER=${RUMPCLI}
474	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
475	unset RUMP_SERVER
476
477	start_rtadvd $RUMPSRV $PIDFILE
478	start_rtadvd $RUMPSRV1_2 $PIDFILE1_2
479	sleep $WAITTIME
480
481	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
482	check_entries $RUMPCLI $RUMPSRV1_2 $IP6SRV_PREFIX
483
484	export RUMP_SERVER=$RUMPCLI
485	# One prefix is advertised by differnt two routers
486	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
487	atf_check_equal $n 1
488	unset RUMP_SERVER
489
490	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
491	wait_term ${PIDFILE}
492	atf_check -s exit:0 kill -TERM `cat ${PIDFILE1_2}`
493	wait_term ${PIDFILE1_2}
494
495	rump_server_destroy_ifaces
496}
497
498ra_multiple_routers_single_prefix_cleanup()
499{
500
501	if [ -f ${PIDFILE} ]; then
502		kill -TERM `cat ${PIDFILE}`
503		wait_term ${PIDFILE}
504	fi
505	if [ -f ${PIDFILE1_2} ]; then
506		kill -TERM `cat ${PIDFILE1_2}`
507		wait_term ${PIDFILE1_2}
508	fi
509
510	$DEBUG && dump
511	cleanup
512}
513
514atf_test_case ra_multiple_routers_maxifprefixes cleanup
515ra_multiple_routers_maxifprefixes_head()
516{
517
518	atf_set "descr" "Tests for exceeding the number of maximum prefixes"
519	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
520}
521
522ra_multiple_routers_maxifprefixes_body()
523{
524	local n=
525
526	rump_server_fs_start $RUMPSRV netinet6
527	rump_server_fs_start $RUMPSRV3 netinet6
528	rump_server_fs_start $RUMPSRV4 netinet6
529	rump_server_start $RUMPCLI netinet6
530
531	setup_shmif0 ${RUMPSRV} ${IP6SRV}
532	setup_shmif0 ${RUMPSRV3} ${IP6SRV3}
533	setup_shmif0 ${RUMPSRV4} ${IP6SRV4}
534	setup_shmif0 ${RUMPCLI} ${IP6CLI}
535
536	init_server $RUMPSRV
537	init_server $RUMPSRV3
538	init_server $RUMPSRV4
539
540	create_rtadvdconfig
541
542	export RUMP_SERVER=${RUMPCLI}
543	atf_check -s exit:0 -o match:'0.->.1' \
544	    rump.sysctl -w net.inet6.ip6.accept_rtadv=1
545	# Limit the maximum number of prefix entries to 2
546	atf_check -s exit:0 -o match:'16.->.2' \
547	    rump.sysctl -w net.inet6.ip6.maxifprefixes=2
548	unset RUMP_SERVER
549
550	start_rtadvd $RUMPSRV $PIDFILE
551	start_rtadvd $RUMPSRV3 $PIDFILE3
552	sleep $WAITTIME
553
554	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
555	check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX
556
557	start_rtadvd $RUMPSRV4 $PIDFILE4
558	sleep $WAITTIME
559
560	export RUMP_SERVER=${RUMPCLI}
561	$DEBUG && dump_entries
562	# There should remain two prefixes
563	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
564	atf_check_equal $n 2
565	# TODO check other conditions
566	unset RUMP_SERVER
567
568	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
569	wait_term ${PIDFILE}
570	atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}`
571	wait_term ${PIDFILE3}
572	atf_check -s exit:0 kill -TERM `cat ${PIDFILE4}`
573	wait_term ${PIDFILE4}
574
575	rump_server_destroy_ifaces
576}
577
578ra_multiple_routers_maxifprefixes_cleanup()
579{
580
581	if [ -f ${PIDFILE} ]; then
582		kill -TERM `cat ${PIDFILE}`
583		wait_term ${PIDFILE}
584	fi
585	if [ -f ${PIDFILE3} ]; then
586		kill -TERM `cat ${PIDFILE3}`
587		wait_term ${PIDFILE3}
588	fi
589	if [ -f ${PIDFILE4} ]; then
590		kill -TERM `cat ${PIDFILE4}`
591		wait_term ${PIDFILE4}
592	fi
593
594	$DEBUG && dump
595	cleanup
596}
597
598atf_test_case ra_temporary_address cleanup
599ra_temporary_address_head()
600{
601
602	atf_set "descr" "Tests for IPv6 temporary address"
603	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
604}
605
606ra_temporary_address_body()
607{
608
609	rump_server_fs_start $RUMPSRV netinet6
610	rump_server_start $RUMPCLI netinet6
611
612	setup_shmif0 ${RUMPSRV} ${IP6SRV}
613	init_server $RUMPSRV
614
615	setup_shmif0 ${RUMPCLI} ${IP6CLI}
616	export RUMP_SERVER=${RUMPCLI}
617	$DEBUG && rump.ndp -n -a
618	atf_check -s exit:0 -o match:'= 0' \
619	    rump.sysctl net.inet6.ip6.accept_rtadv
620	atf_check -s exit:0 -o match:'= 0' \
621	    rump.sysctl net.inet6.ip6.use_tempaddr
622	unset RUMP_SERVER
623
624	create_rtadvdconfig
625	start_rtadvd $RUMPSRV $PIDFILE
626	sleep $WAITTIME
627
628	export RUMP_SERVER=${RUMPCLI}
629	atf_check -s exit:0 -o empty rump.ndp -r
630	atf_check -s exit:0 -o not-match:'advertised' rump.ndp -p
631	atf_check -s exit:0 -o match:'linkmtu=0' rump.ndp -n -i shmif0
632	atf_check -s exit:0 -o not-match:'S R' rump.ndp -n -a
633	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
634	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
635	unset RUMP_SERVER
636
637	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
638	wait_term ${PIDFILE}
639
640	export RUMP_SERVER=${RUMPCLI}
641	atf_check -s exit:0 -o match:'0.->.1' \
642	    rump.sysctl -w net.inet6.ip6.accept_rtadv=1
643	atf_check -s exit:0 -o match:'0.->.1' \
644	    rump.sysctl -w net.inet6.ip6.use_tempaddr=1
645	unset RUMP_SERVER
646
647	start_rtadvd $RUMPSRV $PIDFILE
648	sleep $WAITTIME
649
650	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
651
652	# Check temporary address
653	export RUMP_SERVER=${RUMPCLI}
654	atf_check -s exit:0 -o match:"$IP6SRV_PREFIX.+<AUTOCONF,TEMPORARY>" \
655	    rump.ifconfig shmif0 inet6
656	unset RUMP_SERVER
657
658	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
659	wait_term ${PIDFILE}
660
661	rump_server_destroy_ifaces
662}
663
664ra_temporary_address_cleanup()
665{
666
667	if [ -f ${PIDFILE} ]; then
668		kill -TERM `cat ${PIDFILE}`
669		wait_term ${PIDFILE}
670	fi
671
672	$DEBUG && dump
673	cleanup
674}
675
676atf_init_test_cases()
677{
678
679	atf_add_test_case ra_basic
680	atf_add_test_case ra_flush_prefix_entries
681	atf_add_test_case ra_flush_defrouter_entries
682	atf_add_test_case ra_delete_address
683	atf_add_test_case ra_multiple_routers
684	atf_add_test_case ra_multiple_routers_single_prefix
685	atf_add_test_case ra_multiple_routers_maxifprefixes
686	atf_add_test_case ra_temporary_address
687}
688