t_bridge.sh revision 1.4 1 #! /usr/bin/atf-sh
2 # $NetBSD: t_bridge.sh,v 1.4 2015/05/16 14:29:37 ozaki-r Exp $
3 #
4 # Copyright (c) 2014 The NetBSD Foundation, Inc.
5 # All rights reserved.
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
9 # are met:
10 # 1. Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # 2. Redistributions in binary form must reproduce the above copyright
13 # notice, this list of conditions and the following disclaimer in the
14 # documentation and/or other materials provided with the distribution.
15 #
16 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 # POSSIBILITY OF SUCH DAMAGE.
27 #
28
29 inetserver="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_bridge -lrumpnet_shmif"
30 inet6server="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_netinet6 -lrumpnet_bridge -lrumpnet_shmif"
31
32 SOCK1=unix://commsock1
33 SOCK2=unix://commsock2
34 SOCK3=unix://commsock3
35 IP1=10.0.0.1
36 IP2=10.0.0.2
37 IP61=fc00::1
38 IP62=fc00::2
39
40 atf_test_case basic cleanup
41 atf_test_case basic6 cleanup
42 atf_test_case rtable cleanup
43
44 basic_head()
45 {
46 atf_set "descr" "Does simple if_bridge tests"
47 atf_set "require.progs" "rump_server"
48 }
49
50 basic6_head()
51 {
52 atf_set "descr" "Does simple if_bridge tests (IPv6)"
53 atf_set "require.progs" "rump_server"
54 }
55
56 rtable_head()
57 {
58 atf_set "descr" "Tests route table operations of if_bridge"
59 atf_set "require.progs" "rump_server"
60 }
61
62 setup_endpoint()
63 {
64 sock=${1}
65 addr=${2}
66 bus=${3}
67 mode=${4}
68
69 export RUMP_SERVER=${sock}
70 atf_check -s exit:0 rump.ifconfig shmif0 create
71 atf_check -s exit:0 rump.ifconfig shmif0 linkstr ${bus}
72 if [ $mode = "ipv6" ]; then
73 atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${addr}
74 else
75 atf_check -s exit:0 rump.ifconfig shmif0 inet ${addr} netmask 0xffffff00
76 fi
77
78 atf_check -s exit:0 rump.ifconfig shmif0 up
79 rump.ifconfig shmif0
80 }
81
82 test_endpoint()
83 {
84 sock=${1}
85 addr=${2}
86 bus=${3}
87 mode=${4}
88
89 export RUMP_SERVER=${sock}
90 atf_check -s exit:0 -o match:shmif0 rump.ifconfig
91 if [ $mode = "ipv6" ]; then
92 export LD_PRELOAD=/usr/lib/librumphijack.so
93 atf_check -s exit:0 -o ignore ping6 -n -c 1 -X 1 ${addr}
94 unset LD_PRELOAD
95 else
96 atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 ${addr}
97 fi
98 }
99
100 show_endpoint()
101 {
102 sock=${1}
103
104 export RUMP_SERVER=${sock}
105 rump.ifconfig -v shmif0
106 }
107
108 test_setup()
109 {
110 test_endpoint $SOCK1 $IP1 bus1 ipv4
111 test_endpoint $SOCK3 $IP2 bus2 ipv4
112
113 export RUMP_SERVER=$SOCK2
114 atf_check -s exit:0 -o match:shmif0 rump.ifconfig
115 atf_check -s exit:0 -o match:shmif1 rump.ifconfig
116 }
117
118 test_setup6()
119 {
120 test_endpoint $SOCK1 $IP61 bus1 ipv6
121 test_endpoint $SOCK3 $IP62 bus2 ipv6
122
123 export RUMP_SERVER=$SOCK2
124 atf_check -s exit:0 -o match:shmif0 rump.ifconfig
125 atf_check -s exit:0 -o match:shmif1 rump.ifconfig
126 }
127
128 setup_bridge_server()
129 {
130 export RUMP_SERVER=$SOCK2
131 atf_check -s exit:0 rump.ifconfig shmif0 create
132 atf_check -s exit:0 rump.ifconfig shmif0 linkstr bus1
133 atf_check -s exit:0 rump.ifconfig shmif0 up
134
135 atf_check -s exit:0 rump.ifconfig shmif1 create
136 atf_check -s exit:0 rump.ifconfig shmif1 linkstr bus2
137 atf_check -s exit:0 rump.ifconfig shmif1 up
138 }
139
140 setup()
141 {
142 atf_check -s exit:0 ${inetserver} $SOCK1
143 atf_check -s exit:0 ${inetserver} $SOCK2
144 atf_check -s exit:0 ${inetserver} $SOCK3
145
146 setup_endpoint $SOCK1 $IP1 bus1 ipv4
147 setup_endpoint $SOCK3 $IP2 bus2 ipv4
148 setup_bridge_server
149 }
150
151 setup6()
152 {
153 atf_check -s exit:0 ${inet6server} $SOCK1
154 atf_check -s exit:0 ${inet6server} $SOCK2
155 atf_check -s exit:0 ${inet6server} $SOCK3
156
157 setup_endpoint $SOCK1 $IP61 bus1 ipv6
158 setup_endpoint $SOCK3 $IP62 bus2 ipv6
159 setup_bridge_server
160 }
161
162 setup_bridge()
163 {
164 export RUMP_SERVER=$SOCK2
165 atf_check -s exit:0 rump.ifconfig bridge0 create
166 atf_check -s exit:0 rump.ifconfig bridge0 up
167
168 export LD_PRELOAD=/usr/lib/librumphijack.so
169 atf_check -s exit:0 /sbin/brconfig bridge0 add shmif0
170 atf_check -s exit:0 /sbin/brconfig bridge0 add shmif1
171 /sbin/brconfig bridge0
172 unset LD_PRELOAD
173 rump.ifconfig shmif0
174 rump.ifconfig shmif1
175 }
176
177 teardown_bridge()
178 {
179 export RUMP_SERVER=$SOCK2
180 export LD_PRELOAD=/usr/lib/librumphijack.so
181 /sbin/brconfig bridge0
182 atf_check -s exit:0 /sbin/brconfig bridge0 delete shmif0
183 atf_check -s exit:0 /sbin/brconfig bridge0 delete shmif1
184 /sbin/brconfig bridge0
185 unset LD_PRELOAD
186 rump.ifconfig shmif0
187 rump.ifconfig shmif1
188 }
189
190 test_setup_bridge()
191 {
192 export RUMP_SERVER=$SOCK2
193 export LD_PRELOAD=/usr/lib/librumphijack.so
194 atf_check -s exit:0 -o match:shmif0 /sbin/brconfig bridge0
195 atf_check -s exit:0 -o match:shmif1 /sbin/brconfig bridge0
196 /sbin/brconfig bridge0
197 unset LD_PRELOAD
198 }
199
200 cleanup()
201 {
202 env RUMP_SERVER=$SOCK1 rump.halt
203 env RUMP_SERVER=$SOCK2 rump.halt
204 env RUMP_SERVER=$SOCK3 rump.halt
205 }
206
207 dump_bus()
208 {
209 /usr/bin/shmif_dumpbus -p - bus1 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
210 /usr/bin/shmif_dumpbus -p - bus2 2>/dev/null| /usr/sbin/tcpdump -n -e -r -
211 }
212
213 down_up_interfaces()
214 {
215 export RUMP_SERVER=$SOCK1
216 rump.ifconfig shmif0 down
217 rump.ifconfig shmif0 up
218 export RUMP_SERVER=$SOCK3
219 rump.ifconfig shmif0 down
220 rump.ifconfig shmif0 up
221 }
222
223 test_ping_failure()
224 {
225 export RUMP_SERVER=$SOCK1
226 atf_check -s not-exit:0 -o ignore rump.ping -q -n -w 1 -c 1 $IP2
227 export RUMP_SERVER=$SOCK3
228 atf_check -s not-exit:0 -o ignore rump.ping -q -n -w 1 -c 1 $IP1
229 }
230
231 test_ping_success()
232 {
233 export RUMP_SERVER=$SOCK1
234 rump.ifconfig -v shmif0
235 atf_check -s exit:0 -o ignore rump.ping -q -n -w 1 -c 1 $IP2
236 rump.ifconfig -v shmif0
237
238 export RUMP_SERVER=$SOCK3
239 rump.ifconfig -v shmif0
240 atf_check -s exit:0 -o ignore rump.ping -q -n -w 1 -c 1 $IP1
241 rump.ifconfig -v shmif0
242 }
243
244 test_ping6_failure()
245 {
246 export LD_PRELOAD=/usr/lib/librumphijack.so
247 export RUMP_SERVER=$SOCK1
248 atf_check -s not-exit:0 -o ignore ping6 -q -n -c 1 -X 1 $IP62
249 export RUMP_SERVER=$SOCK3
250 atf_check -s not-exit:0 -o ignore ping6 -q -n -c 1 -X 1 $IP61
251 unset LD_PRELOAD
252 }
253
254 test_ping6_success()
255 {
256 export RUMP_SERVER=$SOCK1
257 rump.ifconfig -v shmif0
258 export LD_PRELOAD=/usr/lib/librumphijack.so
259 atf_check -s exit:0 -o ignore ping6 -q -n -c 1 -X 1 $IP62
260 unset LD_PRELOAD
261 rump.ifconfig -v shmif0
262
263 export RUMP_SERVER=$SOCK3
264 rump.ifconfig -v shmif0
265 export LD_PRELOAD=/usr/lib/librumphijack.so
266 atf_check -s exit:0 -o ignore ping6 -q -n -c 1 -X 1 $IP61
267 unset LD_PRELOAD
268 rump.ifconfig -v shmif0
269 }
270
271 get_number_of_caches()
272 {
273 export RUMP_SERVER=$SOCK2
274 export LD_PRELOAD=/usr/lib/librumphijack.so
275 echo $(($(/sbin/brconfig bridge0 |grep -A 100 "Address cache" |wc -l) - 1))
276 unset LD_PRELOAD
277 }
278
279 test_brconfig_maxaddr()
280 {
281 addr1= addr3= n=
282
283 # Get MAC addresses of the endpoints.
284 export RUMP_SERVER=$SOCK1
285 addr1=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}')
286 export RUMP_SERVER=$SOCK3
287 addr3=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}')
288 unset RUMP_SERVER
289
290 # Refill the MAC addresses of the endpoints.
291 export RUMP_SERVER=$SOCK1
292 atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP2
293 export RUMP_SERVER=$SOCK2
294 export LD_PRELOAD=/usr/lib/librumphijack.so
295 /sbin/brconfig bridge0
296 atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
297 atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
298
299 # Check the default # of caches is 100
300 atf_check -s exit:0 -o match:"max cache: 100" /sbin/brconfig bridge0
301
302 # Test two MAC addresses are cached
303 n=$(get_number_of_caches)
304 atf_check_equal $n 2
305
306 # Limit # of caches to one
307 atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 maxaddr 1
308 atf_check -s exit:0 -o match:"max cache: 1" /sbin/brconfig bridge0
309 /sbin/brconfig bridge0
310
311 # Test just one address is cached
312 n=$(get_number_of_caches)
313 atf_check_equal $n 1
314
315 # Increase # of caches to two
316 atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 maxaddr 2
317 atf_check -s exit:0 -o match:"max cache: 2" /sbin/brconfig bridge0
318 unset LD_PRELOAD
319
320 # Test we can cache two addresses again
321 export RUMP_SERVER=$SOCK1
322 atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP2
323 export RUMP_SERVER=$SOCK2
324 export LD_PRELOAD=/usr/lib/librumphijack.so
325 /sbin/brconfig bridge0
326 atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
327 atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
328 unset LD_PRELOAD
329 }
330
331 basic_body()
332 {
333 setup
334 test_setup
335
336 test_ping_failure
337
338 setup_bridge
339 sleep 1
340 test_setup_bridge
341 test_ping_success
342
343 teardown_bridge
344 test_ping_failure
345 }
346
347 basic6_body()
348 {
349 setup6
350 test_setup6
351
352 test_ping6_failure
353
354 setup_bridge
355 sleep 1
356 test_setup_bridge
357 test_ping6_success
358
359 teardown_bridge
360 test_ping6_failure
361 }
362
363 rtable_body()
364 {
365 addr1= addr3=
366
367 setup
368 setup_bridge
369
370 # Get MAC addresses of the endpoints.
371 export RUMP_SERVER=$SOCK1
372 addr1=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}')
373 export RUMP_SERVER=$SOCK3
374 addr3=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}')
375 unset RUMP_SERVER
376
377 # Confirm there is no MAC address caches.
378 export RUMP_SERVER=$SOCK2
379 export LD_PRELOAD=/usr/lib/librumphijack.so
380 /sbin/brconfig bridge0
381 atf_check -s exit:0 -o not-match:"$addr1" /sbin/brconfig bridge0
382 atf_check -s exit:0 -o not-match:"$addr3" /sbin/brconfig bridge0
383 unset LD_PRELOAD
384
385 # Make the bridge learn the MAC addresses of the endpoints.
386 export RUMP_SERVER=$SOCK1
387 atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP2
388 unset RUMP_SERVER
389
390 # Tests the addresses are in the cache.
391 export RUMP_SERVER=$SOCK2
392 export LD_PRELOAD=/usr/lib/librumphijack.so
393 /sbin/brconfig bridge0
394 atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
395 atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
396
397 # Tests brconfig deladdr
398 atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 deladdr "$addr1"
399 atf_check -s exit:0 -o not-match:"$addr1 shmif0" /sbin/brconfig bridge0
400 atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 deladdr "$addr3"
401 atf_check -s exit:0 -o not-match:"$addr3 shmif1" /sbin/brconfig bridge0
402 unset LD_PRELOAD
403
404 # Refill the MAC addresses of the endpoints.
405 export RUMP_SERVER=$SOCK1
406 atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP2
407 unset RUMP_SERVER
408 export RUMP_SERVER=$SOCK2
409 export LD_PRELOAD=/usr/lib/librumphijack.so
410 /sbin/brconfig bridge0
411 atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0
412 atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0
413
414 # Tests brconfig flush.
415 atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 flush
416 atf_check -s exit:0 -o not-match:"$addr1 shmif0" /sbin/brconfig bridge0
417 atf_check -s exit:0 -o not-match:"$addr3 shmif1" /sbin/brconfig bridge0
418 unset LD_PRELOAD
419
420 # Tests brconfig timeout.
421 export RUMP_SERVER=$SOCK2
422 export LD_PRELOAD=/usr/lib/librumphijack.so
423 atf_check -s exit:0 -o match:"timeout: 1200" /sbin/brconfig bridge0
424 atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 timeout 10
425 atf_check -s exit:0 -o match:"timeout: 10" /sbin/brconfig bridge0
426 unset LD_PRELOAD
427
428 # Tests brconfig maxaddr.
429 test_brconfig_maxaddr
430
431 # TODO: brconfig static/flushall/discover/learn
432 # TODO: cache expiration; it takes 5 minutes at least and we want to
433 # wait here so long. Should we have a sysctl to change the period?
434 }
435
436 basic_cleanup()
437 {
438 dump_bus
439 cleanup
440 }
441
442 basic6_cleanup()
443 {
444 dump_bus
445 cleanup
446 }
447
448 rtable_cleanup()
449 {
450 dump_bus
451 cleanup
452 }
453
454 atf_init_test_cases()
455 {
456 atf_add_test_case basic
457 atf_add_test_case basic6
458 atf_add_test_case rtable
459 }
460