xref: /netbsd-src/tests/net/if_bridge/t_rtable.sh (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1#	$NetBSD: t_rtable.sh,v 1.3 2018/04/18 04:03:12 ozaki-r Exp $
2#
3# Copyright (c) 2017 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
28SOCK1=unix://commsock1
29SOCK2=unix://commsock2
30SOCK3=unix://commsock3
31IP1=10.0.0.1
32IP2=10.0.0.2
33
34DEBUG=${DEBUG:-false}
35TIMEOUT=5
36
37setup_endpoint()
38{
39	local sock=${1}
40	local addr=${2}
41	local bus=${3}
42	local mode=${4}
43
44	rump_server_add_iface $sock shmif0 $bus
45	export RUMP_SERVER=${sock}
46	if [ $mode = "ipv6" ]; then
47		atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${addr}
48	else
49		atf_check -s exit:0 rump.ifconfig shmif0 inet ${addr} netmask 0xffffff00
50	fi
51
52	atf_check -s exit:0 rump.ifconfig shmif0 up
53	$DEBUG && rump.ifconfig shmif0
54}
55
56setup_bridge_server()
57{
58
59	rump_server_add_iface $SOCK2 shmif0 bus1
60	rump_server_add_iface $SOCK2 shmif1 bus2
61	export RUMP_SERVER=$SOCK2
62	atf_check -s exit:0 rump.ifconfig shmif0 up
63	atf_check -s exit:0 rump.ifconfig shmif1 up
64}
65
66setup()
67{
68
69	rump_server_start $SOCK1 bridge
70	rump_server_start $SOCK2 bridge
71	rump_server_start $SOCK3 bridge
72
73	setup_endpoint $SOCK1 $IP1 bus1 ipv4
74	setup_endpoint $SOCK3 $IP2 bus2 ipv4
75	setup_bridge_server
76}
77
78setup_bridge()
79{
80
81	export RUMP_SERVER=$SOCK2
82	atf_check -s exit:0 rump.ifconfig bridge0 create
83	atf_check -s exit:0 rump.ifconfig bridge0 up
84
85	export LD_PRELOAD=/usr/lib/librumphijack.so
86	atf_check -s exit:0 /sbin/brconfig bridge0 add shmif0
87	atf_check -s exit:0 /sbin/brconfig bridge0 add shmif1
88	/sbin/brconfig bridge0
89	unset LD_PRELOAD
90	rump.ifconfig shmif0
91	rump.ifconfig shmif1
92}
93
94get_number_of_caches()
95{
96
97	export RUMP_SERVER=$SOCK2
98	export LD_PRELOAD=/usr/lib/librumphijack.so
99	echo $(($(/sbin/brconfig bridge0 |grep -A 100 "Address cache" |wc -l) - 1))
100	unset LD_PRELOAD
101}
102
103
104atf_test_case bridge_rtable_basic cleanup
105bridge_rtable_basic_head()
106{
107
108	atf_set "descr" "Tests basic opearaions of bridge's learning table"
109	atf_set "require.progs" "rump_server"
110}
111
112bridge_rtable_basic_body()
113{
114	local addr1= addr3=
115
116	setup
117	setup_bridge
118
119	# Get MAC addresses of the endpoints.
120	addr1=$(get_macaddr $SOCK1 shmif0)
121	addr3=$(get_macaddr $SOCK3 shmif0)
122
123	# Confirm there is no MAC address caches.
124	export RUMP_SERVER=$SOCK2
125	export LD_PRELOAD=/usr/lib/librumphijack.so
126	$DEBUG && /sbin/brconfig bridge0
127	atf_check -s exit:0 -o not-match:"$addr1" /sbin/brconfig bridge0
128	atf_check -s exit:0 -o not-match:"$addr3" /sbin/brconfig bridge0
129	unset LD_PRELOAD
130
131	# Make the bridge learn the MAC addresses of the endpoints.
132	export RUMP_SERVER=$SOCK1
133	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2
134	unset RUMP_SERVER
135
136	# Tests the addresses are in the cache.
137	export RUMP_SERVER=$SOCK2
138	export LD_PRELOAD=/usr/lib/librumphijack.so
139	$DEBUG && /sbin/brconfig bridge0
140	atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
141	atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
142
143	# Tests brconfig deladdr
144	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 deladdr "$addr1"
145	atf_check -s exit:0 -o not-match:"$addr1 shmif0" /sbin/brconfig bridge0
146	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 deladdr "$addr3"
147	atf_check -s exit:0 -o not-match:"$addr3 shmif1" /sbin/brconfig bridge0
148	unset LD_PRELOAD
149
150	rump_server_destroy_ifaces
151}
152
153bridge_rtable_basic_cleanup()
154{
155
156	$DEBUG && dump
157	cleanup
158}
159
160
161atf_test_case bridge_rtable_flush cleanup
162bridge_rtable_flush_head()
163{
164
165	atf_set "descr" "Tests brconfig flush"
166	atf_set "require.progs" "rump_server"
167}
168
169bridge_rtable_flush_body()
170{
171	local addr1= addr3=
172	local n=
173
174	setup
175	setup_bridge
176
177	# Get MAC addresses of the endpoints.
178	addr1=$(get_macaddr $SOCK1 shmif0)
179	addr3=$(get_macaddr $SOCK3 shmif0)
180
181	# Make the bridge learn the MAC addresses of the endpoints.
182	export RUMP_SERVER=$SOCK1
183	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2
184	unset RUMP_SERVER
185
186	# Tests the addresses are in the cache.
187	export RUMP_SERVER=$SOCK2
188	export LD_PRELOAD=/usr/lib/librumphijack.so
189	$DEBUG && /sbin/brconfig bridge0
190	atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
191	atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
192
193	# Tests brconfig flush.
194	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 flush
195	atf_check -s exit:0 -o not-match:"$addr1 shmif0" /sbin/brconfig bridge0
196	atf_check -s exit:0 -o not-match:"$addr3 shmif1" /sbin/brconfig bridge0
197	unset LD_PRELOAD
198
199	# Add extra interfaces and addresses
200	export RUMP_SERVER=$SOCK1
201	rump_server_add_iface $SOCK1 shmif1 bus1
202	atf_check -s exit:0 rump.ifconfig shmif1 10.0.0.11/24
203	atf_check -s exit:0 rump.ifconfig -w 10
204
205	export RUMP_SERVER=$SOCK3
206	rump_server_add_iface $SOCK3 shmif1 bus2
207	atf_check -s exit:0 rump.ifconfig shmif1 10.0.0.12/24
208	atf_check -s exit:0 rump.ifconfig -w 10
209
210	# Let cache entries
211	export RUMP_SERVER=$SOCK1
212	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 10.0.0.12
213	export RUMP_SERVER=$SOCK3
214	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 10.0.0.11
215
216	export RUMP_SERVER=$SOCK2
217	export LD_PRELOAD=/usr/lib/librumphijack.so
218	$DEBUG && /sbin/brconfig bridge0
219	n=$(get_number_of_caches)
220	atf_check_equal $n 4
221
222	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 flush
223	n=$(get_number_of_caches)
224	atf_check_equal $n 0
225	unset LD_PRELOAD
226
227	rump_server_destroy_ifaces
228}
229
230bridge_rtable_flush_cleanup()
231{
232
233	$DEBUG && dump
234	cleanup
235}
236
237
238atf_test_case bridge_rtable_timeout cleanup
239bridge_rtable_timeout_head()
240{
241
242	atf_set "descr" "Tests cache timeout of bridge's learning table"
243	atf_set "require.progs" "rump_server"
244}
245
246bridge_rtable_timeout_body()
247{
248	local addr1= addr3=
249	local timeout=5
250
251	setup
252	setup_bridge
253
254	# Get MAC addresses of the endpoints.
255	addr1=$(get_macaddr $SOCK1 shmif0)
256	addr3=$(get_macaddr $SOCK3 shmif0)
257
258	# Tests brconfig timeout.
259	export RUMP_SERVER=$SOCK2
260	export LD_PRELOAD=/usr/lib/librumphijack.so
261	atf_check -s exit:0 -o match:"timeout: 1200" /sbin/brconfig bridge0
262	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 timeout $timeout
263	atf_check -s exit:0 -o match:"timeout: $timeout" /sbin/brconfig bridge0
264	unset LD_PRELOAD
265
266	# Make the bridge learn the MAC addresses of the endpoints.
267	export RUMP_SERVER=$SOCK1
268	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2
269	unset RUMP_SERVER
270
271	# Tests the addresses are in the cache.
272	export RUMP_SERVER=$SOCK2
273	export LD_PRELOAD=/usr/lib/librumphijack.so
274	$DEBUG && /sbin/brconfig bridge0
275	atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
276	atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
277
278	# TODO: cache expiration
279	# The initial timeout value of a cache is changed to $timeout and
280	# after $timeout elapsed the cache is ready to be sweeped. However,
281	# the GC of rtable runs every 5 minutes and the cache remains until
282	# then. Should we have a sysctl to change the period?
283
284	#sleep $(($timeout + 2))
285	#
286	## Tests the addresses are not in the cache.
287	#export RUMP_SERVER=$SOCK2
288	#export LD_PRELOAD=/usr/lib/librumphijack.so
289	#$DEBUG && /sbin/brconfig bridge0
290	#atf_check -s exit:0 -o not-match:"$addr1 shmif0" /sbin/brconfig bridge0
291	#atf_check -s exit:0 -o not-match:"$addr3 shmif1" /sbin/brconfig bridge0
292
293	rump_server_destroy_ifaces
294}
295
296bridge_rtable_timeout_cleanup()
297{
298
299	$DEBUG && dump
300	cleanup
301}
302
303
304atf_test_case bridge_rtable_maxaddr cleanup
305bridge_rtable_maxaddr_head()
306{
307
308	atf_set "descr" "Tests brconfig maxaddr"
309	atf_set "require.progs" "rump_server"
310}
311
312bridge_rtable_maxaddr_body()
313{
314	local addr1= addr3=
315
316	setup
317	setup_bridge
318
319	# Get MAC addresses of the endpoints.
320	addr1=$(get_macaddr $SOCK1 shmif0)
321	addr3=$(get_macaddr $SOCK3 shmif0)
322
323	# Fill the MAC addresses of the endpoints.
324	export RUMP_SERVER=$SOCK1
325	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2
326	export RUMP_SERVER=$SOCK2
327	export LD_PRELOAD=/usr/lib/librumphijack.so
328	/sbin/brconfig bridge0
329	atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
330	atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
331
332	# Check the default # of caches is 100
333	atf_check -s exit:0 -o match:"max cache: 100" /sbin/brconfig bridge0
334
335	# Test two MAC addresses are cached
336	n=$(get_number_of_caches)
337	atf_check_equal $n 2
338
339	# Limit # of caches to one
340	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 maxaddr 1
341	atf_check -s exit:0 -o match:"max cache: 1" /sbin/brconfig bridge0
342	/sbin/brconfig bridge0
343
344	# Test just one address is cached
345	n=$(get_number_of_caches)
346	atf_check_equal $n 1
347
348	# Increase # of caches to two
349	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 maxaddr 2
350	atf_check -s exit:0 -o match:"max cache: 2" /sbin/brconfig bridge0
351	unset LD_PRELOAD
352
353	# Test we can cache two addresses again
354	export RUMP_SERVER=$SOCK1
355	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP2
356	export RUMP_SERVER=$SOCK2
357	export LD_PRELOAD=/usr/lib/librumphijack.so
358	/sbin/brconfig bridge0
359	atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
360	atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
361	unset LD_PRELOAD
362
363	rump_server_destroy_ifaces
364}
365
366bridge_rtable_maxaddr_cleanup()
367{
368
369	$DEBUG && dump
370	cleanup
371}
372
373
374atf_test_case bridge_rtable_delete_member cleanup
375bridge_rtable_delete_member_head()
376{
377
378	atf_set "descr" "Tests belonging rtable entries are removed on deleting an interface"
379	atf_set "require.progs" "rump_server"
380}
381
382bridge_rtable_delete_member_body()
383{
384	local addr10= addr30= addr11= addr31=
385	local n=
386
387	setup
388	setup_bridge
389
390	# Add extra interfaces and addresses
391	export RUMP_SERVER=$SOCK1
392	rump_server_add_iface $SOCK1 shmif1 bus1
393	atf_check -s exit:0 rump.ifconfig shmif1 10.0.0.11/24
394	atf_check -s exit:0 rump.ifconfig -w 10
395
396	export RUMP_SERVER=$SOCK3
397	rump_server_add_iface $SOCK3 shmif1 bus2
398	atf_check -s exit:0 rump.ifconfig shmif1 10.0.0.12/24
399	atf_check -s exit:0 rump.ifconfig -w 10
400
401	# Get MAC addresses of the endpoints.
402	addr10=$(get_macaddr $SOCK1 shmif0)
403	addr30=$(get_macaddr $SOCK3 shmif0)
404	addr11=$(get_macaddr $SOCK1 shmif1)
405	addr31=$(get_macaddr $SOCK3 shmif1)
406
407	# Make the bridge learn the MAC addresses of the endpoints.
408	export RUMP_SERVER=$SOCK1
409	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 10.0.0.12
410	export RUMP_SERVER=$SOCK3
411	atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 10.0.0.11
412
413	export RUMP_SERVER=$SOCK2
414	export LD_PRELOAD=/usr/lib/librumphijack.so
415	$DEBUG && /sbin/brconfig bridge0
416	atf_check -s exit:0 -o match:"$addr10 shmif0" /sbin/brconfig bridge0
417	atf_check -s exit:0 -o match:"$addr11 shmif0" /sbin/brconfig bridge0
418	atf_check -s exit:0 -o match:"$addr30 shmif1" /sbin/brconfig bridge0
419	atf_check -s exit:0 -o match:"$addr31 shmif1" /sbin/brconfig bridge0
420
421	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 delete shmif0
422	atf_check -s exit:0 -o not-match:"$addr10 shmif0" /sbin/brconfig bridge0
423	atf_check -s exit:0 -o not-match:"$addr11 shmif0" /sbin/brconfig bridge0
424	atf_check -s exit:0 -o match:"$addr30 shmif1" /sbin/brconfig bridge0
425	atf_check -s exit:0 -o match:"$addr31 shmif1" /sbin/brconfig bridge0
426
427	atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 delete shmif1
428	atf_check -s exit:0 -o not-match:"$addr10 shmif0" /sbin/brconfig bridge0
429	atf_check -s exit:0 -o not-match:"$addr11 shmif0" /sbin/brconfig bridge0
430	atf_check -s exit:0 -o not-match:"$addr30 shmif1" /sbin/brconfig bridge0
431	atf_check -s exit:0 -o not-match:"$addr31 shmif1" /sbin/brconfig bridge0
432
433	rump_server_destroy_ifaces
434}
435
436bridge_rtable_delete_member_cleanup()
437{
438
439	$DEBUG && dump
440	cleanup
441}
442
443
444atf_init_test_cases()
445{
446
447	atf_add_test_case bridge_rtable_basic
448	atf_add_test_case bridge_rtable_flush
449	atf_add_test_case bridge_rtable_timeout
450	atf_add_test_case bridge_rtable_maxaddr
451	atf_add_test_case bridge_rtable_delete_member
452	# TODO: brconfig static/flushall/discover/learn
453}
454