t_forwarding.sh revision 313498
1#	$NetBSD: t_forwarding.sh,v 1.15 2016/08/10 21:33:52 kre Exp $
2#
3# Copyright (c) 2015 The NetBSD Foundation, 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
28inetserver="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_shmif -lrumpdev"
29inet6server="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_netinet6 -lrumpnet_shmif -lrumpdev"
30
31SOCKSRC=unix://commsock1
32SOCKFWD=unix://commsock2
33SOCKDST=unix://commsock3
34IP4SRC=10.0.1.2
35IP4SRCGW=10.0.1.1
36IP4DSTGW=10.0.2.1
37IP4DST=10.0.2.2
38IP4DST_BCAST=10.0.2.255
39IP6SRC=fc00:0:0:1::2
40IP6SRCGW=fc00:0:0:1::1
41IP6DSTGW=fc00:0:0:2::1
42IP6DST=fc00:0:0:2::2
43HTTPD_PID=httpd.pid
44HTML_FILE=index.html
45
46DEBUG=false
47TIMEOUT=5
48
49atf_test_case ipforwarding_v4 cleanup
50atf_test_case ipforwarding_v6 cleanup
51atf_test_case ipforwarding_fastforward_v4 cleanup
52atf_test_case ipforwarding_fastforward_v6 cleanup
53atf_test_case ipforwarding_misc cleanup
54
55ipforwarding_v4_head()
56{
57	atf_set "descr" "Does IPv4 forwarding tests"
58	atf_set "require.progs" "rump_server"
59}
60
61ipforwarding_v6_head()
62{
63	atf_set "descr" "Does IPv6 forwarding tests"
64	atf_set "require.progs" "rump_server"
65}
66
67ipforwarding_misc_head()
68{
69	atf_set "descr" "Does IPv4 forwarding tests"
70	atf_set "require.progs" "rump_server"
71}
72
73setup_endpoint()
74{
75	sock=${1}
76	addr=${2}
77	bus=${3}
78	mode=${4}
79	gw=${5}
80
81	export RUMP_SERVER=${sock}
82	atf_check -s exit:0 rump.ifconfig shmif0 create
83	atf_check -s exit:0 rump.ifconfig shmif0 linkstr ${bus}
84	if [ $mode = "ipv6" ]; then
85		atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${addr}
86		atf_check -s exit:0 -o ignore rump.route add -inet6 default ${gw}
87	else
88		atf_check -s exit:0 rump.ifconfig shmif0 inet ${addr} netmask 0xffffff00
89		atf_check -s exit:0 -o ignore rump.route add default ${gw}
90	fi
91	atf_check -s exit:0 rump.ifconfig shmif0 up
92
93	if $DEBUG; then
94		rump.ifconfig shmif0
95		rump.netstat -nr
96	fi	
97}
98
99test_endpoint()
100{
101	sock=${1}
102	addr=${2}
103	bus=${3}
104	mode=${4}
105
106	export RUMP_SERVER=${sock}
107	atf_check -s exit:0 -o match:shmif0 rump.ifconfig
108	if [ $mode = "ipv6" ]; then
109		atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${addr}
110	else
111		atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 ${addr}
112	fi
113}
114
115setup_forwarder()
116{
117	mode=${1}
118
119	export RUMP_SERVER=$SOCKFWD
120	atf_check -s exit:0 rump.ifconfig shmif0 create
121	atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
122
123	atf_check -s exit:0 rump.ifconfig shmif1 create
124	atf_check -s exit:0 rump.ifconfig shmif1 linkstr bus2
125
126	if [ $mode = "ipv6" ]; then
127		atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6SRCGW}
128		atf_check -s exit:0 rump.ifconfig shmif1 inet6 ${IP6DSTGW}
129	else
130		atf_check -s exit:0 rump.ifconfig shmif0 inet ${IP4SRCGW} netmask 0xffffff00
131		atf_check -s exit:0 rump.ifconfig shmif1 inet ${IP4DSTGW} netmask 0xffffff00
132	fi
133
134	atf_check -s exit:0 rump.ifconfig shmif0 up
135	atf_check -s exit:0 rump.ifconfig shmif1 up
136
137	if $DEBUG; then
138		rump.netstat -nr
139		if [ $mode = "ipv6" ]; then
140			rump.sysctl net.inet6.ip6.forwarding
141		else
142			rump.sysctl net.inet.ip.forwarding
143		fi
144	fi
145}
146
147setup()
148{
149	atf_check -s exit:0 ${inetserver} $SOCKSRC
150	atf_check -s exit:0 ${inetserver} $SOCKFWD
151	atf_check -s exit:0 ${inetserver} $SOCKDST
152
153	setup_endpoint $SOCKSRC $IP4SRC bus1 ipv4 $IP4SRCGW
154	setup_endpoint $SOCKDST $IP4DST bus2 ipv4 $IP4DSTGW
155	setup_forwarder ipv4
156}
157
158setup6()
159{
160	atf_check -s exit:0 ${inet6server} $SOCKSRC
161	atf_check -s exit:0 ${inet6server} $SOCKFWD
162	atf_check -s exit:0 ${inet6server} $SOCKDST
163
164	setup_endpoint $SOCKSRC $IP6SRC bus1 ipv6 $IP6SRCGW
165	setup_endpoint $SOCKDST $IP6DST bus2 ipv6 $IP6DSTGW
166	setup_forwarder ipv6
167}
168
169setup_bozo()
170{
171	local ip=$1
172
173	export RUMP_SERVER=$SOCKDST
174
175	touch $HTML_FILE
176	# start bozo in daemon mode
177	atf_check -s exit:0 env LD_PRELOAD=/usr/lib/librumphijack.so \
178	    /usr/libexec/httpd -P $HTTPD_PID -i $ip -b -s $(pwd)
179
180	$DEBUG && rump.netstat -a
181}
182
183test_http_get()
184{
185	local ip=$1
186
187	export RUMP_SERVER=$SOCKFWD
188	atf_check -s exit:0 rump.arp -d -a
189
190	export RUMP_SERVER=$SOCKSRC
191
192	# get the webpage
193	atf_check -s exit:0 env LD_PRELOAD=/usr/lib/librumphijack.so 	\
194	    ftp -q $TIMEOUT -o out http://$ip/$HTML_FILE
195}
196
197test_setup()
198{
199	test_endpoint $SOCKSRC $IP4SRC bus1 ipv4
200	test_endpoint $SOCKDST $IP4DST bus2 ipv4
201
202	export RUMP_SERVER=$SOCKFWD
203	atf_check -s exit:0 -o match:shmif0 rump.ifconfig
204	atf_check -s exit:0 -o match:shmif1 rump.ifconfig
205
206	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 ${IP4SRCGW}
207	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 ${IP4DSTGW}
208}
209
210test_setup6()
211{
212	test_endpoint $SOCKSRC $IP6SRC bus1 ipv6
213	test_endpoint $SOCKDST $IP6DST bus2 ipv6
214
215	export RUMP_SERVER=$SOCKFWD
216	atf_check -s exit:0 -o match:shmif0 rump.ifconfig
217	atf_check -s exit:0 -o match:shmif1 rump.ifconfig
218
219	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${IP6SRCGW}
220	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${IP6DSTGW}
221}
222
223setup_forwarding()
224{
225	export RUMP_SERVER=$SOCKFWD
226	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.forwarding=1
227}
228
229setup_forwarding6()
230{
231	export RUMP_SERVER=$SOCKFWD
232	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet6.ip6.forwarding=1
233}
234
235setup_directed_broadcast()
236{
237	export RUMP_SERVER=$SOCKFWD
238	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.directed-broadcast=1
239}
240
241setup_icmp_bmcastecho()
242{
243	export RUMP_SERVER=$SOCKDST
244	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.icmp.bmcastecho=1
245}
246
247teardown_forwarding()
248{
249	export RUMP_SERVER=$SOCKFWD
250	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.forwarding=0
251}
252
253teardown_forwarding6()
254{
255	export RUMP_SERVER=$SOCKFWD
256	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet6.ip6.forwarding=0
257}
258
259teardown_directed_broadcast()
260{
261	export RUMP_SERVER=$SOCKFWD
262	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.directed-broadcast=0
263}
264
265teardown_icmp_bmcastecho()
266{
267	export RUMP_SERVER=$SOCKDST
268	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.icmp.bmcastecho=0
269}
270
271teardown_interfaces()
272{
273	export RUMP_SERVER=$SOCKSRC
274	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 destroy
275
276	export RUMP_SERVER=$SOCKFWD
277	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 destroy
278	atf_check -s exit:0 -o ignore rump.ifconfig shmif1 destroy
279
280	export RUMP_SERVER=$SOCKDST
281	atf_check -s exit:0 -o ignore rump.ifconfig shmif0 destroy
282}
283
284test_setup_forwarding()
285{
286	export RUMP_SERVER=$SOCKFWD
287	atf_check -s exit:0 -o match:"net.inet.ip.forwarding = 1" \
288	    rump.sysctl net.inet.ip.forwarding
289}
290test_setup_forwarding6()
291{
292	export RUMP_SERVER=$SOCKFWD
293	atf_check -s exit:0 -o match:"net.inet6.ip6.forwarding = 1" \
294	    rump.sysctl net.inet6.ip6.forwarding
295}
296
297test_teardown_forwarding()
298{
299	export RUMP_SERVER=$SOCKFWD
300	atf_check -s exit:0 -o match:"net.inet.ip.forwarding = 0" \
301	    rump.sysctl net.inet.ip.forwarding
302}
303test_teardown_forwarding6()
304{
305	export RUMP_SERVER=$SOCKFWD
306	atf_check -s exit:0 -o match:"net.inet6.ip6.forwarding = 0" \
307	    rump.sysctl net.inet6.ip6.forwarding
308}
309
310cleanup()
311{
312	env RUMP_SERVER=$SOCKSRC rump.halt
313	env RUMP_SERVER=$SOCKFWD rump.halt
314	env RUMP_SERVER=$SOCKDST rump.halt
315}
316
317cleanup_bozo()
318{
319
320	if [ -f $HTTPD_PID ]; then
321		kill -9 "$(cat $HTTPD_PID)"
322		rm -f $HTTPD_PID
323	fi
324	rm -f $HTML_FILE
325}
326
327dump()
328{
329	env RUMP_SERVER=$SOCKSRC rump.netstat -nr
330	env RUMP_SERVER=$SOCKFWD rump.netstat -nr
331	env RUMP_SERVER=$SOCKDST rump.netstat -nr
332
333	/usr/bin/shmif_dumpbus -p - bus1 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
334	/usr/bin/shmif_dumpbus -p - bus2 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
335}
336
337test_ping_failure()
338{
339	export RUMP_SERVER=$SOCKSRC
340	atf_check -s not-exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4DST
341	export RUMP_SERVER=$SOCKDST
342	atf_check -s not-exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4SRC
343}
344
345test_ping_success()
346{
347	export RUMP_SERVER=$SOCKSRC
348	$DEBUG && rump.ifconfig -v shmif0
349	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4SRCGW
350	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4DST
351	$DEBUG && rump.ifconfig -v shmif0
352
353	export RUMP_SERVER=$SOCKDST
354	$DEBUG && rump.ifconfig -v shmif0
355	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4DSTGW
356	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4SRC
357	$DEBUG && rump.ifconfig -v shmif0
358}
359
360test_ping_ttl()
361{
362	export RUMP_SERVER=$SOCKSRC
363	$DEBUG && rump.ifconfig -v shmif0
364	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 -T 1 $IP4SRCGW
365	atf_check -s not-exit:0 -o match:'Time To Live exceeded' \
366	    rump.ping -v -n -w $TIMEOUT -c 1 -T 1 $IP4DST
367	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 -T 2 $IP4DST
368	$DEBUG && rump.ifconfig -v shmif0
369}
370
371test_sysctl_ttl()
372{
373	local ip=$1
374
375	export RUMP_SERVER=$SOCKSRC
376	$DEBUG && rump.ifconfig -v shmif0
377
378	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.ttl=1
379	# get the webpage
380	atf_check -s not-exit:0 -e match:'timed out' \
381		env LD_PRELOAD=/usr/lib/librumphijack.so	\
382		ftp -q $TIMEOUT -o out http://$ip/$HTML_FILE
383
384
385	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.ttl=2
386	# get the webpage
387	atf_check -s exit:0 env LD_PRELOAD=/usr/lib/librumphijack.so 	\
388		ftp -q $TIMEOUT -o out http://$ip/$HTML_FILE
389
390	atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.ttl=64
391	$DEBUG && rump.ifconfig -v shmif0
392}
393
394test_directed_broadcast()
395{
396	setup_icmp_bmcastecho
397
398	setup_directed_broadcast
399	export RUMP_SERVER=$SOCKSRC
400	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4DST_BCAST
401
402	teardown_directed_broadcast
403	export RUMP_SERVER=$SOCKSRC
404	atf_check -s not-exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP4DST_BCAST
405
406	teardown_icmp_bmcastecho
407}
408
409test_ping6_failure()
410{
411	export RUMP_SERVER=$SOCKSRC
412	atf_check -s not-exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP6DST
413	export RUMP_SERVER=$SOCKDST
414	atf_check -s not-exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP6SRC
415}
416
417test_ping6_success()
418{
419	export RUMP_SERVER=$SOCKSRC
420	$DEBUG && rump.ifconfig -v shmif0
421	atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP6SRCGW
422	atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP6DST
423	$DEBUG && rump.ifconfig -v shmif0
424
425	export RUMP_SERVER=$SOCKDST
426	$DEBUG && rump.ifconfig -v shmif0
427	atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP6DSTGW
428	atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP6SRC
429	$DEBUG && rump.ifconfig -v shmif0
430}
431
432test_hoplimit()
433{
434	export RUMP_SERVER=$SOCKSRC
435	$DEBUG && rump.ifconfig -v shmif0
436	atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -h 1 -X $TIMEOUT $IP6SRCGW
437	atf_check -s not-exit:0 -o match:'Time to live exceeded' \
438	    rump.ping6 -v -n -c 1 -h 1 -X $TIMEOUT $IP6DST
439	atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -h 2 -X $TIMEOUT $IP6DST
440	$DEBUG && rump.ifconfig -v shmif0
441}
442
443ipforwarding_v4_body()
444{
445	setup
446	test_setup
447
448	setup_forwarding
449	test_setup_forwarding
450	test_ping_success
451
452	teardown_forwarding
453	test_teardown_forwarding
454	test_ping_failure
455
456	teardown_interfaces
457}
458
459ipforwarding_v6_body()
460{
461	setup6
462	test_setup6
463
464	setup_forwarding6
465	test_setup_forwarding6
466	test_ping6_success
467	test_hoplimit
468
469	teardown_forwarding6
470	test_teardown_forwarding6
471	test_ping6_failure
472
473	teardown_interfaces
474}
475
476ipforwarding_fastforward_v4_body()
477{
478	setup
479	test_setup
480
481	setup_forwarding
482	test_setup_forwarding
483
484	setup_bozo $IP4DST
485	test_http_get $IP4DST
486
487	teardown_interfaces
488}
489
490ipforwarding_fastforward_v6_body()
491{
492	setup6
493	test_setup6
494
495	setup_forwarding6
496	test_setup_forwarding6
497
498	setup_bozo $IP6DST
499	test_http_get "[$IP6DST]"
500
501	teardown_interfaces
502}
503
504ipforwarding_misc_body()
505{
506	setup
507	test_setup
508
509	setup_forwarding
510	test_setup_forwarding
511
512	test_ping_ttl
513
514	test_directed_broadcast
515
516	setup_bozo $IP4DST
517	test_sysctl_ttl $IP4DST
518
519	teardown_interfaces
520	return 0
521}
522
523ipforwarding_v4_cleanup()
524{
525	dump
526	cleanup
527}
528
529ipforwarding_v6_cleanup()
530{
531	dump
532	cleanup
533}
534
535ipforwarding_fastforward_v4_cleanup()
536{
537	dump
538	cleanup_bozo
539	cleanup
540}
541
542ipforwarding_fastforward_v6_cleanup()
543{
544	dump
545	cleanup_bozo
546	cleanup
547}
548
549ipforwarding_misc_cleanup()
550{
551	dump
552	cleanup_bozo
553	cleanup
554}
555
556atf_init_test_cases()
557{
558	atf_add_test_case ipforwarding_v4
559	atf_add_test_case ipforwarding_v6
560	atf_add_test_case ipforwarding_fastforward_v4
561	atf_add_test_case ipforwarding_fastforward_v6
562	atf_add_test_case ipforwarding_misc
563}
564