t_bridge.sh revision 1.2
1#! /usr/bin/atf-sh 2# $NetBSD: t_bridge.sh,v 1.2 2015/01/07 08:55:01 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 29inetserver="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_bridge -lrumpnet_shmif" 30inet6server="rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet -lrumpnet_netinet6 -lrumpnet_bridge -lrumpnet_shmif" 31 32SOCK1=unix://commsock1 33SOCK2=unix://commsock2 34SOCK3=unix://commsock3 35IP1=10.0.0.1 36IP2=10.0.0.2 37IP61=fc00::1 38IP62=fc00::2 39 40atf_test_case basic cleanup 41atf_test_case basic6 cleanup 42atf_test_case rtable cleanup 43 44basic_head() 45{ 46 atf_set "descr" "Does simple if_bridge tests" 47 atf_set "require.progs" "rump_server" 48} 49 50basic6_head() 51{ 52 atf_set "descr" "Does simple if_bridge tests (IPv6)" 53 atf_set "require.progs" "rump_server" 54} 55 56rtable_head() 57{ 58 atf_set "descr" "Tests route table operations of if_bridge" 59 atf_set "require.progs" "rump_server" 60} 61 62setup_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 82test_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 ${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 100show_endpoint() 101{ 102 sock=${1} 103 104 export RUMP_SERVER=${sock} 105 rump.ifconfig -v shmif0 106} 107 108test_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 118test_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 128setup_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 140setup() 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 151setup6() 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 162setup_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 177teardown_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 190test_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 200cleanup() 201{ 202 env RUMP_SERVER=$SOCK1 rump.halt 203 env RUMP_SERVER=$SOCK2 rump.halt 204 env RUMP_SERVER=$SOCK3 rump.halt 205} 206 207dump_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 213down_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 223test_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 231test_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 244test_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 $IP62 249 export RUMP_SERVER=$SOCK3 250 atf_check -s not-exit:0 -o ignore ping6 -q -n -c 1 $IP61 251 unset LD_PRELOAD 252} 253 254test_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 $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 $IP61 267 unset LD_PRELOAD 268 rump.ifconfig -v shmif0 269} 270 271basic_body() 272{ 273 setup 274 test_setup 275 276 setup_bridge 277 test_setup_bridge 278 279 test_ping_success 280 281 teardown_bridge 282 test_ping_failure 283} 284 285basic6_body() 286{ 287 setup6 288 test_setup6 289 290 # TODO: enable once ping6 implements timeout feature 291 #test_ping6_failure 292 293 setup_bridge 294 test_setup_bridge 295 296 test_ping6_success 297 298 teardown_bridge 299 # TODO: enable once ping6 implements timeout feature 300 #test_ping6_failure 301} 302 303rtable_body() 304{ 305 addr1= addr3= 306 307 setup 308 setup_bridge 309 310 # Get MAC addresses of the endpoints. 311 export RUMP_SERVER=$SOCK1 312 addr1=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}') 313 export RUMP_SERVER=$SOCK3 314 addr3=$(rump.ifconfig shmif0 |awk '/address:/ { print $2;}') 315 unset RUMP_SERVER 316 317 # Confirm there is no MAC address caches. 318 export RUMP_SERVER=$SOCK2 319 export LD_PRELOAD=/usr/lib/librumphijack.so 320 /sbin/brconfig bridge0 321 atf_check -s exit:0 -o not-match:"$addr1" /sbin/brconfig bridge0 322 atf_check -s exit:0 -o not-match:"$addr3" /sbin/brconfig bridge0 323 unset LD_PRELOAD 324 325 # Make the bridge learn the MAC addresses of the endpoints. 326 export RUMP_SERVER=$SOCK1 327 atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP2 328 unset RUMP_SERVER 329 330 # Tests the addresses are in the cache. 331 export RUMP_SERVER=$SOCK2 332 export LD_PRELOAD=/usr/lib/librumphijack.so 333 /sbin/brconfig bridge0 334 atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0 335 atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0 336 337 # Tests brconfig deladdr 338 atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 deladdr "$addr1" 339 atf_check -s exit:0 -o not-match:"$addr1 shmif0" /sbin/brconfig bridge0 340 atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 deladdr "$addr3" 341 atf_check -s exit:0 -o not-match:"$addr3 shmif1" /sbin/brconfig bridge0 342 unset LD_PRELOAD 343 344 # Refill the MAC addresses of the endpoints. 345 export RUMP_SERVER=$SOCK1 346 atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP2 347 unset RUMP_SERVER 348 export RUMP_SERVER=$SOCK2 349 export LD_PRELOAD=/usr/lib/librumphijack.so 350 /sbin/brconfig bridge0 351 atf_check -s exit:0 -o match:"$addr1 shmif0" /sbin/brconfig bridge0 352 atf_check -s exit:0 -o match:"$addr3 shmif1" /sbin/brconfig bridge0 353 354 # Tests brconfig flush. 355 atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 flush 356 atf_check -s exit:0 -o not-match:"$addr1 shmif0" /sbin/brconfig bridge0 357 atf_check -s exit:0 -o not-match:"$addr3 shmif1" /sbin/brconfig bridge0 358 unset LD_PRELOAD 359 360 # Tests brconfig timeout. 361 export RUMP_SERVER=$SOCK2 362 export LD_PRELOAD=/usr/lib/librumphijack.so 363 atf_check -s exit:0 -o match:"timeout: 1200" /sbin/brconfig bridge0 364 atf_check -s exit:0 -o ignore /sbin/brconfig bridge0 timeout 10 365 atf_check -s exit:0 -o match:"timeout: 10" /sbin/brconfig bridge0 366 unset LD_PRELOAD 367 368 # TODO: brconfig static/flushall/discover/learn 369 # TODO: cache expiration; it takes 5 minutes at least and we want to 370 # wait here so long. Should we have a sysctl to change the period? 371} 372 373basic_cleanup() 374{ 375 dump_bus 376 cleanup 377} 378 379basic6_cleanup() 380{ 381 dump_bus 382 cleanup 383} 384 385rtable_cleanup() 386{ 387 dump_bus 388 cleanup 389} 390 391atf_init_test_cases() 392{ 393 atf_add_test_case basic 394 atf_add_test_case basic6 395 atf_add_test_case rtable 396} 397