t_bridge.sh revision 313498
1#	$NetBSD: t_bridge.sh,v 1.13 2016/08/10 22:37:07 kre Exp $
2#
3# Copyright (c) 2014 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
28libs1="-lrumpnet -lrumpnet_net -lrumpnet_netinet"
29libs2="-lrumpnet_bridge -lrumpnet_shmif -lrumpdev"
30libs6="-lrumpnet_netinet6"
31
32inetserver="rump_server ${libs1} ${libs2}"
33inet6server="rump_server ${libs1} ${libs6} ${libs2}"
34
35SOCK1=unix://commsock1
36SOCK2=unix://commsock2
37SOCK3=unix://commsock3
38IP1=10.0.0.1
39IP2=10.0.0.2
40IP61=fc00::1
41IP62=fc00::2
42IPBR1=10.0.0.11
43IPBR2=10.0.0.12
44IP6BR1=fc00::11
45IP6BR2=fc00::12
46
47TIMEOUT=5
48
49atf_test_case bridge_ipv4 cleanup
50atf_test_case bridge_ipv6 cleanup
51atf_test_case bridge_rtable cleanup
52atf_test_case bridge_member_ipv4 cleanup
53atf_test_case bridge_member_ipv6 cleanup
54
55bridge_ipv4_head()
56{
57	atf_set "descr" "Does simple if_bridge tests"
58	atf_set "require.progs" "rump_server"
59}
60
61bridge_ipv6_head()
62{
63	atf_set "descr" "Does simple if_bridge tests (IPv6)"
64	atf_set "require.progs" "rump_server"
65}
66
67bridge_rtable_head()
68{
69	atf_set "descr" "Tests route table operations of if_bridge"
70	atf_set "require.progs" "rump_server"
71}
72
73bridge_member_ipv4_head()
74{
75	atf_set "descr" "Tests if_bridge with members with an IP address"
76	atf_set "require.progs" "rump_server"
77}
78
79bridge_member_ipv6_head()
80{
81	atf_set "descr" "Tests if_bridge with members with an IP address (IPv6)"
82	atf_set "require.progs" "rump_server"
83}
84
85setup_endpoint()
86{
87	sock=${1}
88	addr=${2}
89	bus=${3}
90	mode=${4}
91
92	export RUMP_SERVER=${sock}
93	atf_check -s exit:0 rump.ifconfig shmif0 create
94	atf_check -s exit:0 rump.ifconfig shmif0 linkstr ${bus}
95	if [ $mode = "ipv6" ]; then
96		atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${addr}
97	else
98		atf_check -s exit:0 rump.ifconfig shmif0 inet ${addr} netmask 0xffffff00
99	fi
100
101	atf_check -s exit:0 rump.ifconfig shmif0 up
102	rump.ifconfig shmif0
103}
104
105test_endpoint()
106{
107	sock=${1}
108	addr=${2}
109	bus=${3}
110	mode=${4}
111
112	export RUMP_SERVER=${sock}
113	atf_check -s exit:0 -o match:shmif0 rump.ifconfig
114	if [ $mode = "ipv6" ]; then
115		atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 -X $TIMEOUT ${addr}
116	else
117		atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 ${addr}
118	fi
119}
120
121show_endpoint()
122{
123	sock=${1}
124
125	export RUMP_SERVER=${sock}
126	rump.ifconfig -v shmif0
127}
128
129test_setup()
130{
131	test_endpoint $SOCK1 $IP1 bus1 ipv4
132	test_endpoint $SOCK3 $IP2 bus2 ipv4
133
134	export RUMP_SERVER=$SOCK2
135	atf_check -s exit:0 -o match:shmif0 rump.ifconfig
136	atf_check -s exit:0 -o match:shmif1 rump.ifconfig
137}
138
139test_setup6()
140{
141	test_endpoint $SOCK1 $IP61 bus1 ipv6
142	test_endpoint $SOCK3 $IP62 bus2 ipv6
143
144	export RUMP_SERVER=$SOCK2
145	atf_check -s exit:0 -o match:shmif0 rump.ifconfig
146	atf_check -s exit:0 -o match:shmif1 rump.ifconfig
147}
148
149setup_bridge_server()
150{
151	export RUMP_SERVER=$SOCK2
152	atf_check -s exit:0 rump.ifconfig shmif0 create
153	atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
154	atf_check -s exit:0 rump.ifconfig shmif0 up
155
156	atf_check -s exit:0 rump.ifconfig shmif1 create
157	atf_check -s exit:0 rump.ifconfig shmif1 linkstr bus2
158	atf_check -s exit:0 rump.ifconfig shmif1 up
159}
160
161setup()
162{
163	atf_check -s exit:0 ${inetserver} $SOCK1
164	atf_check -s exit:0 ${inetserver} $SOCK2
165	atf_check -s exit:0 ${inetserver} $SOCK3
166
167	setup_endpoint $SOCK1 $IP1 bus1 ipv4
168	setup_endpoint $SOCK3 $IP2 bus2 ipv4
169	setup_bridge_server
170}
171
172setup6()
173{
174	atf_check -s exit:0 ${inet6server} $SOCK1
175	atf_check -s exit:0 ${inet6server} $SOCK2
176	atf_check -s exit:0 ${inet6server} $SOCK3
177
178	setup_endpoint $SOCK1 $IP61 bus1 ipv6
179	setup_endpoint $SOCK3 $IP62 bus2 ipv6
180	setup_bridge_server
181}
182
183setup_bridge()
184{
185	export RUMP_SERVER=$SOCK2
186	atf_check -s exit:0 rump.ifconfig bridge0 create
187	atf_check -s exit:0 rump.ifconfig bridge0 up
188
189	export LD_PRELOAD=/usr/lib/librumphijack.so
190	atf_check -s exit:0 /sbin/brconfig bridge0 add shmif0
191	atf_check -s exit:0 /sbin/brconfig bridge0 add shmif1
192	/sbin/brconfig bridge0
193	unset LD_PRELOAD
194	rump.ifconfig shmif0
195	rump.ifconfig shmif1
196}
197
198setup_member_ip()
199{
200	export RUMP_SERVER=$SOCK2
201	export LD_PRELOAD=/usr/lib/librumphijack.so
202	atf_check -s exit:0 rump.ifconfig shmif0 $IPBR1/24
203	atf_check -s exit:0 rump.ifconfig shmif1 $IPBR2/24
204	atf_check -s exit:0 rump.ifconfig -w 10
205	/sbin/brconfig bridge0
206	unset LD_PRELOAD
207	rump.ifconfig shmif0
208	rump.ifconfig shmif1
209}
210
211setup_member_ip6()
212{
213	export RUMP_SERVER=$SOCK2
214	export LD_PRELOAD=/usr/lib/librumphijack.so
215	atf_check -s exit:0 rump.ifconfig shmif0 inet6 $IP6BR1
216	atf_check -s exit:0 rump.ifconfig shmif1 inet6 $IP6BR2
217	atf_check -s exit:0 rump.ifconfig -w 10
218	/sbin/brconfig bridge0
219	unset LD_PRELOAD
220	rump.ifconfig shmif0
221	rump.ifconfig shmif1
222}
223
224teardown_bridge()
225{
226	export RUMP_SERVER=$SOCK2
227	export LD_PRELOAD=/usr/lib/librumphijack.so
228	/sbin/brconfig bridge0
229	atf_check -s exit:0 /sbin/brconfig bridge0 delete shmif0
230	atf_check -s exit:0 /sbin/brconfig bridge0 delete shmif1
231	/sbin/brconfig bridge0
232	unset LD_PRELOAD
233	rump.ifconfig shmif0
234	rump.ifconfig shmif1
235}
236
237test_setup_bridge()
238{
239	export RUMP_SERVER=$SOCK2
240	export LD_PRELOAD=/usr/lib/librumphijack.so
241	atf_check -s exit:0 -o match:shmif0 /sbin/brconfig bridge0
242	atf_check -s exit:0 -o match:shmif1 /sbin/brconfig bridge0
243	/sbin/brconfig bridge0
244	unset LD_PRELOAD
245}
246
247cleanup()
248{
249	env RUMP_SERVER=$SOCK1 rump.halt
250	env RUMP_SERVER=$SOCK2 rump.halt
251	env RUMP_SERVER=$SOCK3 rump.halt
252}
253
254dump_bus()
255{
256	/usr/bin/shmif_dumpbus -p - bus1 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
257	/usr/bin/shmif_dumpbus -p - bus2 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
258}
259
260down_up_interfaces()
261{
262	export RUMP_SERVER=$SOCK1
263	rump.ifconfig shmif0 down
264	rump.ifconfig shmif0 up
265	export RUMP_SERVER=$SOCK3
266	rump.ifconfig shmif0 down
267	rump.ifconfig shmif0 up
268}
269
270test_ping_failure()
271{
272	export RUMP_SERVER=$SOCK1
273	atf_check -s not-exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP2
274	export RUMP_SERVER=$SOCK3
275	atf_check -s not-exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP1
276}
277
278test_ping_success()
279{
280	export RUMP_SERVER=$SOCK1
281	rump.ifconfig -v shmif0
282	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP2
283	rump.ifconfig -v shmif0
284
285	export RUMP_SERVER=$SOCK3
286	rump.ifconfig -v shmif0
287	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IP1
288	rump.ifconfig -v shmif0
289}
290
291test_ping6_failure()
292{
293	export RUMP_SERVER=$SOCK1
294	atf_check -s not-exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP62
295	export RUMP_SERVER=$SOCK3
296	atf_check -s not-exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP61
297}
298
299test_ping6_success()
300{
301	export RUMP_SERVER=$SOCK1
302	rump.ifconfig -v shmif0
303	atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP62
304	rump.ifconfig -v shmif0
305
306	export RUMP_SERVER=$SOCK3
307	rump.ifconfig -v shmif0
308	atf_check -s exit:0 -o ignore rump.ping6 -q -n -c 1 -X $TIMEOUT $IP61
309	rump.ifconfig -v shmif0
310}
311
312test_ping_member()
313{
314	export RUMP_SERVER=$SOCK1
315	rump.ifconfig -v shmif0
316	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IPBR1
317	rump.ifconfig -v shmif0
318	# Test for PR#48104
319	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IPBR2
320	rump.ifconfig -v shmif0
321
322	export RUMP_SERVER=$SOCK3
323	rump.ifconfig -v shmif0
324	# Test for PR#48104
325	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IPBR1
326	rump.ifconfig -v shmif0
327	atf_check -s exit:0 -o ignore rump.ping -q -n -w $TIMEOUT -c 1 $IPBR2
328	rump.ifconfig -v shmif0
329}
330
331test_ping6_member()
332{
333	export RUMP_SERVER=$SOCK1
334	rump.ifconfig -v shmif0
335	atf_check -s exit:0 -o ignore rump.ping6 -q -n -X $TIMEOUT -c 1 $IP6BR1
336	rump.ifconfig -v shmif0
337	# Test for PR#48104
338	atf_check -s exit:0 -o ignore rump.ping6 -q -n -X $TIMEOUT -c 1 $IP6BR2
339	rump.ifconfig -v shmif0
340
341	export RUMP_SERVER=$SOCK3
342	rump.ifconfig -v shmif0
343	# Test for PR#48104
344	atf_check -s exit:0 -o ignore rump.ping6 -q -n -X $TIMEOUT -c 1 $IP6BR1
345	rump.ifconfig -v shmif0
346	atf_check -s exit:0 -o ignore rump.ping6 -q -n -X $TIMEOUT -c 1 $IP6BR2
347	rump.ifconfig -v shmif0
348}
349
350get_number_of_caches()
351{
352	export RUMP_SERVER=$SOCK2
353	export LD_PRELOAD=/usr/lib/librumphijack.so
354	echo $(($(/sbin/brconfig bridge0 |grep -A 100 "Address cache" |wc -l) - 1))
355	unset LD_PRELOAD
356}
357
358test_brconfig_maxaddr()
359{
360	addr1= addr3= n=
361
362	# Get MAC addresses of the endpoints.
363	export RUMP_SERVER=$SOCK1
364	addr1=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}')
365	export RUMP_SERVER=$SOCK3
366	addr3=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}')
367	unset RUMP_SERVER
368
369	# Refill the MAC addresses of the endpoints.
370	export RUMP_SERVER=$SOCK1
371	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2
372	export RUMP_SERVER=$SOCK2
373	export LD_PRELOAD=/usr/lib/librumphijack.so
374	/sbin/brconfig bridge0
375	atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
376	atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
377
378	# Check the default # of caches is 100
379	atf_check -s exit:0 -o match:"max cache: 100" /sbin/brconfig bridge0
380
381	# Test two MAC addresses are cached
382	n=$(get_number_of_caches)
383	atf_check_equal $n 2
384
385	# Limit # of caches to one
386	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 maxaddr 1
387	atf_check -s exit:0 -o match:"max cache: 1" /sbin/brconfig bridge0
388	/sbin/brconfig bridge0
389
390	# Test just one address is cached
391	n=$(get_number_of_caches)
392	atf_check_equal $n 1
393
394	# Increase # of caches to two
395	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 maxaddr 2
396	atf_check -s exit:0 -o match:"max cache: 2" /sbin/brconfig bridge0
397	unset LD_PRELOAD
398
399	# Test we can cache two addresses again
400	export RUMP_SERVER=$SOCK1
401	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2
402	export RUMP_SERVER=$SOCK2
403	export LD_PRELOAD=/usr/lib/librumphijack.so
404	/sbin/brconfig bridge0
405	atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
406	atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
407	unset LD_PRELOAD
408}
409
410bridge_ipv4_body()
411{
412	setup
413	test_setup
414
415	# Enable once PR kern/49219 is fixed
416	#test_ping_failure
417
418	setup_bridge
419	sleep 1
420	test_setup_bridge
421	test_ping_success
422
423	teardown_bridge
424	test_ping_failure
425}
426
427bridge_ipv6_body()
428{
429	setup6
430	test_setup6
431
432	test_ping6_failure
433
434	setup_bridge
435	sleep 1
436	test_setup_bridge
437	test_ping6_success
438
439	teardown_bridge
440	test_ping6_failure
441}
442
443bridge_rtable_body()
444{
445	addr1= addr3=
446
447	setup
448	setup_bridge
449
450	# Get MAC addresses of the endpoints.
451	export RUMP_SERVER=$SOCK1
452	addr1=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}')
453	export RUMP_SERVER=$SOCK3
454	addr3=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}')
455	unset RUMP_SERVER
456
457	# Confirm there is no MAC address caches.
458	export RUMP_SERVER=$SOCK2
459	export LD_PRELOAD=/usr/lib/librumphijack.so
460	/sbin/brconfig bridge0
461	atf_check -s exit:0 -o not-match:"$addr1" /sbin/brconfig bridge0
462	atf_check -s exit:0 -o not-match:"$addr3" /sbin/brconfig bridge0
463	unset LD_PRELOAD
464
465	# Make the bridge learn the MAC addresses of the endpoints.
466	export RUMP_SERVER=$SOCK1
467	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2
468	unset RUMP_SERVER
469
470	# Tests the addresses are in the cache.
471	export RUMP_SERVER=$SOCK2
472	export LD_PRELOAD=/usr/lib/librumphijack.so
473	/sbin/brconfig bridge0
474	atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
475	atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
476
477	# Tests brconfig deladdr
478	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 deladdr "$addr1"
479	atf_check -s exit:0 -o not-match:"$addr1 shmif0" /sbin/brconfig bridge0
480	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 deladdr "$addr3"
481	atf_check -s exit:0 -o not-match:"$addr3 shmif1" /sbin/brconfig bridge0
482	unset LD_PRELOAD
483
484	# Refill the MAC addresses of the endpoints.
485	export RUMP_SERVER=$SOCK1
486	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2
487	unset RUMP_SERVER
488	export RUMP_SERVER=$SOCK2
489	export LD_PRELOAD=/usr/lib/librumphijack.so
490	/sbin/brconfig bridge0
491	atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
492	atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
493
494	# Tests brconfig flush.
495	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 flush
496	atf_check -s exit:0 -o not-match:"$addr1 shmif0" /sbin/brconfig bridge0
497	atf_check -s exit:0 -o not-match:"$addr3 shmif1" /sbin/brconfig bridge0
498	unset LD_PRELOAD
499
500	# Tests brconfig timeout.
501	export RUMP_SERVER=$SOCK2
502	export LD_PRELOAD=/usr/lib/librumphijack.so
503	atf_check -s exit:0 -o match:"timeout: 1200" /sbin/brconfig bridge0
504	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 timeout 10
505	atf_check -s exit:0 -o match:"timeout: 10" /sbin/brconfig bridge0
506	unset LD_PRELOAD
507
508	# Tests brconfig maxaddr.
509	test_brconfig_maxaddr
510
511	# TODO: brconfig static/flushall/discover/learn
512	# TODO: cache expiration; it takes 5 minutes at least and we want to
513	#       wait here so long. Should we have a sysctl to change the period?
514}
515
516bridge_member_ipv4_body()
517{
518	setup
519	test_setup
520
521	# Enable once PR kern/49219 is fixed
522	#test_ping_failure
523
524	setup_bridge
525	sleep 1
526	test_setup_bridge
527	test_ping_success
528
529	setup_member_ip
530	test_ping_member
531
532	teardown_bridge
533	test_ping_failure
534}
535
536bridge_member_ipv6_body()
537{
538	setup6
539	test_setup6
540
541	test_ping6_failure
542
543	setup_bridge
544	sleep 1
545	test_setup_bridge
546	test_ping6_success
547
548	setup_member_ip6
549	test_ping6_member
550
551	teardown_bridge
552	test_ping6_failure
553}
554
555bridge_ipv4_cleanup()
556{
557	dump_bus
558	cleanup
559}
560
561bridge_ipv6_cleanup()
562{
563	dump_bus
564	cleanup
565}
566
567bridge_rtable_cleanup()
568{
569	dump_bus
570	cleanup
571}
572
573bridge_member_ipv4_cleanup()
574{
575	dump_bus
576	cleanup
577}
578
579bridge_member_ipv6_cleanup()
580{
581	dump_bus
582	cleanup
583}
584
585atf_init_test_cases()
586{
587	atf_add_test_case bridge_ipv4
588	atf_add_test_case bridge_ipv6
589	atf_add_test_case bridge_rtable
590	atf_add_test_case bridge_member_ipv4
591	atf_add_test_case bridge_member_ipv6
592}
593