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