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