t_ra.sh revision 1.12
1#	$NetBSD: t_ra.sh,v 1.12 2016/12/16 09:11:18 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
29RUMPCLI=unix://r2
30RUMPSRV3=unix://r3
31IP6SRV=fc00:1::1
32IP6SRV_PREFIX=fc00:1:
33IP6CLI=fc00:2::2
34IP6SRV3=fc00:3::1
35IP6SRV3_PREFIX=fc00:3:
36PIDFILE=./rump.rtadvd.pid
37PIDFILE3=./rump.rtadvd.pid3
38CONFIG=./rtadvd.conf
39DEBUG=${DEBUG:-true}
40
41init_server()
42{
43
44	export RUMP_SERVER=$1
45	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.forwarding=1
46	export LD_PRELOAD=/usr/lib/librumphijack.so
47	atf_check -s exit:0 mkdir -p /rump/var/chroot/rtadvd
48	unset LD_PRELOAD
49	unset RUMP_SERVER
50}
51
52setup_shmif0()
53{
54	local sock=$1
55	local IP6ADDR=$2
56
57	rump_server_add_iface $sock shmif0 bus1
58
59	export RUMP_SERVER=$sock
60	atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6ADDR}
61	atf_check -s exit:0 rump.ifconfig shmif0 up
62	atf_check -s exit:0 rump.ifconfig -w 10
63
64	$DEBUG && rump.ifconfig
65}
66
67wait_term()
68{
69	local PIDFILE=${1}
70	shift
71
72	while [ -f ${PIDFILE} ]
73	do
74		sleep 0.2
75	done
76
77	return 0
78}
79
80create_rtadvdconfig()
81{
82
83	cat << _EOF > ${CONFIG}
84shmif0:\
85	:mtu#1300:maxinterval#4:mininterval#3:
86_EOF
87}
88
89start_rtadvd()
90{
91	local sock=$1
92	local pidfile=$2
93
94	export RUMP_SERVER=$sock
95	atf_check -s exit:0 rump.rtadvd -c ${CONFIG} -p $pidfile shmif0
96	atf_check -s exit:0 sleep 3
97	atf_check -s exit:0 -o ignore -e empty cat $pidfile
98	unset RUMP_SERVER
99}
100
101check_entries()
102{
103	local cli=$1
104	local srv=$2
105	local addr_prefix=$3
106	local mac_srv= ll_srv=
107
108	ll_srv=$(get_linklocal_addr $srv shmif0)
109	mac_srv=$(get_macaddr $srv shmif0)
110
111	export RUMP_SERVER=$cli
112	$DEBUG && dump_entries
113	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
114	atf_check -s exit:0 -o match:'advertised' rump.ndp -p
115	atf_check -s exit:0 -o match:"${ll_srv}%shmif0 \(reachable\)" rump.ndp -p
116	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
117	atf_check -s exit:0 \
118	    -o match:"$ll_srv%shmif0 +$mac_srv +shmif0 +(23h59m|1d0h0m)..s S R" \
119	    rump.ndp -n -a
120	atf_check -s exit:0 -o match:$addr_prefix rump.ndp -n -a
121	atf_check -s exit:0 -o match:$addr_prefix rump.ifconfig shmif0 inet6
122	unset RUMP_SERVER
123}
124
125dump_entries()
126{
127
128	echo ndp -n -a
129	rump.ndp -n -a
130	echo ndp -p
131	rump.ndp -p
132	echo ndp -r
133	rump.ndp -r
134}
135
136atf_test_case ra_basic cleanup
137ra_basic_head()
138{
139
140	atf_set "descr" "Tests for basic functions of router advaertisement(RA)"
141	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
142}
143
144ra_basic_body()
145{
146
147	rump_server_fs_start $RUMPSRV netinet6
148	rump_server_start $RUMPCLI netinet6
149
150	setup_shmif0 ${RUMPSRV} ${IP6SRV}
151	init_server $RUMPSRV
152
153	setup_shmif0 ${RUMPCLI} ${IP6CLI}
154	export RUMP_SERVER=${RUMPCLI}
155	$DEBUG && rump.ndp -n -a
156	atf_check -s exit:0 -o match:'= 0' rump.sysctl net.inet6.ip6.accept_rtadv
157	unset RUMP_SERVER
158
159	create_rtadvdconfig
160	start_rtadvd $RUMPSRV $PIDFILE
161
162	export RUMP_SERVER=${RUMPCLI}
163	atf_check -s exit:0 -o empty rump.ndp -r
164	atf_check -s exit:0 -o not-match:'advertised' rump.ndp -p
165	atf_check -s exit:0 -o match:'linkmtu=0' rump.ndp -n -i shmif0
166	atf_check -s exit:0 -o not-match:'S R' rump.ndp -n -a
167	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a
168	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
169	unset RUMP_SERVER
170
171	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
172	wait_term ${PIDFILE}
173
174	export RUMP_SERVER=${RUMPCLI}
175	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
176	unset RUMP_SERVER
177
178	start_rtadvd $RUMPSRV $PIDFILE
179
180	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
181
182	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
183	wait_term ${PIDFILE}
184
185	rump_server_destroy_ifaces
186}
187
188ra_basic_cleanup()
189{
190
191	if [ -f ${PIDFILE} ]; then
192		kill -TERM `cat ${PIDFILE}`
193		wait_term ${PIDFILE}
194	fi
195
196	$DEBUG && dump
197	cleanup
198}
199
200atf_test_case ra_flush_prefix_entries cleanup
201ra_flush_prefix_entries_head()
202{
203
204	atf_set "descr" "Tests for flushing prefixes (ndp -P)"
205	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
206}
207
208ra_flush_prefix_entries_body()
209{
210
211	rump_server_fs_start $RUMPSRV netinet6
212	rump_server_start $RUMPCLI netinet6
213
214	setup_shmif0 ${RUMPSRV} ${IP6SRV}
215	setup_shmif0 ${RUMPCLI} ${IP6CLI}
216
217	init_server $RUMPSRV
218
219	create_rtadvdconfig
220
221	export RUMP_SERVER=${RUMPCLI}
222	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
223	unset RUMP_SERVER
224
225	start_rtadvd $RUMPSRV $PIDFILE
226
227	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
228
229	export RUMP_SERVER=${RUMPCLI}
230
231	# Terminate rtadvd to prevent new RA messages from coming
232	# Note that ifconfig down; kill -TERM doesn't work
233	kill -KILL `cat ${PIDFILE}`
234
235	# Flush all the entries in the prefix list
236	atf_check -s exit:0 rump.ndp -P
237
238	$DEBUG && dump_entries
239	atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r
240	atf_check -s exit:0 -o empty rump.ndp -p
241	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
242	atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
243	atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
244	atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6
245	unset RUMP_SERVER
246
247	rump_server_destroy_ifaces
248}
249
250ra_flush_prefix_entries_cleanup()
251{
252
253	$DEBUG && dump
254	cleanup
255}
256
257atf_test_case ra_flush_defrouter_entries cleanup
258ra_flush_defrouter_entries_head()
259{
260
261	atf_set "descr" "Tests for flushing default routers (ndp -R)"
262	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
263}
264
265ra_flush_defrouter_entries_body()
266{
267
268	rump_server_fs_start $RUMPSRV netinet6
269	rump_server_start $RUMPCLI netinet6
270
271	setup_shmif0 ${RUMPSRV} ${IP6SRV}
272	setup_shmif0 ${RUMPCLI} ${IP6CLI}
273
274	init_server $RUMPSRV
275
276	create_rtadvdconfig
277
278	export RUMP_SERVER=${RUMPCLI}
279	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
280	unset RUMP_SERVER
281
282	start_rtadvd $RUMPSRV $PIDFILE
283
284	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
285
286	export RUMP_SERVER=${RUMPCLI}
287
288	# Terminate rtadvd to prevent new RA messages from coming
289	# Note that ifconfig down; kill -TERM doesn't work
290	kill -KILL `cat ${PIDFILE}`
291
292	# Flush all the entries in the default router list
293	atf_check -s exit:0 rump.ndp -R
294
295	$DEBUG && dump_entries
296	atf_check -s exit:0 -o empty rump.ndp -r
297	atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p
298	atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0
299	atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a
300	atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a
301	atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6
302	unset RUMP_SERVER
303
304	rump_server_destroy_ifaces
305}
306
307ra_flush_defrouter_entries_cleanup()
308{
309
310	$DEBUG && dump
311	cleanup
312}
313
314atf_test_case ra_delete_address cleanup
315ra_delete_address_head()
316{
317
318	atf_set "descr" "Tests for deleting auto-configured address"
319	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
320}
321
322ra_delete_address_body()
323{
324
325	rump_server_fs_start $RUMPSRV netinet6
326	rump_server_start $RUMPCLI netinet6
327
328	setup_shmif0 ${RUMPSRV} ${IP6SRV}
329	setup_shmif0 ${RUMPCLI} ${IP6CLI}
330
331	init_server $RUMPSRV
332
333	create_rtadvdconfig
334
335	export RUMP_SERVER=${RUMPCLI}
336	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
337	unset RUMP_SERVER
338
339	start_rtadvd $RUMPSRV $PIDFILE
340
341	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
342
343	export RUMP_SERVER=${RUMPCLI}
344	$DEBUG && rump.ifconfig shmif0
345	atf_check -s exit:0 rump.ifconfig shmif0 inet6 \
346	    $(rump.ifconfig shmif0 |awk '/AUTOCONF/ {print $2}') delete
347	unset RUMP_SERVER
348
349	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
350	wait_term ${PIDFILE}
351
352	rump_server_destroy_ifaces
353}
354
355ra_delete_address_cleanup()
356{
357
358	if [ -f ${PIDFILE} ]; then
359		kill -TERM `cat ${PIDFILE}`
360		wait_term ${PIDFILE}
361	fi
362
363	$DEBUG && dump
364	cleanup
365}
366
367atf_test_case ra_multiple_routers cleanup
368ra_multiple_routers_head()
369{
370
371	atf_set "descr" "Tests for deleting auto-configured address"
372	atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig"
373}
374
375ra_multiple_routers_body()
376{
377
378	rump_server_fs_start $RUMPSRV netinet6
379	rump_server_fs_start $RUMPSRV3 netinet6
380	rump_server_start $RUMPCLI netinet6
381
382	setup_shmif0 ${RUMPSRV} ${IP6SRV}
383	setup_shmif0 ${RUMPSRV3} ${IP6SRV3}
384	setup_shmif0 ${RUMPCLI} ${IP6CLI}
385
386	init_server $RUMPSRV
387	init_server $RUMPSRV3
388
389	create_rtadvdconfig
390
391	export RUMP_SERVER=${RUMPCLI}
392	atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1
393	unset RUMP_SERVER
394
395	start_rtadvd $RUMPSRV $PIDFILE
396	start_rtadvd $RUMPSRV3 $PIDFILE3
397
398	check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX
399	check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX
400
401	atf_check -s exit:0 kill -TERM `cat ${PIDFILE}`
402	wait_term ${PIDFILE}
403	atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}`
404	wait_term ${PIDFILE3}
405
406	rump_server_destroy_ifaces
407}
408
409ra_multiple_routers_cleanup()
410{
411
412	if [ -f ${PIDFILE} ]; then
413		kill -TERM `cat ${PIDFILE}`
414		wait_term ${PIDFILE}
415	fi
416	if [ -f ${PIDFILE3} ]; then
417		kill -TERM `cat ${PIDFILE3}`
418		wait_term ${PIDFILE3}
419	fi
420
421	$DEBUG && dump
422	cleanup
423}
424
425atf_init_test_cases()
426{
427
428	atf_add_test_case ra_basic
429	atf_add_test_case ra_flush_prefix_entries
430	atf_add_test_case ra_flush_defrouter_entries
431	atf_add_test_case ra_delete_address
432	atf_add_test_case ra_multiple_routers
433}
434