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 28SOCK1=unix://commsock1 29SOCK2=unix://commsock2 30SOCK3=unix://commsock3 31IP1=10.0.0.1 32IP2=10.0.0.2 33IP61=fc00::1 34IP62=fc00::2 35IPBR1=10.0.0.11 36IPBR2=10.0.0.12 37IP6BR1=fc00::11 38IP6BR2=fc00::12 39 40DEBUG=${DEBUG:-false} 41TIMEOUT=5 42 43atf_test_case bridge_ipv4 cleanup 44atf_test_case bridge_ipv6 cleanup 45atf_test_case bridge_rtable cleanup 46atf_test_case bridge_member_ipv4 cleanup 47atf_test_case bridge_member_ipv6 cleanup 48 49bridge_ipv4_head() 50{ 51 atf_set "descr" "Does simple if_bridge tests" 52 atf_set "require.progs" "rump_server" 53} 54 55bridge_ipv6_head() 56{ 57 atf_set "descr" "Does simple if_bridge tests (IPv6)" 58 atf_set "require.progs" "rump_server" 59} 60 61bridge_rtable_head() 62{ 63 atf_set "descr" "Tests route table operations of if_bridge" 64 atf_set "require.progs" "rump_server" 65} 66 67bridge_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 73bridge_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 79setup_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 98test_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 114test_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 124test_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 134setup_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 144setup() 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 156setup6() 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 168setup_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 183setup_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 196setup_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 209teardown_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 222test_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 232down_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 242test_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 250test_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 263test_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 271test_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 284test_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 303test_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 322get_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 330test_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 379bridge_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 398bridge_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 416bridge_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 488bridge_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 510bridge_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 531bridge_ipv4_cleanup() 532{ 533 534 $DEBUG && dump 535 cleanup 536} 537 538bridge_ipv6_cleanup() 539{ 540 541 $DEBUG && dump 542 cleanup 543} 544 545bridge_rtable_cleanup() 546{ 547 548 $DEBUG && dump 549 cleanup 550} 551 552bridge_member_ipv4_cleanup() 553{ 554 555 $DEBUG && dump 556 cleanup 557} 558 559bridge_member_ipv6_cleanup() 560{ 561 562 $DEBUG && dump 563 cleanup 564} 565 566atf_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