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