1# $NetBSD: t_ra.sh,v 1.32 2017/11/25 07:58:47 kre 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:-false} 47 48RUMP_PROGS="rump_server rump.rtadvd rump.ndp rump.ifconfig rump.netstat" 49 50init_server() 51{ 52 53 export RUMP_SERVER=$1 54 atf_check -s exit:0 -o match:'0.->.1' \ 55 rump.sysctl -w net.inet6.ip6.forwarding=1 56 export LD_PRELOAD=/usr/lib/librumphijack.so 57 atf_check -s exit:0 mkdir -p /rump/var/chroot/rtadvd 58 unset LD_PRELOAD 59 unset RUMP_SERVER 60} 61 62setup_shmif0() 63{ 64 local sock=$1 65 local IP6ADDR=$2 66 67 rump_server_add_iface $sock shmif0 bus1 68 69 export RUMP_SERVER=$sock 70 atf_check -s exit:0 rump.ifconfig shmif0 inet6 ${IP6ADDR} 71 atf_check -s exit:0 rump.ifconfig shmif0 up 72 atf_check -s exit:0 rump.ifconfig -w 10 73 74 $DEBUG && rump.ifconfig 75} 76 77kill_rtadvd() 78{ 79 local pid=$(cat "$1") 80 81 test -n "$pid" && { 82 case "$pid" in 83 *[!0-9]*) return 1;; 84 esac 85 test "$pid" -gt 1 && kill -s KILL "${pid}" 86 } 87 rm -f "$1" 88} 89 90terminate_rtadvd() 91{ 92 local pidfile=$1 93 local n=5 94 95 if ! [ -f "$pidfile" ]; then 96 return 97 fi 98 99 local pid=$(cat "$pidfile") 100 101 test -n "${pid}" && kill -s TERM "${pid}" 102 103 # Note, rtadvd cannot remove its own pidfile, it chroots after 104 # creating it (and if it chroot'd first, we would not be able to 105 # control where it puts the thing, and so it would be useless.) 106 # However, it does truncate it... so watch for that. 107 while [ -s "$pidfile" ]; do 108 n=$((n - 1)) 109 if [ "$n" = 0 ]; then 110 kill_rtadvd "$pidfile" 111 return 112 fi 113 sleep 0.2 114 done 115 # and finally complete the cleanup that rtadvd did not do. 116 rm -f "$pidfile" 117} 118 119create_rtadvdconfig() 120{ 121 cat << _EOF > ${CONFIG} 122shmif0:\\ 123 :mtu#1300:maxinterval#4:mininterval#3: 124_EOF 125} 126 127create_rtadvdconfig_rltime() 128{ 129 cat << _EOF > ${CONFIG} 130shmif0:\\ 131 :mtu#1300:maxinterval#4:mininterval#3:rltime#$1: 132_EOF 133 $DEBUG && cat ${CONFIG} 134} 135 136create_rtadvdconfig_vltime() 137{ 138 cat << _EOF > ${CONFIG} 139shmif0:\\ 140 :mtu#1300:maxinterval#4:mininterval#3:addr="$1":vltime#$2: 141_EOF 142 $DEBUG && cat ${CONFIG} 143} 144 145RA_count() 146{ 147 RUMP_SERVER="$1" rump.netstat -p icmp6 | sed -n ' 148 $ { 149 s/^.*$/0/p 150 q 151 } 152 /router advertisement:/!d 153 s/.*router advertisement: *// 154 s/[ ]*$// 155 s/^$/0/ 156 p 157 q 158 ' 159} 160 161await_RA() 162{ 163 local N=$(RA_count "$1") 164 while [ "$(RA_count "$1")" -le "$N" ]; do 165 sleep 0.2 166 done 167} 168 169start_rtadvd() 170{ 171 local RUMP_SERVER="$1" 172 export RUMP_SERVER 173 174 atf_check -s exit:0 -e ignore \ 175 rump.rtadvd -D -c ${CONFIG} -p "$2" shmif0 176 177 # don't wait for the pid file to appear and get a pid in it. 178 # we look for receiving RAs instead, must more reliable 179 # extra delay here increases possibility of RA arriving before 180 # we start looking (which means we then wait for the next .. boring!) 181} 182 183check_entries() 184{ 185 local RUMP_SERVER="$1" 186 local srv=$2 187 local addr_prefix=$3 188 local mac_srv= ll_srv= 189 export RUMP_SERVER 190 191 ll_srv=$(get_linklocal_addr "$srv" shmif0) 192 mac_srv=$(get_macaddr "$srv" shmif0) 193 194 $DEBUG && dump_entries 195 atf_check -s exit:0 -o match:if=shmif0 rump.ndp -r 196 atf_check -s exit:0 -o match:advertised \ 197 -o match:"${ll_srv}%shmif0 \(reachable\)" \ 198 rump.ndp -p 199 atf_check -s exit:0 -o match:linkmtu=1300 rump.ndp -n -i shmif0 200 atf_check -s exit:0 \ 201 -o match:"$ll_srv%shmif0 +$mac_srv +shmif0 +$ONEDAYISH S R" \ 202 -o not-match:"$addr_prefix" \ 203 rump.ndp -n -a 204 atf_check -s exit:0 \ 205 -o match:"$addr_prefix.+<(TENTATIVE,)?AUTOCONF>" \ 206 rump.ifconfig shmif0 inet6 207} 208 209dump_entries() 210{ 211 local marker="+-+-+-+-+-+-+-+-+" 212 213 printf '%s %s\n' "$marker" 'ndp -n -a' 214 rump.ndp -n -a 215 printf '%s %s\n' "$marker" 'ndp -p' 216 rump.ndp -p 217 printf '%s %s\n' "$marker" 'ndp -r' 218 rump.ndp -r 219 printf '%s\n' "$marker" 220} 221 222atf_test_case ra_basic cleanup 223ra_basic_head() 224{ 225 226 atf_set "descr" "Tests for basic functions of router advaertisement(RA)" 227 atf_set "require.progs" "${RUMP_PROGS}" 228} 229 230ra_basic_body() 231{ 232 233 rump_server_fs_start $RUMPSRV netinet6 234 rump_server_start $RUMPCLI netinet6 235 236 setup_shmif0 ${RUMPSRV} ${IP6SRV} 237 init_server $RUMPSRV 238 239 setup_shmif0 ${RUMPCLI} ${IP6CLI} 240 export RUMP_SERVER=${RUMPCLI} 241 $DEBUG && rump.ndp -n -a 242 atf_check -s exit:0 -o match:'= 0' \ 243 rump.sysctl net.inet6.ip6.accept_rtadv 244 unset RUMP_SERVER 245 246 create_rtadvdconfig 247 start_rtadvd $RUMPSRV $PIDFILE 248 await_RA "${RUMPCLI}" 249 250 export RUMP_SERVER=${RUMPCLI} 251 atf_check -s exit:0 -o empty rump.ndp -r 252 atf_check -s exit:0 -o not-match:advertised rump.ndp -p 253 atf_check -s exit:0 -o match:linkmtu=0 rump.ndp -n -i shmif0 254 atf_check -s exit:0 -o not-match:'S R' -o not-match:fc00:1: \ 255 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 terminate_rtadvd $PIDFILE 260 261 RUMP_SERVER=${RUMPCLI} atf_check -s exit:0 -o match:'0 -> 1' \ 262 rump.sysctl -w net.inet6.ip6.accept_rtadv=1 263 264 start_rtadvd $RUMPSRV $PIDFILE 265 await_RA "${RUMPCLI}" 266 267 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 268 269 terminate_rtadvd $PIDFILE 270 271 rump_server_destroy_ifaces 272} 273 274ra_basic_cleanup() 275{ 276 277 $DEBUG && dump 278 terminate_rtadvd $PIDFILE 279 cleanup 280} 281 282atf_test_case ra_flush_prefix_entries cleanup 283ra_flush_prefix_entries_head() 284{ 285 286 atf_set "descr" "Tests for flushing prefixes (ndp -P)" 287 atf_set "require.progs" "${RUMP_PROGS}" 288} 289 290ra_flush_prefix_entries_body() 291{ 292 293 rump_server_fs_start $RUMPSRV netinet6 294 rump_server_start $RUMPCLI netinet6 295 296 setup_shmif0 ${RUMPSRV} ${IP6SRV} 297 setup_shmif0 ${RUMPCLI} ${IP6CLI} 298 299 init_server $RUMPSRV 300 301 create_rtadvdconfig 302 303 export RUMP_SERVER=${RUMPCLI} 304 atf_check -s exit:0 -o match:'0 -> 1' \ 305 rump.sysctl -w net.inet6.ip6.accept_rtadv=1 306 unset RUMP_SERVER 307 308 start_rtadvd $RUMPSRV $PIDFILE 309 await_RA "${RUMPCLI}" 310 311 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 312 313 export RUMP_SERVER=${RUMPCLI} 314 315 # Terminate rtadvd to prevent new RA messages from coming 316 terminate_rtadvd $PIDFILE 317 318 # Flush all the entries in the prefix list 319 atf_check -s exit:0 rump.ndp -P 320 321 $DEBUG && dump_entries 322 atf_check -s exit:0 -o match:if=shmif0 rump.ndp -r 323 atf_check -s exit:0 -o empty rump.ndp -p 324 atf_check -s exit:0 -o match:linkmtu=1300 rump.ndp -n -i shmif0 325 atf_check -s exit:0 -o match:"$ONEDAYISH S R" -o not-match:fc00:1: \ 326 rump.ndp -n -a 327 atf_check -s exit:0 -o not-match:'fc00:1:' rump.ifconfig shmif0 inet6 328 unset RUMP_SERVER 329 330 rump_server_destroy_ifaces 331} 332 333ra_flush_prefix_entries_cleanup() 334{ 335 336 $DEBUG && dump 337 terminate_rtadvd $PIDFILE 338 cleanup 339} 340 341atf_test_case ra_flush_defrouter_entries cleanup 342ra_flush_defrouter_entries_head() 343{ 344 345 atf_set "descr" "Tests for flushing default routers (ndp -R)" 346 atf_set "require.progs" "${RUMP_PROGS}" 347} 348 349ra_flush_defrouter_entries_body() 350{ 351 352 rump_server_fs_start $RUMPSRV netinet6 353 rump_server_start $RUMPCLI netinet6 354 355 setup_shmif0 ${RUMPSRV} ${IP6SRV} 356 setup_shmif0 ${RUMPCLI} ${IP6CLI} 357 358 init_server $RUMPSRV 359 360 create_rtadvdconfig 361 362 RUMP_SERVER=${RUMPCLI} atf_check -s exit:0 -o match:'0 -> 1' \ 363 rump.sysctl -w net.inet6.ip6.accept_rtadv=1 364 365 start_rtadvd $RUMPSRV $PIDFILE 366 await_RA "${RUMPCLI}" 367 368 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 369 370 export RUMP_SERVER=${RUMPCLI} 371 372 # Terminate rtadvd to prevent new RA messages from coming 373 terminate_rtadvd $PIDFILE 374 375 # Flush all the entries in the default router list 376 atf_check -s exit:0 rump.ndp -R 377 378 $DEBUG && dump_entries 379 atf_check -s exit:0 -o empty rump.ndp -r 380 atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p 381 atf_check -s exit:0 -o match:linkmtu=1300 rump.ndp -n -i shmif0 382 atf_check -s exit:0 -o not-match:fc00:1: rump.ndp -n -a 383 atf_check -s exit:0 -o match:'fc00:1:' rump.ifconfig shmif0 inet6 384 unset RUMP_SERVER 385 386 rump_server_destroy_ifaces 387} 388 389ra_flush_defrouter_entries_cleanup() 390{ 391 392 $DEBUG && dump 393 terminate_rtadvd $PIDFILE 394 cleanup 395} 396 397atf_test_case ra_delete_address cleanup 398ra_delete_address_head() 399{ 400 401 atf_set "descr" "Tests for deleting auto-configured address" 402 atf_set "require.progs" "${RUMP_PROGS}" 403} 404 405ra_delete_address_body() 406{ 407 408 rump_server_fs_start $RUMPSRV netinet6 409 rump_server_start $RUMPCLI netinet6 410 411 setup_shmif0 ${RUMPSRV} ${IP6SRV} 412 setup_shmif0 ${RUMPCLI} ${IP6CLI} 413 414 init_server $RUMPSRV 415 416 create_rtadvdconfig 417 418 RUMP_SERVER=${RUMPCLI} atf_check -s exit:0 -o match:'0 -> 1' \ 419 rump.sysctl -w net.inet6.ip6.accept_rtadv=1 420 421 start_rtadvd $RUMPSRV $PIDFILE 422 await_RA "${RUMPCLI}" 423 424 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 425 426 export RUMP_SERVER=${RUMPCLI} 427 $DEBUG && rump.ifconfig shmif0 428 atf_check -s exit:0 rump.ifconfig shmif0 inet6 \ 429 $(rump.ifconfig shmif0 | awk '/AUTOCONF/ {print $2}') delete 430 unset RUMP_SERVER 431 432 terminate_rtadvd $PIDFILE 433 434 rump_server_destroy_ifaces 435} 436 437ra_delete_address_cleanup() 438{ 439 440 $DEBUG && dump 441 terminate_rtadvd $PIDFILE 442 cleanup 443} 444 445atf_test_case ra_multiple_routers cleanup 446ra_multiple_routers_head() 447{ 448 449 atf_set "descr" "Tests for multiple routers" 450 atf_set "require.progs" "${RUMP_PROGS}" 451} 452 453ra_multiple_routers_body() 454{ 455 local n= 456 457 rump_server_fs_start $RUMPSRV netinet6 458 rump_server_fs_start $RUMPSRV3 netinet6 459 rump_server_start $RUMPCLI netinet6 460 461 setup_shmif0 ${RUMPSRV} ${IP6SRV} 462 setup_shmif0 ${RUMPSRV3} ${IP6SRV3} 463 setup_shmif0 ${RUMPCLI} ${IP6CLI} 464 465 init_server $RUMPSRV 466 init_server $RUMPSRV3 467 468 create_rtadvdconfig 469 470 RUMP_SERVER=${RUMPCLI} atf_check -s exit:0 -o match:'0 -> 1' \ 471 rump.sysctl -w net.inet6.ip6.accept_rtadv=1 472 473 start_rtadvd $RUMPSRV $PIDFILE 474 start_rtadvd $RUMPSRV3 $PIDFILE3 475 await_RA "${RUMPCLI}" 476 await_RA "${RUMPCLI}" 477 478 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 479 check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX 480 481 # Two prefixes are advertised by differnt two routers 482 n=$(RUMP_SERVER=$RUMPCLI rump.ndp -p | grep 'advertised by' | wc -l) 483 atf_check_equal $n 2 484 485 terminate_rtadvd $PIDFILE 486 terminate_rtadvd $PIDFILE3 487 488 rump_server_destroy_ifaces 489} 490 491ra_multiple_routers_cleanup() 492{ 493 494 $DEBUG && dump 495 terminate_rtadvd $PIDFILE 496 terminate_rtadvd $PIDFILE3 497 cleanup 498} 499 500atf_test_case ra_multiple_routers_single_prefix cleanup 501ra_multiple_routers_single_prefix_head() 502{ 503 504 atf_set "descr" "Tests for multiple routers with a single prefix" 505 atf_set "require.progs" "${RUMP_PROGS}" 506} 507 508ra_multiple_routers_single_prefix_body() 509{ 510 local n= 511 512 rump_server_fs_start $RUMPSRV netinet6 513 rump_server_fs_start $RUMPSRV1_2 netinet6 514 rump_server_start $RUMPCLI netinet6 515 516 setup_shmif0 ${RUMPSRV} ${IP6SRV} 517 setup_shmif0 ${RUMPSRV1_2} ${IP6SRV1_2} 518 setup_shmif0 ${RUMPCLI} ${IP6CLI} 519 520 init_server $RUMPSRV 521 init_server $RUMPSRV1_2 522 523 create_rtadvdconfig 524 525 RUMP_SERVER=${RUMPCLI} atf_check -s exit:0 -o match:'0 -> 1' \ 526 rump.sysctl -w net.inet6.ip6.accept_rtadv=1 527 528 start_rtadvd $RUMPSRV $PIDFILE 529 start_rtadvd $RUMPSRV1_2 $PIDFILE1_2 530 await_RA "${RUMPCLI}" 531 await_RA "${RUMPCLI}" 532 533 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 534 check_entries $RUMPCLI $RUMPSRV1_2 $IP6SRV_PREFIX 535 536 export RUMP_SERVER=$RUMPCLI 537 # One prefix is advertised by differnt two routers 538 n=$(rump.ndp -p |grep 'advertised by' |wc -l) 539 atf_check_equal $n 1 540 unset RUMP_SERVER 541 542 terminate_rtadvd $PIDFILE 543 terminate_rtadvd $PIDFILE1_2 544 545 rump_server_destroy_ifaces 546} 547 548ra_multiple_routers_single_prefix_cleanup() 549{ 550 551 $DEBUG && dump 552 terminate_rtadvd $PIDFILE 553 terminate_rtadvd $PIDFILE1_2 554 cleanup 555} 556 557atf_test_case ra_multiple_routers_maxifprefixes cleanup 558ra_multiple_routers_maxifprefixes_head() 559{ 560 561 atf_set "descr" "Tests for exceeding the number of maximum prefixes" 562 atf_set "require.progs" "${RUMP_PROGS}" 563} 564 565ra_multiple_routers_maxifprefixes_body() 566{ 567 local n= 568 569 rump_server_fs_start $RUMPSRV netinet6 570 rump_server_fs_start $RUMPSRV3 netinet6 571 rump_server_fs_start $RUMPSRV4 netinet6 572 rump_server_start $RUMPCLI netinet6 573 574 setup_shmif0 ${RUMPSRV} ${IP6SRV} 575 setup_shmif0 ${RUMPSRV3} ${IP6SRV3} 576 setup_shmif0 ${RUMPSRV4} ${IP6SRV4} 577 setup_shmif0 ${RUMPCLI} ${IP6CLI} 578 579 init_server $RUMPSRV 580 init_server $RUMPSRV3 581 init_server $RUMPSRV4 582 583 create_rtadvdconfig 584 585 RUMP_SERVER=${RUMPCLI} atf_check -s exit:0 -o match:'0.->.1' \ 586 rump.sysctl -w net.inet6.ip6.accept_rtadv=1 587 # Limit the maximum number of prefix entries to 2 588 RUMP_SERVER=${RUMPCLI} atf_check -s exit:0 -o match:'16 -> 2' \ 589 rump.sysctl -w net.inet6.ip6.maxifprefixes=2 590 591 start_rtadvd $RUMPSRV $PIDFILE 592 start_rtadvd $RUMPSRV3 $PIDFILE3 593 await_RA "${RUMPCLI}" 594 await_RA "${RUMPCLI}" 595 596 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 597 check_entries $RUMPCLI $RUMPSRV3 $IP6SRV3_PREFIX 598 599 start_rtadvd $RUMPSRV4 $PIDFILE4 600 await_RA "${RUMPCLI}" 601 602 $DEBUG && RUMP_SERVER="${RUMPCLI}" dump_entries 603 # There should remain two prefixes 604 n=$(RUMP_SERVER=${RUMPCLI} rump.ndp -p | grep 'advertised by' | wc -l) 605 atf_check_equal $n 2 606 # TODO check other conditions 607 608 terminate_rtadvd $PIDFILE 609 terminate_rtadvd $PIDFILE3 610 terminate_rtadvd $PIDFILE4 611 612 rump_server_destroy_ifaces 613} 614 615ra_multiple_routers_maxifprefixes_cleanup() 616{ 617 618 $DEBUG && dump 619 terminate_rtadvd $PIDFILE 620 terminate_rtadvd $PIDFILE3 621 terminate_rtadvd $PIDFILE4 622 cleanup 623} 624 625atf_test_case ra_temporary_address cleanup 626ra_temporary_address_head() 627{ 628 629 atf_set "descr" "Tests for IPv6 temporary address" 630 atf_set "require.progs" "${RUMP_PROGS}" 631} 632 633check_echo_request_pkt() 634{ 635 local pkt="$2 > $3: .+ echo request" 636 637 extract_new_packets $1 > ./out 638 $DEBUG && echo "$pkt" 639 $DEBUG && cat ./out 640 atf_check -s exit:0 -o match:"$pkt" cat ./out 641} 642 643ra_temporary_address_body() 644{ 645 local ip_auto= ip_temp= 646 647 rump_server_fs_start $RUMPSRV netinet6 648 rump_server_start $RUMPCLI netinet6 649 650 setup_shmif0 $RUMPSRV $IP6SRV 651 init_server $RUMPSRV 652 setup_shmif0 $RUMPCLI $IP6CLI 653 654 RUMP_SERVER=$RUMPCLI atf_check -s exit:0 -o match:'0 -> 1' \ 655 rump.sysctl -w net.inet6.ip6.accept_rtadv=1 656 RUMP_SERVER=$RUMPCLI atf_check -s exit:0 -o match:'0 -> 1' \ 657 rump.sysctl -w net.inet6.ip6.use_tempaddr=1 658 659 create_rtadvdconfig 660 start_rtadvd $RUMPSRV $PIDFILE 661 await_RA "${RUMPCLI}" 662 663 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 664 665 export RUMP_SERVER=$RUMPCLI 666 667 # Check temporary address 668 atf_check -s exit:0 \ 669 -o match:"$IP6SRV_PREFIX.+<(TENTATIVE,)?AUTOCONF,TEMPORARY>" \ 670 rump.ifconfig shmif0 inet6 671 672 # 673 # Testing net.inet6.ip6.prefer_tempaddr 674 # 675 atf_check -s exit:0 rump.ifconfig -w 10 676 $DEBUG && rump.ifconfig shmif0 677 ip_auto=$(rump.ifconfig shmif0 | 678 awk '/<AUTOCONF>/ {sub(/\/[0-9]*/, ""); print $2;}') 679 ip_temp=$(rump.ifconfig shmif0 | 680 awk '/<AUTOCONF,TEMPORARY>/ {sub(/\/[0-9]*/, ""); print $2;}') 681 $DEBUG && echo "AUTO=$ip_auto TEMP=$ip_temp" 682 683 # Ignore old packets 684 extract_new_packets bus1 > /dev/null 685 686 atf_check -s exit:0 -o ignore rump.ping6 -n -X 2 -c 1 $IP6SRV 687 # autoconf (non-temporal) address should be used as the source address 688 check_echo_request_pkt bus1 $ip_auto $IP6SRV 689 690 # Enable net.inet6.ip6.prefer_tempaddr 691 atf_check -s exit:0 -o match:'0 -> 1' \ 692 rump.sysctl -w net.inet6.ip6.prefer_tempaddr=1 693 694 atf_check -s exit:0 -o ignore rump.ping6 -n -X 2 -c 1 $IP6SRV 695 # autoconf, temporal address should be used as the source address 696 check_echo_request_pkt bus1 $ip_temp $IP6SRV 697 698 unset RUMP_SERVER 699 700 terminate_rtadvd $PIDFILE 701 702 rump_server_destroy_ifaces 703} 704 705ra_temporary_address_cleanup() 706{ 707 708 $DEBUG && dump 709 terminate_rtadvd $PIDFILE 710 cleanup 711} 712 713atf_test_case ra_defrouter_expiration cleanup 714ra_defrouter_expiration_head() 715{ 716 717 atf_set "descr" "Tests for default router expiration" 718 atf_set "require.progs" "${RUMP_PROGS}" 719} 720 721ra_defrouter_expiration_body() 722{ 723 local expire_time=5 724 725 rump_server_fs_start $RUMPSRV netinet6 726 rump_server_start $RUMPCLI netinet6 727 728 setup_shmif0 ${RUMPSRV} ${IP6SRV} 729 setup_shmif0 ${RUMPCLI} ${IP6CLI} 730 731 init_server $RUMPSRV 732 733 create_rtadvdconfig_rltime $expire_time 734 735 RUMP_SERVER=${RUMPCLI} atf_check -s exit:0 -o match:'0.->.1' \ 736 rump.sysctl -w net.inet6.ip6.accept_rtadv=1 737 738 start_rtadvd $RUMPSRV $PIDFILE 739 await_RA "${RUMPCLI}" 740 741 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 742 743 export RUMP_SERVER=${RUMPCLI} 744 745 # Terminate rtadvd to prevent new RA messages from coming 746 terminate_rtadvd $PIDFILE 747 748 # Wait until the default routers and prefix entries are expired 749 # XXX need to work out a better way ... this is a race. 750 # XXX fortunately this race usually ends with the winner we want 751 # XXX (long odds on - not worth placing a bet...) 752 sleep $expire_time 753 754 $DEBUG && dump_entries 755 756 # Give nd6_timer a chance to sweep default routers and prefix entries 757 # XXX Ugh again. 758 sleep 2 759 760 $DEBUG && dump_entries 761 atf_check -s exit:0 -o not-match:if=shmif0 rump.ndp -r 762 atf_check -s exit:0 -o match:'No advertising router' rump.ndp -p 763 atf_check -s exit:0 -o match:linkmtu=1300 rump.ndp -n -i shmif0 764 atf_check -s exit:0 -o not-match:fc00:1: rump.ndp -n -a 765 atf_check -s exit:0 -o match:fc00:1: rump.ifconfig shmif0 inet6 766 unset RUMP_SERVER 767 768 rump_server_destroy_ifaces 769} 770 771ra_defrouter_expiration_cleanup() 772{ 773 774 $DEBUG && dump 775 terminate_rtadvd $PIDFILE 776 cleanup 777} 778 779atf_test_case ra_prefix_expiration cleanup 780ra_prefix_expiration_head() 781{ 782 783 atf_set "descr" "Tests for prefix expiration" 784 atf_set "require.progs" "${RUMP_PROGS}" 785} 786 787ra_prefix_expiration_body() 788{ 789 local expire_time=5 790 791 rump_server_fs_start $RUMPSRV netinet6 792 rump_server_start $RUMPCLI netinet6 793 794 setup_shmif0 ${RUMPSRV} ${IP6SRV} 795 setup_shmif0 ${RUMPCLI} ${IP6CLI} 796 797 init_server $RUMPSRV 798 799 create_rtadvdconfig_vltime "${IP6SRV_PREFIX}:" $expire_time 800 801 RUMP_SERVER=${RUMPCLI} atf_check -s exit:0 -o match:'0 -> 1' \ 802 rump.sysctl -w net.inet6.ip6.accept_rtadv=1 803 804 start_rtadvd $RUMPSRV $PIDFILE 805 await_RA "${RUMPCLI}" 806 807 check_entries $RUMPCLI $RUMPSRV $IP6SRV_PREFIX 808 809 export RUMP_SERVER=${RUMPCLI} 810 811 # Terminate rtadvd to prevent new RA messages from coming 812 terminate_rtadvd $PIDFILE 813 814 # Wait until the default routers and prefix entries are expired 815 # XXX need the same better way here too... 816 sleep $expire_time 817 818 $DEBUG && dump_entries 819 820 # Give nd6_timer a chance to sweep default routers and prefix entries 821 # XXX and here 822 sleep 2 823 824 $DEBUG && dump_entries 825 atf_check -s exit:0 -o match:if=shmif0 rump.ndp -r 826 atf_check -s exit:0 -o empty rump.ndp -p 827 atf_check -s exit:0 -o match:linkmtu=1300 rump.ndp -n -i shmif0 828 atf_check -s exit:0 -o match:"$ONEDAYISH S R" -o not-match:fc00:1: \ 829 rump.ndp -n -a 830 atf_check -s exit:0 -o not-match:fc00:1: rump.ifconfig shmif0 inet6 831 unset RUMP_SERVER 832 833 rump_server_destroy_ifaces 834} 835 836ra_prefix_expiration_cleanup() 837{ 838 839 $DEBUG && dump 840 terminate_rtadvd $PIDFILE 841 cleanup 842} 843 844atf_init_test_cases() 845{ 846 847 atf_add_test_case ra_basic 848 atf_add_test_case ra_flush_prefix_entries 849 atf_add_test_case ra_flush_defrouter_entries 850 atf_add_test_case ra_delete_address 851 atf_add_test_case ra_multiple_routers 852 atf_add_test_case ra_multiple_routers_single_prefix 853 atf_add_test_case ra_multiple_routers_maxifprefixes 854 atf_add_test_case ra_temporary_address 855 atf_add_test_case ra_defrouter_expiration 856 atf_add_test_case ra_prefix_expiration 857} 858