1314817Sngie#	$NetBSD: t_ra.sh,v 1.24 2017/01/13 08:11:01 ozaki-r Exp $
2303980Sngie#
3303980Sngie# Copyright (c) 2015 Internet Initiative Japan Inc.
4303980Sngie# All rights reserved.
5303980Sngie#
6303980Sngie# Redistribution and use in source and binary forms, with or without
7303980Sngie# modification, are permitted provided that the following conditions
8303980Sngie# are met:
9303980Sngie# 1. Redistributions of source code must retain the above copyright
10303980Sngie#    notice, this list of conditions and the following disclaimer.
11303980Sngie# 2. Redistributions in binary form must reproduce the above copyright
12303980Sngie#    notice, this list of conditions and the following disclaimer in the
13303980Sngie#    documentation and/or other materials provided with the distribution.
14303980Sngie#
15303980Sngie# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16303980Sngie# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17303980Sngie# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18303980Sngie# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19303980Sngie# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20303980Sngie# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21303980Sngie# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22303980Sngie# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23303980Sngie# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24303980Sngie# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25303980Sngie# POSSIBILITY OF SUCH DAMAGE.
26303980Sngie#
27303980Sngie
28303980SngieRUMPSRV=unix://r1
29313535SngieRUMPSRV1_2=unix://r12
30303980SngieRUMPCLI=unix://r2
31313535SngieRUMPSRV3=unix://r3
32313535SngieRUMPSRV4=unix://r4
33303980SngieIP6SRV=fc00:1::1
34313535SngieIP6SRV1_2=fc00:1::2
35313535SngieIP6SRV_PREFIX=fc00:1:
36303980SngieIP6CLI=fc00:2::2
37313535SngieIP6SRV3=fc00:3::1
38313535SngieIP6SRV3_PREFIX=fc00:3:
39313535SngieIP6SRV4=fc00:4::1
40313535SngieIP6SRV4_PREFIX=fc00:4:
41313535SngiePIDFILE=./rump.rtadvd.pid
42313535SngiePIDFILE1_2=./rump.rtadvd.pid12
43313535SngiePIDFILE3=./rump.rtadvd.pid3
44313535SngiePIDFILE4=./rump.rtadvd.pid4
45303980SngieCONFIG=./rtadvd.conf
46313535SngieWAITTIME=2
47313535SngieDEBUG=${DEBUG:-true}
48303980Sngie
49313535Sngieinit_server()
50313535Sngie{
51313535Sngie
52313535Sngie	export RUMP_SERVER=$1
53313535Sngie	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.forwarding=1
54313535Sngie	export LD_PRELOAD=/usr/lib/librumphijack.so
55313535Sngie	atf_check -s exit:0 mkdir -p /rump/var/chroot/rtadvd
56313535Sngie	unset LD_PRELOAD
57313535Sngie	unset RUMP_SERVER
58313535Sngie}
59313535Sngie
60303980Sngiesetup_shmif0()
61303980Sngie{
62313535Sngie	local sock=$1
63313535Sngie	local IP6ADDR=$2
64303980Sngie
65313535Sngie	rump_server_add_iface $sock shmif0 bus1
66313535Sngie
67313535Sngie	export RUMP_SERVER=$sock
68303980Sngie	atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6ADDR}
69303980Sngie	atf_check -s exit:0 rump.ifconfig shmif0 up
70313535Sngie	atf_check -s exit:0 rump.ifconfig -w 10
71303980Sngie
72303980Sngie	$DEBUG && rump.ifconfig
73303980Sngie}
74303980Sngie
75303980Sngiewait_term()
76303980Sngie{
77303980Sngie	local PIDFILE=${1}
78303980Sngie	shift
79303980Sngie
80303980Sngie	while [ -f ${PIDFILE} ]
81303980Sngie	do
82303980Sngie		sleep 0.2
83303980Sngie	done
84303980Sngie
85303980Sngie	return 0
86303980Sngie}
87303980Sngie
88303980Sngiecreate_rtadvdconfig()
89303980Sngie{
90303980Sngie
91303980Sngie	cat << _EOF > ${CONFIG}
92303980Sngieshmif0:\
93303980Sngie	:mtu#1300:maxinterval#4:mininterval#3:
94303980Sngie_EOF
95303980Sngie}
96303980Sngie
97313535Sngiestart_rtadvd()
98303980Sngie{
99313535Sngie	local sock=$1
100313535Sngie	local pidfile=$2
101303980Sngie
102313535Sngie	export RUMP_SERVER=$sock
103313535Sngie	atf_check -s exit:0 rump.rtadvd -c ${CONFIG} -p $pidfile shmif0
104313535Sngie	while [ ! -f $pidfile ]; do
105313535Sngie		sleep 0.2
106313535Sngie	done
107313535Sngie	unset RUMP_SERVER
108313535Sngie}
109313535Sngie
110313535Sngiecheck_entries()
111313535Sngie{
112313535Sngie	local cli=$1
113313535Sngie	local srv=$2
114313535Sngie	local addr_prefix=$3
115313535Sngie	local mac_srv= ll_srv=
116313535Sngie
117313535Sngie	ll_srv=$(get_linklocal_addr $srv shmif0)
118313535Sngie	mac_srv=$(get_macaddr $srv shmif0)
119313535Sngie
120313535Sngie	export RUMP_SERVER=$cli
121313535Sngie	$DEBUG && dump_entries
122313535Sngie	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
123313535Sngie	atf_check -s exit:0 -o match:'advertised' rump.ndp -p
124313535Sngie	atf_check -s exit:0 -o match:"${ll_srv}%shmif0 \(reachable\)" rump.ndp -p
125313535Sngie	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
126313535Sngie	atf_check -s exit:0 \
127313535Sngie	    -o match:"$ll_srv%shmif0 +$mac_srv +shmif0 +(23h59m|1d0h0m)..s S R" \
128313535Sngie	    rump.ndp -n -a
129313535Sngie	atf_check -s exit:0 -o match:$addr_prefix rump.ndp -n -a
130314817Sngie	atf_check -s exit:0 \
131314817Sngie	    -o match:"$addr_prefix.+<(TENTATIVE,)?AUTOCONF>" \
132313535Sngie	    rump.ifconfig shmif0 inet6
133313535Sngie	unset RUMP_SERVER
134313535Sngie}
135313535Sngie
136313535Sngiedump_entries()
137313535Sngie{
138313535Sngie
139313535Sngie	echo ndp -n -a
140313535Sngie	rump.ndp -n -a
141313535Sngie	echo ndp -p
142313535Sngie	rump.ndp -p
143313535Sngie	echo ndp -r
144313535Sngie	rump.ndp -r
145313535Sngie}
146313535Sngie
147313535Sngieatf_test_case ra_basic cleanup
148313535Sngiera_basic_head()
149313535Sngie{
150313535Sngie
151303980Sngie	atf_set "descr" "Tests for basic functions of router advaertisement(RA)"
152303980Sngie	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
153303980Sngie}
154303980Sngie
155313535Sngiera_basic_body()
156303980Sngie{
157303980Sngie
158313535Sngie	rump_server_fs_start $RUMPSRV netinet6
159313535Sngie	rump_server_start $RUMPCLI netinet6
160303980Sngie
161313535Sngie	setup_shmif0 ${RUMPSRV} ${IP6SRV}
162313535Sngie	init_server $RUMPSRV
163303980Sngie
164313535Sngie	setup_shmif0 ${RUMPCLI} ${IP6CLI}
165303980Sngie	export RUMP_SERVER=${RUMPCLI}
166303980Sngie	$DEBUG && rump.ndp -n -a
167303980Sngie	atf_check -s exit:0 -o match:'= 0' rump.sysctl net.inet6.ip6.accept_rtadv
168303980Sngie	unset RUMP_SERVER
169303980Sngie
170303980Sngie	create_rtadvdconfig
171313535Sngie	start_rtadvd $RUMPSRV $PIDFILE
172313535Sngie	sleep $WAITTIME
173303980Sngie
174303980Sngie	export RUMP_SERVER=${RUMPCLI}
175303980Sngie	atf_check -s exit:0 -o empty rump.ndp -r
176303980Sngie	atf_check -s exit:0 -o not-match:'advertised' rump.ndp -p
177303980Sngie	atf_check -s exit:0 -o match:'linkmtu=0' rump.ndp -n -i shmif0
178303980Sngie	atf_check -s exit:0 -o not-match:'S R' rump.ndp -n -a
179303980Sngie	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
180303980Sngie	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
181303980Sngie	unset RUMP_SERVER
182303980Sngie
183303980Sngie	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
184303980Sngie	wait_term ${PIDFILE}
185303980Sngie
186303980Sngie	export RUMP_SERVER=${RUMPCLI}
187303980Sngie	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
188303980Sngie	unset RUMP_SERVER
189303980Sngie
190313535Sngie	start_rtadvd $RUMPSRV $PIDFILE
191313535Sngie	sleep $WAITTIME
192313535Sngie
193313535Sngie	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
194313535Sngie
195313535Sngie	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
196313535Sngie	wait_term ${PIDFILE}
197313535Sngie
198313535Sngie	rump_server_destroy_ifaces
199313535Sngie}
200313535Sngie
201313535Sngiera_basic_cleanup()
202313535Sngie{
203313535Sngie
204313535Sngie	if [ -f ${PIDFILE} ]; then
205313535Sngie		kill -TERM `cat ${PIDFILE}`
206313535Sngie		wait_term ${PIDFILE}
207313535Sngie	fi
208313535Sngie
209313535Sngie	$DEBUG && dump
210313535Sngie	cleanup
211313535Sngie}
212313535Sngie
213313535Sngieatf_test_case ra_flush_prefix_entries cleanup
214313535Sngiera_flush_prefix_entries_head()
215313535Sngie{
216313535Sngie
217313535Sngie	atf_set "descr" "Tests for flushing prefixes (ndp -P)"
218313535Sngie	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
219313535Sngie}
220313535Sngie
221313535Sngiera_flush_prefix_entries_body()
222313535Sngie{
223313535Sngie
224313535Sngie	rump_server_fs_start $RUMPSRV netinet6
225313535Sngie	rump_server_start $RUMPCLI netinet6
226313535Sngie
227313535Sngie	setup_shmif0 ${RUMPSRV} ${IP6SRV}
228313535Sngie	setup_shmif0 ${RUMPCLI} ${IP6CLI}
229313535Sngie
230313535Sngie	init_server $RUMPSRV
231313535Sngie
232313535Sngie	create_rtadvdconfig
233313535Sngie
234313535Sngie	export RUMP_SERVER=${RUMPCLI}
235313535Sngie	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
236303980Sngie	unset RUMP_SERVER
237303980Sngie
238313535Sngie	start_rtadvd $RUMPSRV $PIDFILE
239313535Sngie	sleep $WAITTIME
240313535Sngie
241313535Sngie	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
242313535Sngie
243303980Sngie	export RUMP_SERVER=${RUMPCLI}
244313535Sngie
245313535Sngie	# Terminate rtadvd to prevent new RA messages from coming
246313535Sngie	# Note that ifconfig down; kill -TERM doesn't work
247313535Sngie	kill -KILL `cat ${PIDFILE}`
248313535Sngie
249313535Sngie	# Flush all the entries in the prefix list
250313535Sngie	atf_check -s exit:0 rump.ndp -P
251313535Sngie
252313535Sngie	$DEBUG && dump_entries
253303980Sngie	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
254313535Sngie	atf_check -s exit:0 -o empty rump.ndp -p
255303980Sngie	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
256313535Sngie	atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
257303980Sngie	atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
258313535Sngie	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
259313535Sngie	unset RUMP_SERVER
260313535Sngie
261313535Sngie	rump_server_destroy_ifaces
262313535Sngie}
263313535Sngie
264313535Sngiera_flush_prefix_entries_cleanup()
265313535Sngie{
266313535Sngie
267313535Sngie	$DEBUG && dump
268313535Sngie	cleanup
269313535Sngie}
270313535Sngie
271313535Sngieatf_test_case ra_flush_defrouter_entries cleanup
272313535Sngiera_flush_defrouter_entries_head()
273313535Sngie{
274313535Sngie
275313535Sngie	atf_set "descr" "Tests for flushing default routers (ndp -R)"
276313535Sngie	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
277313535Sngie}
278313535Sngie
279313535Sngiera_flush_defrouter_entries_body()
280313535Sngie{
281313535Sngie
282313535Sngie	rump_server_fs_start $RUMPSRV netinet6
283313535Sngie	rump_server_start $RUMPCLI netinet6
284313535Sngie
285313535Sngie	setup_shmif0 ${RUMPSRV} ${IP6SRV}
286313535Sngie	setup_shmif0 ${RUMPCLI} ${IP6CLI}
287313535Sngie
288313535Sngie	init_server $RUMPSRV
289313535Sngie
290313535Sngie	create_rtadvdconfig
291313535Sngie
292313535Sngie	export RUMP_SERVER=${RUMPCLI}
293313535Sngie	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
294313535Sngie	unset RUMP_SERVER
295313535Sngie
296313535Sngie	start_rtadvd $RUMPSRV $PIDFILE
297313535Sngie	sleep $WAITTIME
298313535Sngie
299313535Sngie	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
300313535Sngie
301313535Sngie	export RUMP_SERVER=${RUMPCLI}
302313535Sngie
303313535Sngie	# Terminate rtadvd to prevent new RA messages from coming
304313535Sngie	# Note that ifconfig down; kill -TERM doesn't work
305313535Sngie	kill -KILL `cat ${PIDFILE}`
306313535Sngie
307313535Sngie	# Flush all the entries in the default router list
308313535Sngie	atf_check -s exit:0 rump.ndp -R
309313535Sngie
310313535Sngie	$DEBUG && dump_entries
311313535Sngie	atf_check -s exit:0 -o empty rump.ndp -r
312313535Sngie	atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p
313313535Sngie	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
314313535Sngie	atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
315313535Sngie	atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
316303980Sngie	atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
317303980Sngie	unset RUMP_SERVER
318303980Sngie
319313535Sngie	rump_server_destroy_ifaces
320313535Sngie}
321313535Sngie
322313535Sngiera_flush_defrouter_entries_cleanup()
323313535Sngie{
324313535Sngie
325313535Sngie	$DEBUG && dump
326313535Sngie	cleanup
327313535Sngie}
328313535Sngie
329313535Sngieatf_test_case ra_delete_address cleanup
330313535Sngiera_delete_address_head()
331313535Sngie{
332313535Sngie
333313535Sngie	atf_set "descr" "Tests for deleting auto-configured address"
334313535Sngie	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
335313535Sngie}
336313535Sngie
337313535Sngiera_delete_address_body()
338313535Sngie{
339313535Sngie
340313535Sngie	rump_server_fs_start $RUMPSRV netinet6
341313535Sngie	rump_server_start $RUMPCLI netinet6
342313535Sngie
343313535Sngie	setup_shmif0 ${RUMPSRV} ${IP6SRV}
344313535Sngie	setup_shmif0 ${RUMPCLI} ${IP6CLI}
345313535Sngie
346313535Sngie	init_server $RUMPSRV
347313535Sngie
348313535Sngie	create_rtadvdconfig
349313535Sngie
350313535Sngie	export RUMP_SERVER=${RUMPCLI}
351313535Sngie	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
352313535Sngie	unset RUMP_SERVER
353313535Sngie
354313535Sngie	start_rtadvd $RUMPSRV $PIDFILE
355313535Sngie	sleep $WAITTIME
356313535Sngie
357313535Sngie	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
358313535Sngie
359313535Sngie	export RUMP_SERVER=${RUMPCLI}
360313535Sngie	$DEBUG && rump.ifconfig shmif0
361313535Sngie	atf_check -s exit:0 rump.ifconfig shmif0 inet6 \
362313535Sngie	    $(rump.ifconfig shmif0 |awk '/AUTOCONF/ {print $2}') delete
363313535Sngie	unset RUMP_SERVER
364313535Sngie
365303980Sngie	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
366303980Sngie	wait_term ${PIDFILE}
367303980Sngie
368313535Sngie	rump_server_destroy_ifaces
369303980Sngie}
370303980Sngie
371313535Sngiera_delete_address_cleanup()
372303980Sngie{
373303980Sngie
374303980Sngie	if [ -f ${PIDFILE} ]; then
375303980Sngie		kill -TERM `cat ${PIDFILE}`
376303980Sngie		wait_term ${PIDFILE}
377303980Sngie	fi
378303980Sngie
379313535Sngie	$DEBUG && dump
380313535Sngie	cleanup
381303980Sngie}
382303980Sngie
383313535Sngieatf_test_case ra_multiple_routers cleanup
384313535Sngiera_multiple_routers_head()
385313535Sngie{
386313535Sngie
387313535Sngie	atf_set "descr" "Tests for multiple routers"
388313535Sngie	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
389313535Sngie}
390313535Sngie
391313535Sngiera_multiple_routers_body()
392313535Sngie{
393313535Sngie	local n=
394313535Sngie
395313535Sngie	rump_server_fs_start $RUMPSRV netinet6
396313535Sngie	rump_server_fs_start $RUMPSRV3 netinet6
397313535Sngie	rump_server_start $RUMPCLI netinet6
398313535Sngie
399313535Sngie	setup_shmif0 ${RUMPSRV} ${IP6SRV}
400313535Sngie	setup_shmif0 ${RUMPSRV3} ${IP6SRV3}
401313535Sngie	setup_shmif0 ${RUMPCLI} ${IP6CLI}
402313535Sngie
403313535Sngie	init_server $RUMPSRV
404313535Sngie	init_server $RUMPSRV3
405313535Sngie
406313535Sngie	create_rtadvdconfig
407313535Sngie
408313535Sngie	export RUMP_SERVER=${RUMPCLI}
409313535Sngie	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
410313535Sngie	unset RUMP_SERVER
411313535Sngie
412313535Sngie	start_rtadvd $RUMPSRV $PIDFILE
413313535Sngie	start_rtadvd $RUMPSRV3 $PIDFILE3
414313535Sngie	sleep $WAITTIME
415313535Sngie
416313535Sngie	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
417313535Sngie	check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX
418313535Sngie
419313535Sngie	export RUMP_SERVER=$RUMPCLI
420313535Sngie	# Two prefixes are advertised by differnt two routers
421313535Sngie	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
422313535Sngie	atf_check_equal $n 2
423313535Sngie	unset RUMP_SERVER
424313535Sngie
425313535Sngie	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
426313535Sngie	wait_term ${PIDFILE}
427313535Sngie	atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}`
428313535Sngie	wait_term ${PIDFILE3}
429313535Sngie
430313535Sngie	rump_server_destroy_ifaces
431313535Sngie}
432313535Sngie
433313535Sngiera_multiple_routers_cleanup()
434313535Sngie{
435313535Sngie
436313535Sngie	if [ -f ${PIDFILE} ]; then
437313535Sngie		kill -TERM `cat ${PIDFILE}`
438313535Sngie		wait_term ${PIDFILE}
439313535Sngie	fi
440313535Sngie	if [ -f ${PIDFILE3} ]; then
441313535Sngie		kill -TERM `cat ${PIDFILE3}`
442313535Sngie		wait_term ${PIDFILE3}
443313535Sngie	fi
444313535Sngie
445313535Sngie	$DEBUG && dump
446313535Sngie	cleanup
447313535Sngie}
448313535Sngie
449313535Sngieatf_test_case ra_multiple_routers_single_prefix cleanup
450313535Sngiera_multiple_routers_single_prefix_head()
451313535Sngie{
452313535Sngie
453313535Sngie	atf_set "descr" "Tests for multiple routers with a single prefix"
454313535Sngie	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
455313535Sngie}
456313535Sngie
457313535Sngiera_multiple_routers_single_prefix_body()
458313535Sngie{
459313535Sngie	local n=
460313535Sngie
461313535Sngie	rump_server_fs_start $RUMPSRV netinet6
462313535Sngie	rump_server_fs_start $RUMPSRV1_2 netinet6
463313535Sngie	rump_server_start $RUMPCLI netinet6
464313535Sngie
465313535Sngie	setup_shmif0 ${RUMPSRV} ${IP6SRV}
466313535Sngie	setup_shmif0 ${RUMPSRV1_2} ${IP6SRV1_2}
467313535Sngie	setup_shmif0 ${RUMPCLI} ${IP6CLI}
468313535Sngie
469313535Sngie	init_server $RUMPSRV
470313535Sngie	init_server $RUMPSRV1_2
471313535Sngie
472313535Sngie	create_rtadvdconfig
473313535Sngie
474313535Sngie	export RUMP_SERVER=${RUMPCLI}
475313535Sngie	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
476313535Sngie	unset RUMP_SERVER
477313535Sngie
478313535Sngie	start_rtadvd $RUMPSRV $PIDFILE
479313535Sngie	start_rtadvd $RUMPSRV1_2 $PIDFILE1_2
480313535Sngie	sleep $WAITTIME
481313535Sngie
482313535Sngie	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
483313535Sngie	check_entries $RUMPCLI $RUMPSRV1_2 $IP6SRV_PREFIX
484313535Sngie
485313535Sngie	export RUMP_SERVER=$RUMPCLI
486313535Sngie	# One prefix is advertised by differnt two routers
487313535Sngie	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
488313535Sngie	atf_check_equal $n 1
489313535Sngie	unset RUMP_SERVER
490313535Sngie
491313535Sngie	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
492313535Sngie	wait_term ${PIDFILE}
493313535Sngie	atf_check -s exit:0 kill -TERM `cat ${PIDFILE1_2}`
494313535Sngie	wait_term ${PIDFILE1_2}
495313535Sngie
496313535Sngie	rump_server_destroy_ifaces
497313535Sngie}
498313535Sngie
499313535Sngiera_multiple_routers_single_prefix_cleanup()
500313535Sngie{
501313535Sngie
502313535Sngie	if [ -f ${PIDFILE} ]; then
503313535Sngie		kill -TERM `cat ${PIDFILE}`
504313535Sngie		wait_term ${PIDFILE}
505313535Sngie	fi
506313535Sngie	if [ -f ${PIDFILE1_2} ]; then
507313535Sngie		kill -TERM `cat ${PIDFILE1_2}`
508313535Sngie		wait_term ${PIDFILE1_2}
509313535Sngie	fi
510313535Sngie
511313535Sngie	$DEBUG && dump
512313535Sngie	cleanup
513313535Sngie}
514313535Sngie
515313535Sngieatf_test_case ra_multiple_routers_maxifprefixes cleanup
516313535Sngiera_multiple_routers_maxifprefixes_head()
517313535Sngie{
518313535Sngie
519313535Sngie	atf_set "descr" "Tests for exceeding the number of maximum prefixes"
520313535Sngie	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
521313535Sngie}
522313535Sngie
523313535Sngiera_multiple_routers_maxifprefixes_body()
524313535Sngie{
525313535Sngie	local n=
526313535Sngie
527313535Sngie	rump_server_fs_start $RUMPSRV netinet6
528313535Sngie	rump_server_fs_start $RUMPSRV3 netinet6
529313535Sngie	rump_server_fs_start $RUMPSRV4 netinet6
530313535Sngie	rump_server_start $RUMPCLI netinet6
531313535Sngie
532313535Sngie	setup_shmif0 ${RUMPSRV} ${IP6SRV}
533313535Sngie	setup_shmif0 ${RUMPSRV3} ${IP6SRV3}
534313535Sngie	setup_shmif0 ${RUMPSRV4} ${IP6SRV4}
535313535Sngie	setup_shmif0 ${RUMPCLI} ${IP6CLI}
536313535Sngie
537313535Sngie	init_server $RUMPSRV
538313535Sngie	init_server $RUMPSRV3
539313535Sngie	init_server $RUMPSRV4
540313535Sngie
541313535Sngie	create_rtadvdconfig
542313535Sngie
543313535Sngie	export RUMP_SERVER=${RUMPCLI}
544313535Sngie	atf_check -s exit:0 -o match:'0.->.1' \
545313535Sngie	    rump.sysctl -w net.inet6.ip6.accept_rtadv=1
546313535Sngie	# Limit the maximum number of prefix entries to 2
547313535Sngie	atf_check -s exit:0 -o match:'16.->.2' \
548313535Sngie	    rump.sysctl -w net.inet6.ip6.maxifprefixes=2
549313535Sngie	unset RUMP_SERVER
550313535Sngie
551313535Sngie	start_rtadvd $RUMPSRV $PIDFILE
552313535Sngie	start_rtadvd $RUMPSRV3 $PIDFILE3
553313535Sngie	sleep $WAITTIME
554313535Sngie
555313535Sngie	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
556313535Sngie	check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX
557313535Sngie
558313535Sngie	start_rtadvd $RUMPSRV4 $PIDFILE4
559313535Sngie	sleep $WAITTIME
560313535Sngie
561313535Sngie	export RUMP_SERVER=${RUMPCLI}
562313535Sngie	$DEBUG && dump_entries
563313535Sngie	# There should remain two prefixes
564313535Sngie	n=$(rump.ndp -p |grep 'advertised by' |wc -l)
565313535Sngie	atf_check_equal $n 2
566313535Sngie	# TODO check other conditions
567313535Sngie	unset RUMP_SERVER
568313535Sngie
569313535Sngie	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
570313535Sngie	wait_term ${PIDFILE}
571313535Sngie	atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}`
572313535Sngie	wait_term ${PIDFILE3}
573313535Sngie	atf_check -s exit:0 kill -TERM `cat ${PIDFILE4}`
574313535Sngie	wait_term ${PIDFILE4}
575313535Sngie
576313535Sngie	rump_server_destroy_ifaces
577313535Sngie}
578313535Sngie
579313535Sngiera_multiple_routers_maxifprefixes_cleanup()
580313535Sngie{
581313535Sngie
582313535Sngie	if [ -f ${PIDFILE} ]; then
583313535Sngie		kill -TERM `cat ${PIDFILE}`
584313535Sngie		wait_term ${PIDFILE}
585313535Sngie	fi
586313535Sngie	if [ -f ${PIDFILE3} ]; then
587313535Sngie		kill -TERM `cat ${PIDFILE3}`
588313535Sngie		wait_term ${PIDFILE3}
589313535Sngie	fi
590313535Sngie	if [ -f ${PIDFILE4} ]; then
591313535Sngie		kill -TERM `cat ${PIDFILE4}`
592313535Sngie		wait_term ${PIDFILE4}
593313535Sngie	fi
594313535Sngie
595313535Sngie	$DEBUG && dump
596313535Sngie	cleanup
597313535Sngie}
598313535Sngie
599313535Sngieatf_test_case ra_temporary_address cleanup
600313535Sngiera_temporary_address_head()
601313535Sngie{
602313535Sngie
603313535Sngie	atf_set "descr" "Tests for IPv6 temporary address"
604313535Sngie	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
605313535Sngie}
606313535Sngie
607314817Sngiecheck_echo_request_pkt()
608314817Sngie{
609314817Sngie	local pkt="$2 > $3: .+ echo request"
610314817Sngie
611314817Sngie	extract_new_packets $1 > ./out
612314817Sngie	$DEBUG && echo $pkt
613314817Sngie	$DEBUG && cat ./out
614314817Sngie	atf_check -s exit:0 -o match:"$pkt" cat ./out
615314817Sngie}
616314817Sngie
617313535Sngiera_temporary_address_body()
618313535Sngie{
619314817Sngie	local ip_auto= ip_temp=
620313535Sngie
621313535Sngie	rump_server_fs_start $RUMPSRV netinet6
622313535Sngie	rump_server_start $RUMPCLI netinet6
623313535Sngie
624314817Sngie	setup_shmif0 $RUMPSRV $IP6SRV
625313535Sngie	init_server $RUMPSRV
626314817Sngie	setup_shmif0 $RUMPCLI $IP6CLI
627313535Sngie
628314817Sngie	export RUMP_SERVER=$RUMPCLI
629313535Sngie	atf_check -s exit:0 -o match:'0.->.1' \
630313535Sngie	    rump.sysctl -w net.inet6.ip6.accept_rtadv=1
631313535Sngie	atf_check -s exit:0 -o match:'0.->.1' \
632313535Sngie	    rump.sysctl -w net.inet6.ip6.use_tempaddr=1
633313535Sngie	unset RUMP_SERVER
634313535Sngie
635314817Sngie	create_rtadvdconfig
636313535Sngie	start_rtadvd $RUMPSRV $PIDFILE
637313535Sngie	sleep $WAITTIME
638313535Sngie
639313535Sngie	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
640313535Sngie
641314817Sngie	export RUMP_SERVER=$RUMPCLI
642314817Sngie
643313535Sngie	# Check temporary address
644314817Sngie	atf_check -s exit:0 \
645314817Sngie	    -o match:"$IP6SRV_PREFIX.+<(TENTATIVE,)?AUTOCONF,TEMPORARY>" \
646313535Sngie	    rump.ifconfig shmif0 inet6
647314817Sngie
648314817Sngie	#
649314817Sngie	# Testing net.inet6.ip6.prefer_tempaddr
650314817Sngie	#
651314817Sngie	atf_check -s exit:0 rump.ifconfig -w 10
652314817Sngie	$DEBUG && rump.ifconfig shmif0
653314817Sngie	ip_auto=$(rump.ifconfig shmif0 |awk '/<AUTOCONF>/ {sub(/\/[0-9]*/, ""); print $2;}')
654314817Sngie	ip_temp=$(rump.ifconfig shmif0 |awk '/<AUTOCONF,TEMPORARY>/ {sub(/\/[0-9]*/, ""); print $2;}')
655314817Sngie	$DEBUG && echo $ip_auto $ip_temp
656314817Sngie
657314817Sngie	# Ignore old packets
658314817Sngie	extract_new_packets bus1 > /dev/null
659314817Sngie
660314817Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -X 2 -c 1 $IP6SRV
661314817Sngie	# autoconf (non-temporal) address should be used as the source address
662314817Sngie	check_echo_request_pkt bus1 $ip_auto $IP6SRV
663314817Sngie
664314817Sngie	# Enable net.inet6.ip6.prefer_tempaddr
665314817Sngie	atf_check -s exit:0 -o match:'0.->.1' \
666314817Sngie	    rump.sysctl -w net.inet6.ip6.prefer_tempaddr=1
667314817Sngie
668314817Sngie	atf_check -s exit:0 -o ignore rump.ping6 -n -X 2 -c 1 $IP6SRV
669314817Sngie	# autoconf, temporal address should be used as the source address
670314817Sngie	check_echo_request_pkt bus1 $ip_temp $IP6SRV
671314817Sngie
672313535Sngie	unset RUMP_SERVER
673313535Sngie
674313535Sngie	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
675314817Sngie	wait_term $PIDFILE
676313535Sngie
677313535Sngie	rump_server_destroy_ifaces
678313535Sngie}
679313535Sngie
680313535Sngiera_temporary_address_cleanup()
681313535Sngie{
682313535Sngie
683313535Sngie	if [ -f ${PIDFILE} ]; then
684313535Sngie		kill -TERM `cat ${PIDFILE}`
685313535Sngie		wait_term ${PIDFILE}
686313535Sngie	fi
687313535Sngie
688313535Sngie	$DEBUG && dump
689313535Sngie	cleanup
690313535Sngie}
691313535Sngie
692303980Sngieatf_init_test_cases()
693303980Sngie{
694303980Sngie
695313535Sngie	atf_add_test_case ra_basic
696313535Sngie	atf_add_test_case ra_flush_prefix_entries
697313535Sngie	atf_add_test_case ra_flush_defrouter_entries
698313535Sngie	atf_add_test_case ra_delete_address
699313535Sngie	atf_add_test_case ra_multiple_routers
700313535Sngie	atf_add_test_case ra_multiple_routers_single_prefix
701313535Sngie	atf_add_test_case ra_multiple_routers_maxifprefixes
702313535Sngie	atf_add_test_case ra_temporary_address
703303980Sngie}
704