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