t_ra.sh revision 1.15
1# $NetBSD: t_ra.sh,v 1.15 2016/12/19 03:07:05 ozaki-r Exp $ 2# 3# Copyright (c) 2015 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 28RUMPSRV=unix://r1 29RUMPSRV1_2=unix://r12 30RUMPCLI=unix://r2 31RUMPSRV3=unix://r3 32RUMPSRV4=unix://r4 33IP6SRV=fc00:1::1 34IP6SRV1_2=fc00:1::2 35IP6SRV_PREFIX=fc00:1: 36IP6CLI=fc00:2::2 37IP6SRV3=fc00:3::1 38IP6SRV3_PREFIX=fc00:3: 39IP6SRV4=fc00:4::1 40IP6SRV4_PREFIX=fc00:4: 41PIDFILE=./rump.rtadvd.pid 42PIDFILE1_2=./rump.rtadvd.pid12 43PIDFILE3=./rump.rtadvd.pid3 44PIDFILE4=./rump.rtadvd.pid4 45CONFIG=./rtadvd.conf 46DEBUG=${DEBUG:-true} 47 48init_server() 49{ 50 51 export RUMP_SERVER=$1 52 atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.forwarding=1 53 export LD_PRELOAD=/usr/lib/librumphijack.so 54 atf_check -s exit:0 mkdir -p /rump/var/chroot/rtadvd 55 unset LD_PRELOAD 56 unset RUMP_SERVER 57} 58 59setup_shmif0() 60{ 61 local sock=$1 62 local IP6ADDR=$2 63 64 rump_server_add_iface $sock shmif0 bus1 65 66 export RUMP_SERVER=$sock 67 atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6ADDR} 68 atf_check -s exit:0 rump.ifconfig shmif0 up 69 atf_check -s exit:0 rump.ifconfig -w 10 70 71 $DEBUG && rump.ifconfig 72} 73 74wait_term() 75{ 76 local PIDFILE=${1} 77 shift 78 79 while [ -f ${PIDFILE} ] 80 do 81 sleep 0.2 82 done 83 84 return 0 85} 86 87create_rtadvdconfig() 88{ 89 90 cat << _EOF > ${CONFIG} 91shmif0:\ 92 :mtu#1300:maxinterval#4:mininterval#3: 93_EOF 94} 95 96start_rtadvd() 97{ 98 local sock=$1 99 local pidfile=$2 100 101 export RUMP_SERVER=$sock 102 atf_check -s exit:0 rump.rtadvd -c ${CONFIG} -p $pidfile shmif0 103 atf_check -s exit:0 sleep 3 104 atf_check -s exit:0 -o ignore -e empty cat $pidfile 105 unset RUMP_SERVER 106} 107 108check_entries() 109{ 110 local cli=$1 111 local srv=$2 112 local addr_prefix=$3 113 local mac_srv= ll_srv= 114 115 ll_srv=$(get_linklocal_addr $srv shmif0) 116 mac_srv=$(get_macaddr $srv shmif0) 117 118 export RUMP_SERVER=$cli 119 $DEBUG && dump_entries 120 atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r 121 atf_check -s exit:0 -o match:'advertised' rump.ndp -p 122 atf_check -s exit:0 -o match:"${ll_srv}%shmif0 \(reachable\)" rump.ndp -p 123 atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0 124 atf_check -s exit:0 \ 125 -o match:"$ll_srv%shmif0 +$mac_srv +shmif0 +(23h59m|1d0h0m)..s S R" \ 126 rump.ndp -n -a 127 atf_check -s exit:0 -o match:$addr_prefix rump.ndp -n -a 128 atf_check -s exit:0 -o match:$addr_prefix rump.ifconfig shmif0 inet6 129 unset RUMP_SERVER 130} 131 132dump_entries() 133{ 134 135 echo ndp -n -a 136 rump.ndp -n -a 137 echo ndp -p 138 rump.ndp -p 139 echo ndp -r 140 rump.ndp -r 141} 142 143atf_test_case ra_basic cleanup 144ra_basic_head() 145{ 146 147 atf_set "descr" "Tests for basic functions of router advaertisement(RA)" 148 atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig" 149} 150 151ra_basic_body() 152{ 153 154 rump_server_fs_start $RUMPSRV netinet6 155 rump_server_start $RUMPCLI netinet6 156 157 setup_shmif0 ${RUMPSRV} ${IP6SRV} 158 init_server $RUMPSRV 159 160 setup_shmif0 ${RUMPCLI} ${IP6CLI} 161 export RUMP_SERVER=${RUMPCLI} 162 $DEBUG && rump.ndp -n -a 163 atf_check -s exit:0 -o match:'= 0' rump.sysctl net.inet6.ip6.accept_rtadv 164 unset RUMP_SERVER 165 166 create_rtadvdconfig 167 start_rtadvd $RUMPSRV $PIDFILE 168 169 export RUMP_SERVER=${RUMPCLI} 170 atf_check -s exit:0 -o empty rump.ndp -r 171 atf_check -s exit:0 -o not-match:'advertised' rump.ndp -p 172 atf_check -s exit:0 -o match:'linkmtu=0' rump.ndp -n -i shmif0 173 atf_check -s exit:0 -o not-match:'S R' rump.ndp -n -a 174 atf_check -s exit:0 -o not-match:'fc00:1:' rump.ndp -n -a 175 atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6 176 unset RUMP_SERVER 177 178 atf_check -s exit:0 kill -TERM `cat ${PIDFILE}` 179 wait_term ${PIDFILE} 180 181 export RUMP_SERVER=${RUMPCLI} 182 atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1 183 unset RUMP_SERVER 184 185 start_rtadvd $RUMPSRV $PIDFILE 186 187 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 188 189 atf_check -s exit:0 kill -TERM `cat ${PIDFILE}` 190 wait_term ${PIDFILE} 191 192 rump_server_destroy_ifaces 193} 194 195ra_basic_cleanup() 196{ 197 198 if [ -f ${PIDFILE} ]; then 199 kill -TERM `cat ${PIDFILE}` 200 wait_term ${PIDFILE} 201 fi 202 203 $DEBUG && dump 204 cleanup 205} 206 207atf_test_case ra_flush_prefix_entries cleanup 208ra_flush_prefix_entries_head() 209{ 210 211 atf_set "descr" "Tests for flushing prefixes (ndp -P)" 212 atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig" 213} 214 215ra_flush_prefix_entries_body() 216{ 217 218 rump_server_fs_start $RUMPSRV netinet6 219 rump_server_start $RUMPCLI netinet6 220 221 setup_shmif0 ${RUMPSRV} ${IP6SRV} 222 setup_shmif0 ${RUMPCLI} ${IP6CLI} 223 224 init_server $RUMPSRV 225 226 create_rtadvdconfig 227 228 export RUMP_SERVER=${RUMPCLI} 229 atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1 230 unset RUMP_SERVER 231 232 start_rtadvd $RUMPSRV $PIDFILE 233 234 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 235 236 export RUMP_SERVER=${RUMPCLI} 237 238 # Terminate rtadvd to prevent new RA messages from coming 239 # Note that ifconfig down; kill -TERM doesn't work 240 kill -KILL `cat ${PIDFILE}` 241 242 # Flush all the entries in the prefix list 243 atf_check -s exit:0 rump.ndp -P 244 245 $DEBUG && dump_entries 246 atf_check -s exit:0 -o match:'if=shmif0' rump.ndp -r 247 atf_check -s exit:0 -o empty rump.ndp -p 248 atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0 249 atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a 250 atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a 251 atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6 252 unset RUMP_SERVER 253 254 rump_server_destroy_ifaces 255} 256 257ra_flush_prefix_entries_cleanup() 258{ 259 260 $DEBUG && dump 261 cleanup 262} 263 264atf_test_case ra_flush_defrouter_entries cleanup 265ra_flush_defrouter_entries_head() 266{ 267 268 atf_set "descr" "Tests for flushing default routers (ndp -R)" 269 atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig" 270} 271 272ra_flush_defrouter_entries_body() 273{ 274 275 rump_server_fs_start $RUMPSRV netinet6 276 rump_server_start $RUMPCLI netinet6 277 278 setup_shmif0 ${RUMPSRV} ${IP6SRV} 279 setup_shmif0 ${RUMPCLI} ${IP6CLI} 280 281 init_server $RUMPSRV 282 283 create_rtadvdconfig 284 285 export RUMP_SERVER=${RUMPCLI} 286 atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1 287 unset RUMP_SERVER 288 289 start_rtadvd $RUMPSRV $PIDFILE 290 291 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 292 293 export RUMP_SERVER=${RUMPCLI} 294 295 # Terminate rtadvd to prevent new RA messages from coming 296 # Note that ifconfig down; kill -TERM doesn't work 297 kill -KILL `cat ${PIDFILE}` 298 299 # Flush all the entries in the default router list 300 atf_check -s exit:0 rump.ndp -R 301 302 $DEBUG && dump_entries 303 atf_check -s exit:0 -o empty rump.ndp -r 304 atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p 305 atf_check -s exit:0 -o match:'linkmtu=1300' rump.ndp -n -i shmif0 306 atf_check -s exit:0 -o match:'(23h59m|1d0h0m)..s S R' rump.ndp -n -a 307 atf_check -s exit:0 -o match:'fc00:1:' rump.ndp -n -a 308 atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6 309 unset RUMP_SERVER 310 311 rump_server_destroy_ifaces 312} 313 314ra_flush_defrouter_entries_cleanup() 315{ 316 317 $DEBUG && dump 318 cleanup 319} 320 321atf_test_case ra_delete_address cleanup 322ra_delete_address_head() 323{ 324 325 atf_set "descr" "Tests for deleting auto-configured address" 326 atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig" 327} 328 329ra_delete_address_body() 330{ 331 332 rump_server_fs_start $RUMPSRV netinet6 333 rump_server_start $RUMPCLI netinet6 334 335 setup_shmif0 ${RUMPSRV} ${IP6SRV} 336 setup_shmif0 ${RUMPCLI} ${IP6CLI} 337 338 init_server $RUMPSRV 339 340 create_rtadvdconfig 341 342 export RUMP_SERVER=${RUMPCLI} 343 atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1 344 unset RUMP_SERVER 345 346 start_rtadvd $RUMPSRV $PIDFILE 347 348 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 349 350 export RUMP_SERVER=${RUMPCLI} 351 $DEBUG && rump.ifconfig shmif0 352 atf_check -s exit:0 rump.ifconfig shmif0 inet6 \ 353 $(rump.ifconfig shmif0 |awk '/AUTOCONF/ {print $2}') delete 354 unset RUMP_SERVER 355 356 atf_check -s exit:0 kill -TERM `cat ${PIDFILE}` 357 wait_term ${PIDFILE} 358 359 rump_server_destroy_ifaces 360} 361 362ra_delete_address_cleanup() 363{ 364 365 if [ -f ${PIDFILE} ]; then 366 kill -TERM `cat ${PIDFILE}` 367 wait_term ${PIDFILE} 368 fi 369 370 $DEBUG && dump 371 cleanup 372} 373 374atf_test_case ra_multiple_routers cleanup 375ra_multiple_routers_head() 376{ 377 378 atf_set "descr" "Tests for multiple routers" 379 atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig" 380} 381 382ra_multiple_routers_body() 383{ 384 local n= 385 386 rump_server_fs_start $RUMPSRV netinet6 387 rump_server_fs_start $RUMPSRV3 netinet6 388 rump_server_start $RUMPCLI netinet6 389 390 setup_shmif0 ${RUMPSRV} ${IP6SRV} 391 setup_shmif0 ${RUMPSRV3} ${IP6SRV3} 392 setup_shmif0 ${RUMPCLI} ${IP6CLI} 393 394 init_server $RUMPSRV 395 init_server $RUMPSRV3 396 397 create_rtadvdconfig 398 399 export RUMP_SERVER=${RUMPCLI} 400 atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1 401 unset RUMP_SERVER 402 403 start_rtadvd $RUMPSRV $PIDFILE 404 start_rtadvd $RUMPSRV3 $PIDFILE3 405 406 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 407 check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX 408 409 export RUMP_SERVER=$RUMPCLI 410 # Two prefixes are advertised by differnt two routers 411 n=$(rump.ndp -p |grep 'advertised by' |wc -l) 412 atf_check_equal $n 2 413 unset RUMP_SERVER 414 415 atf_check -s exit:0 kill -TERM `cat ${PIDFILE}` 416 wait_term ${PIDFILE} 417 atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}` 418 wait_term ${PIDFILE3} 419 420 rump_server_destroy_ifaces 421} 422 423ra_multiple_routers_cleanup() 424{ 425 426 if [ -f ${PIDFILE} ]; then 427 kill -TERM `cat ${PIDFILE}` 428 wait_term ${PIDFILE} 429 fi 430 if [ -f ${PIDFILE3} ]; then 431 kill -TERM `cat ${PIDFILE3}` 432 wait_term ${PIDFILE3} 433 fi 434 435 $DEBUG && dump 436 cleanup 437} 438 439atf_test_case ra_multiple_routers_single_prefix cleanup 440ra_multiple_routers_single_prefix_head() 441{ 442 443 atf_set "descr" "Tests for multiple routers with a single prefix" 444 atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig" 445} 446 447ra_multiple_routers_single_prefix_body() 448{ 449 local n= 450 451 rump_server_fs_start $RUMPSRV netinet6 452 rump_server_fs_start $RUMPSRV1_2 netinet6 453 rump_server_start $RUMPCLI netinet6 454 455 setup_shmif0 ${RUMPSRV} ${IP6SRV} 456 setup_shmif0 ${RUMPSRV1_2} ${IP6SRV1_2} 457 setup_shmif0 ${RUMPCLI} ${IP6CLI} 458 459 init_server $RUMPSRV 460 init_server $RUMPSRV1_2 461 462 create_rtadvdconfig 463 464 export RUMP_SERVER=${RUMPCLI} 465 atf_check -s exit:0 -o match:'0.->.1' rump.sysctl -w net.inet6.ip6.accept_rtadv=1 466 unset RUMP_SERVER 467 468 start_rtadvd $RUMPSRV $PIDFILE 469 start_rtadvd $RUMPSRV1_2 $PIDFILE1_2 470 471 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 472 check_entries $RUMPCLI $RUMPSRV1_2 $IP6SRV_PREFIX 473 474 export RUMP_SERVER=$RUMPCLI 475 # One prefix is advertised by differnt two routers 476 n=$(rump.ndp -p |grep 'advertised by' |wc -l) 477 atf_check_equal $n 1 478 unset RUMP_SERVER 479 480 atf_check -s exit:0 kill -TERM `cat ${PIDFILE}` 481 wait_term ${PIDFILE} 482 atf_check -s exit:0 kill -TERM `cat ${PIDFILE1_2}` 483 wait_term ${PIDFILE1_2} 484 485 rump_server_destroy_ifaces 486} 487 488atf_test_case ra_multiple_routers_maxifprefixes cleanup 489ra_multiple_routers_maxifprefixes_head() 490{ 491 492 atf_set "descr" "Tests for exceeding the number of maximum prefixes" 493 atf_set "require.progs" "rump_server rump.rtadvd rump.ndp rump.ifconfig" 494} 495 496ra_multiple_routers_maxifprefixes_body() 497{ 498 local n= 499 500 rump_server_fs_start $RUMPSRV netinet6 501 rump_server_fs_start $RUMPSRV3 netinet6 502 rump_server_fs_start $RUMPSRV4 netinet6 503 rump_server_start $RUMPCLI netinet6 504 505 setup_shmif0 ${RUMPSRV} ${IP6SRV} 506 setup_shmif0 ${RUMPSRV3} ${IP6SRV3} 507 setup_shmif0 ${RUMPSRV4} ${IP6SRV4} 508 setup_shmif0 ${RUMPCLI} ${IP6CLI} 509 510 init_server $RUMPSRV 511 init_server $RUMPSRV3 512 init_server $RUMPSRV4 513 514 create_rtadvdconfig 515 516 export RUMP_SERVER=${RUMPCLI} 517 atf_check -s exit:0 -o match:'0.->.1' \ 518 rump.sysctl -w net.inet6.ip6.accept_rtadv=1 519 # Limit the maximum number of prefix entries to 2 520 atf_check -s exit:0 -o match:'16.->.2' \ 521 rump.sysctl -w net.inet6.ip6.maxifprefixes=2 522 unset RUMP_SERVER 523 524 start_rtadvd $RUMPSRV $PIDFILE 525 start_rtadvd $RUMPSRV3 $PIDFILE3 526 527 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 528 check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX 529 530 start_rtadvd $RUMPSRV4 $PIDFILE4 531 532 export RUMP_SERVER=${RUMPCLI} 533 $DEBUG && dump_entries 534 # There should remain two prefixes 535 n=$(rump.ndp -p |grep 'advertised by' |wc -l) 536 atf_check_equal $n 2 537 # TODO check other conditions 538 unset RUMP_SERVER 539 540 atf_check -s exit:0 kill -TERM `cat ${PIDFILE}` 541 wait_term ${PIDFILE} 542 atf_check -s exit:0 kill -TERM `cat ${PIDFILE3}` 543 wait_term ${PIDFILE3} 544 atf_check -s exit:0 kill -TERM `cat ${PIDFILE4}` 545 wait_term ${PIDFILE4} 546 547 rump_server_destroy_ifaces 548} 549 550ra_multiple_routers_maxifprefixes_cleanup() 551{ 552 553 if [ -f ${PIDFILE} ]; then 554 kill -TERM `cat ${PIDFILE}` 555 wait_term ${PIDFILE} 556 fi 557 if [ -f ${PIDFILE3} ]; then 558 kill -TERM `cat ${PIDFILE3}` 559 wait_term ${PIDFILE3} 560 fi 561 if [ -f ${PIDFILE4} ]; then 562 kill -TERM `cat ${PIDFILE4}` 563 wait_term ${PIDFILE4} 564 fi 565 566 $DEBUG && dump 567 cleanup 568} 569 570atf_init_test_cases() 571{ 572 573 atf_add_test_case ra_basic 574 atf_add_test_case ra_flush_prefix_entries 575 atf_add_test_case ra_flush_defrouter_entries 576 atf_add_test_case ra_delete_address 577 atf_add_test_case ra_multiple_routers 578 atf_add_test_case ra_multiple_routers_single_prefix 579 atf_add_test_case ra_multiple_routers_maxifprefixes 580} 581