1231858Sbz#!/bin/sh 2231858Sbz#- 3231858Sbz# Copyright (c) 2012 Cisco Systems, Inc. 4231858Sbz# All rights reserved. 5231858Sbz# 6231858Sbz# This software was developed by Bjoern Zeeb under contract to 7231858Sbz# Cisco Systems, Inc.. 8231858Sbz# 9231858Sbz# Redistribution and use in source and binary forms, with or without 10231858Sbz# modification, are permitted provided that the following conditions 11231858Sbz# are met: 12231858Sbz# 1. Redistributions of source code must retain the above copyright 13231858Sbz# notice, this list of conditions and the following disclaimer. 14231858Sbz# 2. Redistributions in binary form must reproduce the above copyright 15231858Sbz# notice, this list of conditions and the following disclaimer in the 16231858Sbz# documentation and/or other materials provided with the distribution. 17231858Sbz# 18231858Sbz# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19231858Sbz# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20231858Sbz# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21231858Sbz# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22231858Sbz# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23231858Sbz# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24231858Sbz# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25231858Sbz# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26231858Sbz# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27231858Sbz# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28231858Sbz# SUCH DAMAGE. 29231858Sbz# 30231858Sbz# $FreeBSD: releng/10.3/tools/test/netfibs/initiator.sh 232609 2012-03-06 14:19:36Z bz $ 31231858Sbz# 32231858Sbz 33231858Sbz# We will use the RFC5180 (and Errata) benchmarking working group prefix 34231858Sbz# 2001:0002::/48 for testing. 35231858SbzPREFIX="2001:2:" 36231858Sbz 37231858Sbz# Set IFACE to the real interface you want to run the test on. 38231858Sbz: ${IFACE:=lo0} 39231858Sbz 40231858Sbz# Number of seconds to wait for peer node to synchronize for test. 41231858Sbz: ${WAITS:=120} 42231858Sbz 43231858Sbz# Control port we use to exchange messages between nodes to sync. tests, etc. 44231858Sbz: ${CTRLPORT:=6666} 45231858Sbz 46231858Sbz# Get the number of FIBs from the kernel. 47231858SbzRT_NUMFIBS=`sysctl -n net.fibs` 48231858Sbz 49231858SbzOURADDR="2001:2:ff00::1" 50231858SbzPEERADDR="2001:2:ff00::2" 51231858SbzPEERLINKLOCAL="" 52231858Sbz 53231858Sbz# By default all commands must succeed. Individual tests may disable this 54231858Sbz# temporary. 55231858Sbzset -e 56231858Sbz 57231858Sbz# Debug magic. 58231858Sbzcase "${DEBUG}" in 59231858Sbz42) set -x ;; 60231858Sbzesac 61231858Sbz 62231858Sbz 63231858Sbz 64231858Sbz# 65231858Sbz# Helper functions. 66231858Sbz# 67231858Sbzcheck_rc() 68231858Sbz{ 69231858Sbz local _rc _exp _testno _testname _msg _r 70231858Sbz _rc=$1 71231858Sbz _exp=$2 72231858Sbz _testno=$3 73231858Sbz _testname="$4" 74231858Sbz _msg="$5" 75231858Sbz 76231858Sbz _r="not ok" 77231858Sbz if test ${_rc} -eq ${_exp}; then 78231858Sbz _r="ok" 79231858Sbz fi 80231858Sbz echo "${_r} ${_testno} ${_testname} # ${_msg} ${_rc} ${_exp}" 81231858Sbz} 82231858Sbz 83231858Sbzprint_debug() 84231858Sbz{ 85231858Sbz local _msg 86231858Sbz _msg="$*" 87231858Sbz 88231858Sbz case ${DEBUG} in 89231858Sbz ''|0) ;; 90231858Sbz *) echo "DEBUG: ${_msg}" >&2 ;; 91231858Sbz esac 92231858Sbz} 93231858Sbz 94231858Sbzdie() 95231858Sbz{ 96231858Sbz local _msg 97231858Sbz _msg="$*" 98231858Sbz 99231858Sbz echo "ERROR: ${_msg}" >&2 100231858Sbz exit 1 101231858Sbz} 102231858Sbz 103231858Sbz# 104231858Sbz# Test functions. 105231858Sbz# 106231858Sbz 107231858Sbz# Make sure the local link-local and global addresses are reachable 108231858Sbz# from all FIBs. 109231858Sbzcheck_local_addr() 110231858Sbz{ 111231858Sbz local _l i testno 112231858Sbz 113231858Sbz print_debug "Setting up interface ${IFACE}" 114231858Sbz ifconfig ${IFACE} inet6 ${OURADDR}/64 alias up 115231858Sbz _l=`ifconfig ${IFACE} | awk '/inet6 fe80:/ { print $2 }'` 116231858Sbz 117231858Sbz # Let things settle. 118231858Sbz print_debug "Waiting 4 seconds for things to settle" 119231858Sbz sleep 4 120231858Sbz 121231858Sbz printf "1..%d\n" `expr 2 \* ${RT_NUMFIBS}` 122231858Sbz testno=1 123231858Sbz i=0 124231858Sbz set +e 125231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 126231858Sbz print_debug "Testing FIB ${i}" 127231858Sbz 128231858Sbz setfib -F${i} ping6 -n -c1 ${_l} > /dev/null 2>&1 129231858Sbz check_rc $? 0 ${testno} "check_local_addr_${i}_l" \ 130231858Sbz "FIB ${i} ${_l}" 131231858Sbz testno=$((testno + 1)) 132231858Sbz 133231858Sbz setfib -F${i} ping6 -n -c1 ${OURADDR} > /dev/null 2>&1 134231858Sbz check_rc $? 0 ${testno} "check_local_addr_${i}_a" \ 135231858Sbz "FIB ${i} ${OURADDR}" 136231858Sbz testno=$((testno + 1)) 137231858Sbz 138231858Sbz i=$((i + 1)) 139231858Sbz done 140231858Sbz set -e 141231858Sbz ifconfig ${IFACE} inet6 ${OURADDR}/64 -alias 142231858Sbz} 143231858Sbz 144231858Sbz 145231858Sbz# Cloned tun(4) devices behave differently on FIB 0 vs. FIB 1..n after creation 146231858Sbz# (they also do in IPv4). 147231858Sbzcheck_local_tun() 148231858Sbz{ 149231858Sbz local _l i testno IFACE _msg 150231858Sbz 151231858Sbz IFACE=tun42 152231858Sbz print_debug "Setting up interface ${IFACE}" 153231858Sbz ifconfig ${IFACE} create 154231858Sbz ifconfig ${IFACE} inet6 ${OURADDR}/64 alias up 155231858Sbz _l=`ifconfig ${IFACE} | awk '/inet6 fe80:/ { print $2 }'` 156231858Sbz 157231858Sbz # Let things settle. 158231858Sbz print_debug "Waiting 4 seconds for things to settle" 159231858Sbz sleep 4 160231858Sbz 161231858Sbz printf "1..%d\n" `expr 2 \* ${RT_NUMFIBS}` 162231858Sbz testno=1 163231858Sbz _msg="" 164231858Sbz i=0 165231858Sbz set +e 166231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 167231858Sbz print_debug "Testing FIB ${i}" 168231858Sbz if test ${i} -gt 0; then 169231858Sbz # Flag the well known behaviour as such. 170231858Sbz _msg="TODO " 171231858Sbz fi 172231858Sbz 173231858Sbz setfib -F${i} ping6 -n -c1 ${_l} > /dev/null 2>&1 174231858Sbz check_rc $? 0 ${testno} "check_local_addr_${i}_l" \ 175231858Sbz "${_msg}FIB ${i} ${_l}" 176231858Sbz testno=$((testno + 1)) 177231858Sbz 178231858Sbz setfib -F${i} ping6 -n -c1 ${OURADDR} > /dev/null 2>&1 179231858Sbz check_rc $? 0 ${testno} "check_local_addr_${i}_a" \ 180231858Sbz "${_msg}FIB ${i} ${OURADDR}" 181231858Sbz testno=$((testno + 1)) 182231858Sbz 183231858Sbz i=$((i + 1)) 184231858Sbz done 185231858Sbz set -e 186231858Sbz ifconfig ${IFACE} inet6 ${OURADDR}/64 -alias 187231858Sbz ifconfig ${IFACE} destroy 188231858Sbz} 189231858Sbz 190231858Sbzcheck_remote_up() 191231858Sbz{ 192231858Sbz local _l i testno 193231858Sbz 194231858Sbz print_debug "Setting up interface ${IFACE}" 195231858Sbz ifconfig ${IFACE} inet6 ${OURADDR}/64 alias up 196231858Sbz _l=`ifconfig ${IFACE} | awk '/inet6 fe80:/ { print $2 }'` 197231858Sbz 198231858Sbz # Let things settle. 199231858Sbz print_debug "Waiting 4 seconds for things to settle" 200231858Sbz sleep 4 201231858Sbz 202231858Sbz 203231858Sbz 204231858Sbz} 205231858Sbz 206231858Sbzsend_greeting() 207231858Sbz{ 208231858Sbz local _l _greeting _keyword _fib _fibs _linklocal 209231858Sbz 210231858Sbz print_debug "Setting up interface ${IFACE}" 211231858Sbz ifconfig ${IFACE} inet6 ${OURADDR}/64 alias up 212231858Sbz _l=`ifconfig ${IFACE} | awk '/inet6 fe80:/ { print $2 }'` 213231858Sbz 214231858Sbz # Let things settle. 215231858Sbz print_debug "Waiting 4 seconds for things to settle" 216231858Sbz sleep 4 217231858Sbz 218231858Sbz # Cleanup firewall and install rules to always allow NS/NA to succeed. 219231858Sbz # The latter is needed to allow indvidiual less specific later rules 220231858Sbz # from test cases to just disallow any IPv6 traffic on a matching FIB. 221231858Sbz ipfw -f flush > /dev/null 2>&1 222232114Sbz ipfw add 65000 permit ip from any to any > /dev/null 2>&1 223231858Sbz ipfw add 5 permit ipv6-icmp from any to any icmp6types 135,136 fib 0 \ 224231858Sbz via ${IFACE} out > /dev/null 2>&1 225231858Sbz 226231858Sbz set +e 227231858Sbz i=0 228231858Sbz rc=-1 229231858Sbz while test ${i} -lt ${WAITS} -a ${rc} -ne 0; do 230231858Sbz print_debug "Sending greeting #${i} to peer" 231231858Sbz _greeting=`echo "SETUP ${RT_NUMFIBS} ${_l}" | \ 232231858Sbz nc -6 -w 1 ${PEERADDR} ${CTRLPORT}` 233231858Sbz rc=$? 234231858Sbz i=$((i + 1)) 235231858Sbz # Might sleep longer in total but better than to DoS 236231858Sbz # and not get anywhere. 237231858Sbz sleep 1 238231858Sbz done 239231858Sbz set -e 240231858Sbz 241231858Sbz read _keyword _fibs _linklocal <<EOI 242231858Sbz${_greeting} 243231858SbzEOI 244231858Sbz print_debug "_keyword=${_keyword}" 245231858Sbz print_debug "_fibs=${_fibs}" 246231858Sbz print_debug "_linklocal=${_linklocal}" 247231858Sbz case ${_keyword} in 248231858Sbz SETUP) ;; 249231858Sbz *) die "Got invalid keyword in greeting: ${_greeting}" 250231858Sbz ;; 251231858Sbz esac 252231858Sbz if test ${_fibs} -ne ${RT_NUMFIBS}; then 253231858Sbz die "Number of FIBs not matching ours (${RT_NUMFIBS}) in" \ 254231858Sbz "greeting: ${_greeting}" 255231858Sbz fi 256231858Sbz PEERLINKLOCAL=${_linklocal} 257231858Sbz 258231858Sbz # Swap the zoneid to the local interface scope. 259232114Sbz PEERLINKLOCAL=${PEERLINKLOCAL%%\%*}"%${IFACE}" 260231858Sbz 261231858Sbz print_debug "Successfully exchanged greeting. Peer at ${PEERLINKLOCAL}" 262231858Sbz} 263231858Sbz 264231858Sbzcleanup() 265231858Sbz{ 266231858Sbz 267231858Sbz # Cleanup ipfw. 268231858Sbz ipfw delete 5 > /dev/null 2>&1 269231858Sbz 270231858Sbz print_debug "Removing address from interface ${IFACE}" 271231858Sbz ifconfig ${IFACE} inet6 ${OURADDR}/64 -alias 272231858Sbz} 273231858Sbz 274231858Sbztesttx_icmp6() 275231858Sbz{ 276231858Sbz local _n _transfer i testno _txt _fibtxt _rc _ec _p 277231858Sbz _n="$1" 278231858Sbz _transfer=$2 279231858Sbz 280231858Sbz printf "1..%d\n" `expr 2 \* ${RT_NUMFIBS}` 281231858Sbz testno=1 282231858Sbz set +e 283231858Sbz i=0 284231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 285231858Sbz _txt="${_n}${i}" 286231858Sbz print_debug "Testing ${_txt}" 287231858Sbz _fibtxt=`echo "${_txt}" | hd -v | cut -b11-60 | tr -d ' \r\n'` 288231858Sbz 289231858Sbz eval _rc="\${rc_${i}_l}" 290231858Sbz setfib -F${i} ping6 -n -c1 -p ${_fibtxt} \ 291231858Sbz ${PEERLINKLOCAL} > /dev/null 2>&1 292231858Sbz _ec=$? 293231858Sbz # We need to normalize the exit code of ping6. 294231858Sbz case ${_ec} in 295231858Sbz 0) ;; 296231858Sbz *) _ec=1 ;; 297231858Sbz esac 298231858Sbz check_rc ${_ec} ${_rc} ${testno} "${_txt}_l" \ 299231858Sbz "FIB ${i} ${PEERLINKLOCAL}" 300231858Sbz testno=$((testno + 1)) 301231858Sbz 302231858Sbz # If doing multiple transfer networks, replace PEERADDR. 303231858Sbz _p="${PEERADDR}" 304231858Sbz case ${_transfer} in 305231858Sbz 1) PEERADDR=2001:2:${i}::2 ;; 306231858Sbz esac 307231858Sbz 308231858Sbz eval _rc="\${rc_${i}_a}" 309231858Sbz setfib -F${i} ping6 -n -c1 -p ${_fibtxt} ${PEERADDR} \ 310231858Sbz > /dev/null 2>&1 311231858Sbz _ec=$? 312231858Sbz # We need to normalize the exit code of ping6. 313231858Sbz case ${_ec} in 314231858Sbz 0) ;; 315231858Sbz *) _ec=1 ;; 316231858Sbz esac 317231858Sbz check_rc ${_ec} ${_rc} ${testno} "${_txt}_a" \ 318231858Sbz "FIB ${i} ${PEERADDR}" 319231858Sbz testno=$((testno + 1)) 320231858Sbz 321231858Sbz # Restore PEERADDR. 322231858Sbz PEERADDR="${_p}" 323231858Sbz 324231858Sbz i=$((i + 1)) 325231858Sbz done 326231858Sbz set -e 327231858Sbz} 328231858Sbz 329231858Sbznc_send_recv() 330231858Sbz{ 331231858Sbz local _fib _loops _msg _expreply _addr _port _opts i 332231858Sbz _fib=$1 333231858Sbz _loops=$2 334231858Sbz _msg="$3" 335231858Sbz _expreply="$4" 336231858Sbz _addr=$5 337231858Sbz _port=$6 338231858Sbz _opts="$7" 339231858Sbz 340231858Sbz i=0 341231858Sbz while test ${i} -lt ${_loops}; do 342231858Sbz i=$((i + 1)) 343231858Sbz case "${USE_SOSETFIB}" in 344231858Sbz 1) 345231858Sbz _reply=`echo "${_msg}" | \ 346231858Sbz nc -V ${_fib} ${_opts} ${_addr} ${_port}` 347231858Sbz ;; 348231858Sbz *) 349231858Sbz _reply=`echo "${_msg}" | \ 350231858Sbz setfib -F${_fib} nc ${_opts} ${_addr} ${_port}` 351231858Sbz ;; 352231858Sbz esac 353231858Sbz if test "${_reply}" != "${_expreply}"; then 354231858Sbz if test ${i} -lt ${_loops}; then 355231858Sbz sleep 1 356231858Sbz else 357231858Sbz # Must let caller decide how to handle the error. 358231858Sbz # die "Got invalid reply from peer." \ 359231858Sbz # "Expected '${_expreply}', got '${_reply}'" 360231858Sbz return 1 361231858Sbz fi 362231858Sbz else 363231858Sbz break 364231858Sbz fi 365231858Sbz done 366231858Sbz return 0 367231858Sbz} 368231858Sbz 369231858Sbztesttx_tcp_udp() 370231858Sbz{ 371231858Sbz local _n _o _f testno i _fibtxt 372231858Sbz _n="$1" 373231858Sbz _o="$2" 374231858Sbz _f="$3" 375231858Sbz 376231858Sbz printf "1..%d\n" `expr 2 \* ${RT_NUMFIBS}` 377231858Sbz testno=1 378231858Sbz i=0 379231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 380231858Sbz print_debug "Testing ${_f} ${i}" 381231858Sbz 382231858Sbz eval _rc="\${rc_${i}_l}" 383231858Sbz _fibtxt="${_n}_${i}_l ${_f} ${i} ${PEERLINKLOCAL}" 384231858Sbz nc_send_recv ${i} 1 "${_fibtxt}" "${_fibtxt}" ${PEERLINKLOCAL} \ 385231858Sbz ${CTRLPORT} "-6 ${_o} -w1" 386231858Sbz check_rc $? ${_rc} ${testno} "${_fibtxt}" 387231858Sbz testno=$((testno + 1)) 388231858Sbz 389231858Sbz eval _rc="\${rc_${i}_a}" 390231858Sbz _fibtxt="${_n}_${i}_a ${_f} ${i} ${PEERADDR}" 391231858Sbz nc_send_recv ${i} 1 "${_fibtxt}" "${_fibtxt}" ${PEERADDR} \ 392231858Sbz ${CTRLPORT} "-6 ${_o} -w1" 393231858Sbz check_rc $? ${_rc} ${testno} "${_fibtxt}" 394231858Sbz testno=$((testno + 1)) 395231858Sbz 396231858Sbz i=$((i + 1)) 397231858Sbz done 398231858Sbz} 399231858Sbz 400231858Sbz# setfib TCP|UDP/IPv6 test on link-local and global address of peer from all FIBs. 401231858Sbztesttx_ulp6_connected() 402231858Sbz{ 403231858Sbz local _fibtxt _reply _n _o _rc _fib _f _opts 404231858Sbz _n=$1 405231858Sbz _o="$2" 406231858Sbz _fib=$3 407231858Sbz 408231858Sbz case "${USE_SOSETFIB}" in 409231858Sbz 1) _f="SO_SETFIB" ;; 410231858Sbz *) _f="SETFIB" ;; 411231858Sbz esac 412231858Sbz 413232609Sbz if test "${_o}" = "-i" -a "${_f}" = "SO_SETFIB"; then 414231858Sbz print_debug "Skipping icmp6 tests for SO_SETFIB." 415231858Sbz return 0 416231858Sbz fi 417231858Sbz 418231858Sbz # Clear the neighbor table to get deterministic runs. 419231858Sbz ndp -cn > /dev/null 2>&1 420231858Sbz 421231858Sbz case "${_o}" in 422231858Sbz -i) _opts="" ;; # Use TCP for START/DONE. 423231858Sbz *) _opts="${_o}" ;; 424231858Sbz esac 425231858Sbz 426231858Sbz set +e 427231858Sbz # Let peer know that we are about to start. 428231858Sbz _msg="START ${_n}" 429231858Sbz nc_send_recv ${_fib} ${WAITS} "${_msg}" "${_msg}" ${PEERADDR} \ 430231858Sbz ${CTRLPORT} "-6 ${_opts} -w1" 431231858Sbz case $? in 432231858Sbz 0) ;; 433231858Sbz *) die "Got invalid reply from peer." \ 434231858Sbz "Expected '${_msg}', got '${_reply}'" ;; 435231858Sbz esac 436231858Sbz 437231858Sbz case "${_o}" in 438231858Sbz -i) testtx_icmp6 "${_n}" ;; 439231858Sbz *) testtx_tcp_udp "${_n}" "${_o}" "${_f}" ;; 440231858Sbz esac 441231858Sbz 442231858Sbz # Let peer know that we are done with this test to move to next. 443231858Sbz # This must immediately succeed. 444231858Sbz _msg="DONE ${_n}" 445231858Sbz nc_send_recv ${_fib} ${WAITS} "${_msg}" "${_msg}" ${PEERADDR} \ 446231858Sbz ${CTRLPORT} "-6 ${_opts} -w1" 447231858Sbz case $? in 448231858Sbz 0) ;; 449231858Sbz *) die "Got invalid reply from peer." \ 450231858Sbz "Expected '${_msg}', got '${_reply}'" ;; 451231858Sbz esac 452231858Sbz set -e 453231858Sbz 454231858Sbz print_debug "Successfully received status update '${_reply}'." 455231858Sbz} 456231858Sbz 457231858Sbz################################################################################ 458231858Sbz# 459231858Sbz# ping6|TCP/UDP connect link-local and global address of peer from all FIBs. 460231858Sbz# Default reachability test. 461231858Sbz# 462231858Sbztesttx_icmp6_connected() 463231858Sbz{ 464231858Sbz local i 465231858Sbz 466231858Sbz # Setup expected return values. 467231858Sbz i=0 468231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 469231858Sbz eval rc_${i}_l=0 470231858Sbz eval rc_${i}_a=0 471231858Sbz i=$((i + 1)) 472231858Sbz done 473231858Sbz 474231858Sbz testtx_ulp6_connected "testtx_icmp6_connected" "-i" 0 475231858Sbz} 476231858Sbz 477231858Sbztesttx_tcp6_connected() 478231858Sbz{ 479231858Sbz local i 480231858Sbz 481231858Sbz # Setup expected return values. 482231858Sbz i=0 483231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 484231858Sbz eval rc_${i}_l=0 485231858Sbz eval rc_${i}_a=0 486231858Sbz i=$((i + 1)) 487231858Sbz done 488231858Sbz 489231858Sbz testtx_ulp6_connected testtx_tcp6_connected "" 0 490231858Sbz} 491231858Sbz 492231858Sbztesttx_udp6_connected() 493231858Sbz{ 494231858Sbz local i 495231858Sbz 496231858Sbz # Setup expected return values. 497231858Sbz i=0 498231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 499231858Sbz eval rc_${i}_l=0 500231858Sbz eval rc_${i}_a=0 501231858Sbz i=$((i + 1)) 502231858Sbz done 503231858Sbz 504231858Sbz testtx_ulp6_connected testtx_udp6_connected "-u" 0 505231858Sbz} 506231858Sbz 507231858Sbz################################################################################ 508231858Sbz# 509231858Sbz# Use ipfw to return unreach messages for all but one FIB. Rotate over all. 510231858Sbz# Making sure error messages are properly returned. 511231858Sbz# 512231858Sbztesttx_ulp6_connected_blackhole() 513231858Sbz{ 514232114Sbz local fib i _n _o 515231858Sbz _n="$1" 516231858Sbz _o="$2" 517231858Sbz 518232114Sbz fib=0 519232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 520231858Sbz 521232114Sbz print_debug "${_n} ${fib}" 522231858Sbz 523231858Sbz # Setup expected return values. 524231858Sbz i=0 525231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 526231858Sbz ipfw delete $((100 + i)) > /dev/null 2>&1 || true 527231858Sbz case ${i} in 528232114Sbz ${fib}) 529231858Sbz eval rc_${i}_l=0 530231858Sbz eval rc_${i}_a=0 531231858Sbz ;; 532231858Sbz *) eval rc_${i}_l=1 533231858Sbz eval rc_${i}_a=1 534231858Sbz ipfw add $((100 + i)) unreach6 admin-prohib \ 535231858Sbz ip6 from any to any fib ${i} via ${IFACE} \ 536231858Sbz out > /dev/null 2>&1 537231858Sbz ;; 538231858Sbz esac 539231858Sbz i=$((i + 1)) 540231858Sbz done 541231858Sbz 542232114Sbz testtx_ulp6_connected "${_n}${fib}" "${_o}" ${fib} 543231858Sbz case ${DEBUG} in 544231858Sbz ''|0) ;; 545231858Sbz *) ipfw show ;; 546231858Sbz esac 547232114Sbz fib=$((fib + 1)) 548231858Sbz done 549232114Sbz fib=0 550232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 551232114Sbz ipfw delete $((100 + fib)) > /dev/null 2>&1 || true 552232114Sbz fib=$((fib + 1)) 553231858Sbz done 554231858Sbz} 555231858Sbz 556231858Sbztesttx_icmp6_connected_blackhole() 557231858Sbz{ 558231858Sbz 559231858Sbz testtx_ulp6_connected_blackhole \ 560231858Sbz "testtx_icmp6_connected_blackhole" "-i" 561231858Sbz} 562231858Sbz 563231858Sbztesttx_tcp6_connected_blackhole() 564231858Sbz{ 565231858Sbz 566231858Sbz testtx_ulp6_connected_blackhole \ 567231858Sbz "testtx_tcp6_connected_blackhole" "" 568231858Sbz} 569231858Sbz 570231858Sbztesttx_udp6_connected_blackhole() 571231858Sbz{ 572231858Sbz 573231858Sbz testtx_ulp6_connected_blackhole \ 574231858Sbz "testtx_udp6_connected_blackhole" "-u" 575231858Sbz} 576231858Sbz 577231858Sbz################################################################################ 578231858Sbz# 579231858Sbz# Setup a different transfer net on each FIB. Delete all but one connected 580231858Sbz# route in all FIBs (e.g. FIB 0 uses prefix 0, FIB 1 uses prefix 1 , ...). 581231858Sbz# 582231858Sbz# Need to tag NS/NA incoming to the right FIB given the default FIB does not 583231858Sbz# know about the prefix and thus cannot do proper source address lookups for 584231858Sbz# replying otherwise. Use ipfw. 585231858Sbz# 586231858Sbztesttx_ulp6_connected_transfernets() 587231858Sbz{ 588232114Sbz local fib i _n _o _p 589231858Sbz _n="$1" 590231858Sbz _o="$2" 591231858Sbz 592231858Sbz # Setup transfer networks and firewall. 593231858Sbz ipfw delete 10 > /dev/null 2>&1 || true 594232114Sbz fib=0 595232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 596232114Sbz ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias \ 597231858Sbz > /dev/null 2>&1 || true 598232114Sbz ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 alias 599232114Sbz ipfw add 10 setfib ${fib} ipv6-icmp from 2001:2:${fib}::/64 \ 600231858Sbz to any ip6 icmp6types 135,136 via ${IFACE} in \ 601231858Sbz > /dev/null 2>&1 602231858Sbz # Remove connected routes from all but matching FIB. 603231858Sbz i=0 604231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 605231858Sbz case ${i} in 606232114Sbz ${fib});; 607231858Sbz *) setfib -F${i} route delete -inet6 \ 608232114Sbz -net 2001:2:${fib}:: > /dev/null 2>&1 609231858Sbz ;; 610231858Sbz esac 611231858Sbz i=$((i + 1)) 612231858Sbz done 613232114Sbz fib=$((fib + 1)) 614231858Sbz done 615231858Sbz 616231858Sbz # Save PEERADDR 617231858Sbz _p=${PEERADDR} 618231858Sbz 619231858Sbz # Run tests. 620232114Sbz fib=0 621232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 622232114Sbz PEERADDR=2001:2:${fib}::2 623231858Sbz 624232114Sbz print_debug "${_n} ${fib}" 625231858Sbz 626231858Sbz # Setup expected return values. 627231858Sbz i=0 628231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 629231858Sbz eval rc_${i}_l=0 630231858Sbz case ${i} in 631232114Sbz ${fib}) 632231858Sbz eval rc_${i}_a=0 633231858Sbz ;; 634231858Sbz *) eval rc_${i}_a=1 635231858Sbz ;; 636231858Sbz esac 637231858Sbz i=$((i + 1)) 638231858Sbz done 639231858Sbz 640232114Sbz testtx_ulp6_connected "${_n}${fib}" "${_o}" ${fib} 641232114Sbz fib=$((fib + 1)) 642231858Sbz done 643231858Sbz 644231858Sbz # Restore PEERADDR 645231858Sbz PEERADDR=${_p} 646231858Sbz 647231858Sbz # Cleanup transfer networks and firewall. 648232114Sbz fib=0 649232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 650232114Sbz ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias 651232114Sbz fib=$((fib + 1)) 652231858Sbz done 653231858Sbz ipfw delete 10 > /dev/null 2>&1 654231858Sbz} 655231858Sbz 656231858Sbztesttx_icmp6_connected_transfernets() 657231858Sbz{ 658231858Sbz 659231858Sbz testtx_ulp6_connected_transfernets \ 660231858Sbz "testtx_icmp6_connected_transfernets" "-i" 661231858Sbz} 662231858Sbz 663231858Sbztesttx_tcp6_connected_transfernets() 664231858Sbz{ 665231858Sbz 666231858Sbz testtx_ulp6_connected_transfernets \ 667231858Sbz "testtx_tcp6_connected_transfernets" "" 668231858Sbz} 669231858Sbz 670231858Sbztesttx_udp6_connected_transfernets() 671231858Sbz{ 672231858Sbz 673231858Sbz testtx_ulp6_connected_transfernets \ 674231858Sbz "testtx_udp6_connected_transfernets" "-u" 675231858Sbz} 676231858Sbz 677231858Sbz################################################################################ 678231858Sbz# 679231858Sbz# Setup a different transfernet on each FIB. Delete all but one connected 680231858Sbz# route in all FIBs (e.g. FIB 0 uses prefix 0, FIB 1 uses prefix 1 , ...). 681231858Sbz# 682231858Sbz# Need to tag NS/NA incoming to the right FIB given the default FIB does not 683231858Sbz# know about the prefix and thus cannot do proper source address lookups for 684231858Sbz# replying otherwise. Use ifconfig IFACE fib. 685231858Sbz# 686231858Sbztesttx_ulp6_connected_ifconfig_transfernets() 687231858Sbz{ 688232114Sbz local fib i _n _o _p 689231858Sbz _n="$1" 690231858Sbz _o="$2" 691231858Sbz 692231858Sbz # Setup transfer networks. 693232114Sbz fib=0 694232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 695232114Sbz ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias \ 696231858Sbz > /dev/null 2>&1 || true 697232114Sbz ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 alias 698231858Sbz # Remove connected routes from all but matching FIB. 699231858Sbz i=0 700231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 701231858Sbz case ${i} in 702232114Sbz ${fib});; 703231858Sbz *) setfib -F${i} route delete -inet6 \ 704232114Sbz -net 2001:2:${fib}:: > /dev/null 2>&1 705231858Sbz ;; 706231858Sbz esac 707231858Sbz i=$((i + 1)) 708231858Sbz done 709232114Sbz fib=$((fib + 1)) 710231858Sbz done 711231858Sbz 712231858Sbz # Save PEERADDR 713231858Sbz _p=${PEERADDR} 714231858Sbz 715231858Sbz # Run tests. 716232114Sbz fib=0 717232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 718232114Sbz PEERADDR=2001:2:${fib}::2 719231858Sbz 720232114Sbz print_debug "${_n} ${fib}" 721231858Sbz 722231858Sbz # Setup expected return values. 723231858Sbz i=0 724231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 725231858Sbz eval rc_${i}_l=0 726231858Sbz case ${i} in 727232114Sbz ${fib}) 728231858Sbz eval rc_${i}_a=0 729231858Sbz ;; 730231858Sbz *) eval rc_${i}_a=1 731231858Sbz ;; 732231858Sbz esac 733231858Sbz i=$((i + 1)) 734231858Sbz done 735231858Sbz 736232114Sbz ifconfig ${IFACE} fib ${fib} 737231858Sbz 738232114Sbz testtx_ulp6_connected "${_n}${fib}" "${_o}" ${fib} 739232114Sbz fib=$((fib + 1)) 740231858Sbz done 741231858Sbz 742231858Sbz # Restore PEERADDR 743231858Sbz PEERADDR=${_p} 744231858Sbz 745231858Sbz # Cleanup transfer networks. 746232114Sbz fib=0 747232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 748232114Sbz ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias 749232114Sbz fib=$((fib + 1)) 750231858Sbz done 751231858Sbz ifconfig ${IFACE} fib 0 752231858Sbz} 753231858Sbz 754231858Sbztesttx_icmp6_connected_ifconfig_transfernets() 755231858Sbz{ 756231858Sbz 757231858Sbz testtx_ulp6_connected_ifconfig_transfernets \ 758231858Sbz "testtx_icmp6_connected_ifconfig_transfernets" "-i" 759231858Sbz} 760231858Sbz 761231858Sbz 762231858Sbztesttx_tcp6_connected_ifconfig_transfernets() 763231858Sbz{ 764231858Sbz 765231858Sbz testtx_ulp6_connected_ifconfig_transfernets \ 766231858Sbz "testtx_tcp6_connected_ifconfig_transfernets" "" 767231858Sbz} 768231858Sbz 769231858Sbztesttx_udp6_connected_ifconfig_transfernets() 770231858Sbz{ 771231858Sbz 772231858Sbz testtx_ulp6_connected_ifconfig_transfernets \ 773231858Sbz "testtx_udp6_connected_ifconfig_transfernets" "-u" 774231858Sbz} 775231858Sbz 776231858Sbz################################################################################ 777231858Sbz# 778231858Sbz# Make destination reachable through the same default route in each FIB only. 779231858Sbz# Run standard reachability test. 780231858Sbz# 781231858Sbztesttx_ulp6_gateway() 782231858Sbz{ 783232114Sbz local fib i _n _o _p 784231858Sbz _n="$1" 785231858Sbz _o="$2" 786231858Sbz 787231858Sbz # Setup default gateway and expected error codes. 788232114Sbz fib=0 789232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 790232114Sbz setfib -F${fib} route delete -inet6 -net default \ 791231858Sbz > /dev/null 2>&1 || true 792232114Sbz setfib -F${fib} route add -inet6 -net default ${PEERADDR} \ 793231858Sbz > /dev/null 2>&1 794231858Sbz case "${_o}" in 795232114Sbz -i) eval rc_${fib}_l=0 ;; # ICMPv6 will succeed 796232114Sbz *) eval rc_${fib}_l=1 ;; 797231858Sbz esac 798232114Sbz eval rc_${fib}_a=0 799232114Sbz fib=$((fib + 1)) 800231858Sbz done 801231858Sbz 802231858Sbz # Save PEERADDR 803231858Sbz _p=${PEERADDR} 804231858Sbz PEERADDR="2001:2:ff01::2" 805231858Sbz 806231858Sbz # Run tests. 807231858Sbz print_debug "${_n}" 808231858Sbz testtx_ulp6_connected "${_n}" "${_o}" 0 809231858Sbz 810231858Sbz # Restore PEERADDR 811231858Sbz PEERADDR=${_p} 812231858Sbz 813231858Sbz # Cleanup transfer networks. 814232114Sbz fib=0 815232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 816232114Sbz setfib -F${fib} route delete -inet6 -net default \ 817231858Sbz > /dev/null 2>&1 818232114Sbz fib=$((fib + 1)) 819231858Sbz done 820231858Sbz} 821231858Sbz 822231858Sbztesttx_icmp6_gateway() 823231858Sbz{ 824231858Sbz 825231858Sbz testtx_ulp6_gateway "testtx_icmp6_gateway" "-i" 826231858Sbz} 827231858Sbz 828231858Sbztesttx_tcp6_gateway() 829231858Sbz{ 830231858Sbz 831231858Sbz testtx_ulp6_gateway "testtx_tcp6_gateway" "" 832231858Sbz} 833231858Sbz 834231858Sbztesttx_udp6_gateway() 835231858Sbz{ 836231858Sbz 837231858Sbz testtx_ulp6_gateway "testtx_udp6_gateway" "-u" 838231858Sbz} 839231858Sbz 840231858Sbz################################################################################ 841231858Sbz# 842231858Sbz# Make destination reachable through a different default route in each FIB. 843231858Sbz# Generate a dedicated transfer network for that in each FIB. Delete all but 844231858Sbz# one connected route in all FIBs (e.g. FIB 0 uses prefix 0, ...). 845231858Sbz# 846231858Sbz# Have a default route present in each FIB all time. 847231858Sbz# 848231858Sbz# Need to tag NS/NA incoming to the right FIB given the default FIB does not 849231858Sbz# know about the prefix and thus cannot do proper source address lookups for 850231858Sbz# replying otherwise. Use ipfw. 851231858Sbz# 852231858Sbz# 853231858Sbztesttx_ulp6_transfernets_gateways() 854231858Sbz{ 855232114Sbz local fib i _n _o _p 856231858Sbz _n="$1" 857231858Sbz _o="$2" 858231858Sbz 859231858Sbz # Setup transfer networks, default routes, and firewall. 860232114Sbz fib=0 861231858Sbz ipfw delete 10 > /dev/null 2>&1 || true 862232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 863232114Sbz ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias \ 864231858Sbz > /dev/null 2>&1 || true 865232114Sbz ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 alias \ 866231858Sbz > /dev/null 2>&1 867232114Sbz ipfw add 10 setfib ${fib} ipv6-icmp \ 868232114Sbz from 2001:2:${fib}::/64 to any ip6 icmp6types 135,136 \ 869231858Sbz via ${IFACE} in > /dev/null 2>&1 870231858Sbz # Remove connected routes from all but matching FIB. 871231858Sbz i=0 872231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 873231858Sbz case ${i} in 874232114Sbz ${fib});; 875231858Sbz *) setfib -F${i} route delete -inet6 \ 876232114Sbz -net 2001:2:${fib}:: > /dev/null 2>&1 877231858Sbz ;; 878231858Sbz esac 879231858Sbz i=$((i + 1)) 880231858Sbz done 881231858Sbz # Add default route. 882232114Sbz setfib -F${fib} route delete -inet6 -net default \ 883231858Sbz > /dev/null 2>&1 || true 884232114Sbz setfib -F${fib} route add -inet6 -net default \ 885232114Sbz 2001:2:${fib}::2 > /dev/null 2>&1 886232114Sbz fib=$((fib + 1)) 887231858Sbz done 888231858Sbz 889231858Sbz # Save PEERADDR 890231858Sbz _p=${PEERADDR} 891231858Sbz PEERADDR="2001:2:ff01::2" 892231858Sbz 893231858Sbz # Setup expected return values. 894231858Sbz i=0 895231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 896231858Sbz case "${_o}" in 897231858Sbz -i) eval rc_${i}_l=0 ;; # ICMPv6 will succeed 898231858Sbz *) eval rc_${i}_l=1 ;; 899231858Sbz esac 900231858Sbz eval rc_${i}_a=0 901231858Sbz i=$((i + 1)) 902231858Sbz done 903231858Sbz 904231858Sbz # Run tests. 905231858Sbz print_debug "${_n}" 906231858Sbz testtx_ulp6_connected "${_n}" "${_o}" 0 907231858Sbz 908231858Sbz # Restore PEERADDR 909231858Sbz PEERADDR=${_p} 910231858Sbz 911231858Sbz # Cleanup default routes, transfer networks, and firewall. 912232114Sbz fib=0 913232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 914232114Sbz setfib -F${fib} route delete -inet6 -net default \ 915231858Sbz > /dev/null 2>&1 916232114Sbz ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias \ 917231858Sbz > /dev/null 2>&1 918232114Sbz fib=$((fib + 1)) 919231858Sbz done 920231858Sbz ipfw delete 10 > /dev/null 2>&1 921231858Sbz} 922231858Sbz 923231858Sbztesttx_icmp6_transfernets_gateways() 924231858Sbz{ 925231858Sbz 926231858Sbz testtx_ulp6_transfernets_gateways \ 927231858Sbz "testtx_icmp6_transfernets_gateways" "-i" 928231858Sbz} 929231858Sbz 930231858Sbztesttx_tcp6_transfernets_gateways() 931231858Sbz{ 932231858Sbz 933231858Sbz testtx_ulp6_transfernets_gateways \ 934231858Sbz "testtx_tcp6_transfernets_gateways" "" 935231858Sbz} 936231858Sbz 937231858Sbztesttx_udp6_transfernets_gateways() 938231858Sbz{ 939231858Sbz 940231858Sbz testtx_ulp6_transfernets_gateways \ 941231858Sbz "testtx_udp6_transfernets_gateways" "-u" 942231858Sbz} 943231858Sbz 944231858Sbz################################################################################ 945231858Sbz# 946231858Sbz# Make destination reachable through a different default route in each FIB. 947231858Sbz# Generate a dedicated transfer network for that in each FIB. Delete all but 948231858Sbz# one connected route in all FIBs (e.g. FIB 0 uses prefix 0, ...). 949231858Sbz# 950231858Sbz# Only have a default route present in 1 FIB at a time. 951231858Sbz# 952231858Sbz# Need to tag NS/NA incoming to the right FIB given the default FIB does not 953231858Sbz# know about the prefix and thus cannot do proper source address lookups for 954231858Sbz# replying otherwise. Use ipfw. 955231858Sbz# 956231858Sbztesttx_ulp6_transfernets_gateway() 957231858Sbz{ 958232114Sbz local fib i _n _o _p 959231858Sbz _n="$1" 960231858Sbz _o="$2" 961231858Sbz 962231858Sbz # Setup transfer networks, default routes, and firewall. 963232114Sbz fib=0 964231858Sbz ipfw delete 10 > /dev/null 2>&1 || true 965232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 966232114Sbz ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias \ 967231858Sbz > /dev/null 2>&1 || true 968232114Sbz ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 alias \ 969231858Sbz > /dev/null 2>&1 970232114Sbz ipfw add 10 setfib ${fib} ipv6-icmp \ 971232114Sbz from 2001:2:${fib}::/64 to any ip6 icmp6types 135,136 \ 972231858Sbz via ${IFACE} in > /dev/null 2>&1 973231858Sbz # Remove connected routes from all but matching FIB. 974231858Sbz i=0 975231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 976231858Sbz case ${i} in 977232114Sbz ${fib});; 978231858Sbz *) setfib -F${i} route delete -inet6 \ 979232114Sbz -net 2001:2:${fib}:: > /dev/null 2>&1 980231858Sbz ;; 981231858Sbz esac 982231858Sbz i=$((i + 1)) 983231858Sbz done 984232114Sbz fib=$((fib + 1)) 985231858Sbz done 986231858Sbz 987231858Sbz # Save PEERADDR 988231858Sbz _p=${PEERADDR} 989231858Sbz PEERADDR="2001:2:ff01::2" 990231858Sbz 991231858Sbz # Run tests. 992232114Sbz fib=0 993232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 994231858Sbz 995232114Sbz print_debug "${_n} ${fib}" 996231858Sbz 997231858Sbz # Setup expected return values. 998231858Sbz i=0 999231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 1000231858Sbz case "${_o}" in 1001231858Sbz -i) eval rc_${i}_l=0 ;; # ICMPv6 will succeed 1002231858Sbz *) eval rc_${i}_l=1 ;; 1003231858Sbz esac 1004231858Sbz case ${i} in 1005232114Sbz ${fib}) 1006231858Sbz eval rc_${i}_a=0 1007231858Sbz ;; 1008231858Sbz *) eval rc_${i}_a=1 1009231858Sbz ;; 1010231858Sbz esac 1011231858Sbz i=$((i + 1)) 1012231858Sbz done 1013231858Sbz 1014231858Sbz # Add default route. 1015232114Sbz setfib -F${fib} route delete -inet6 -net default \ 1016231858Sbz > /dev/null 2>&1 || true 1017232114Sbz setfib -F${fib} route add -inet6 -net default \ 1018232114Sbz 2001:2:${fib}::2 > /dev/null 2>&1 1019231858Sbz 1020232114Sbz testtx_ulp6_connected "${_n}${fib}" "${_o}" ${fib} 1021231858Sbz 1022231858Sbz # Delete default route again. 1023232114Sbz setfib -F${fib} route delete -inet6 -net default \ 1024231858Sbz > /dev/null 2>&1 1025232114Sbz fib=$((fib + 1)) 1026231858Sbz done 1027231858Sbz 1028231858Sbz # Restore PEERADDR 1029231858Sbz PEERADDR=${_p} 1030231858Sbz 1031231858Sbz # Cleanup default routes, transfer networks, and firewall. 1032232114Sbz fib=0 1033232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 1034232114Sbz setfib -F${fib} route delete -inet6 -net default \ 1035231858Sbz > /dev/null 2>&1 1036232114Sbz ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias \ 1037231858Sbz > /dev/null 2>&1 1038232114Sbz fib=$((fib + 1)) 1039231858Sbz done 1040231858Sbz ipfw delete 10 > /dev/null 2>&1 1041231858Sbz} 1042231858Sbz 1043231858Sbztesttx_icmp6_transfernets_gateway() 1044231858Sbz{ 1045231858Sbz 1046231858Sbz testtx_ulp6_transfernets_gateway \ 1047231858Sbz "testtx_icmp6_transfernets_gateway" "-i" 1048231858Sbz} 1049231858Sbz 1050231858Sbz 1051231858Sbztesttx_tcp6_transfernets_gateway() 1052231858Sbz{ 1053231858Sbz 1054231858Sbz testtx_ulp6_transfernets_gateway \ 1055231858Sbz "testtx_tcp6_transfernets_gateway" "" 1056231858Sbz} 1057231858Sbz 1058231858Sbztesttx_udp6_transfernets_gateway() 1059231858Sbz{ 1060231858Sbz 1061231858Sbz testtx_ulp6_transfernets_gateway \ 1062231858Sbz "testtx_udp6_transfernets_gateway" "-u" 1063231858Sbz} 1064231858Sbz 1065231858Sbz 1066231858Sbz################################################################################ 1067231858Sbz# 1068231858Sbz# RX tests (Remotely originated connections). The FIB tests happens on peer. 1069231858Sbz# 1070231858Sbz# # For IPFW, IFCONFIG 1071231858Sbz# # For each FIB 1072231858Sbz# # Send OOB well known to work START, wait for reflect 1073231858Sbz# # Send probe, wait for reply with FIB# or RST/ICMP6 unreach 1074231858Sbz# # (in case of ICMP6 use magic like ipfw count and OOB reply) 1075231858Sbz# # Send OOB well known to work DONE, wait for reflect 1076231858Sbz# # Compare real with expected results. 1077231858Sbz# 1078231858Sbztestrx_results() 1079231858Sbz{ 1080231858Sbz local _r _n _fib i count _instances _transfer _o 1081231858Sbz _fib="$1" 1082231858Sbz _n="$2" 1083231858Sbz _r="$3" 1084231858Sbz _instances=$4 1085231858Sbz _transfer=$5 1086231858Sbz _o="$6" 1087231858Sbz 1088231858Sbz print_debug "testrx_results ${_fib} ${_n} ${_r} ${_instances}" 1089231858Sbz 1090231858Sbz # Trim "RESULT " 1091231858Sbz _r=${_r#* } 1092231858Sbz 1093231858Sbz echo "1..${RT_NUMFIBS}" 1094231858Sbz while read i count; do 1095231858Sbz if test ${_instances} -gt 1; then 1096231858Sbz if test ${count} -gt 0; then 1097231858Sbz echo "ok ${i} ${_n}result_${i} #" \ 1098231858Sbz "FIB ${i} ${count} (tested)" 1099231858Sbz else 1100231858Sbz echo "not ok ${i} ${_n}result_${i} #" \ 1101231858Sbz "FIB ${i} ${count} (tested)" 1102231858Sbz fi 1103231858Sbz else 1104231858Sbz case ${i} in 1105231858Sbz ${_fib}) 1106231858Sbz if test ${count} -gt 0; then 1107231858Sbz echo "ok ${i} ${_n}result_${i} #" \ 1108231858Sbz "FIB ${i} ${count} (tested)" 1109231858Sbz else 1110231858Sbz echo "not ok ${i} ${_n}result_${i} #" \ 1111231858Sbz "FIB ${i} ${count} (tested)" 1112231858Sbz fi 1113231858Sbz ;; 1114231858Sbz *) if test ${count} -eq 0; then 1115231858Sbz echo "ok ${i} ${_n}result_${i} #" \ 1116231858Sbz "FIB ${i} ${count}" 1117231858Sbz else 1118231858Sbz echo "not ok ${i} ${_n}result_${i} #" \ 1119231858Sbz "FIB ${i} ${count}" 1120231858Sbz fi 1121231858Sbz ;; 1122231858Sbz esac 1123231858Sbz fi 1124231858Sbz i=$((i + 1)) 1125231858Sbz done <<EOI 1126231858Sbz`echo "${_r}" | tr ',' '\n'` 1127231858SbzEOI 1128231858Sbz 1129231858Sbz} 1130231858Sbz 1131231858Sbztestrx_tcp_udp() 1132231858Sbz{ 1133231858Sbz local _n _o _f testno i _fibtxt _instances _res _port _transfer _p 1134231858Sbz _n="$1" 1135231858Sbz _o="$2" 1136231858Sbz _f="$3" 1137231858Sbz _instances=$4 1138231858Sbz _transfer=$5 1139231858Sbz 1140231858Sbz # Unused so far. 1141231858Sbz : ${_instances:=1} 1142231858Sbz 1143231858Sbz printf "1..%d\n" `expr 2 \* ${RT_NUMFIBS}` 1144231858Sbz testno=1 1145231858Sbz i=0 1146231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 1147231858Sbz print_debug "Testing ${_f} ${i}" 1148231858Sbz 1149231858Sbz # We are expecting the FIB number (only) to be returned. 1150231858Sbz eval _rc="\${rc_${i}_l}" 1151231858Sbz _fibtxt="${_n}_${i}_l ${_f} ${i} ${PEERLINKLOCAL}" 1152231858Sbz if test ${_instances} -gt 1; then 1153231858Sbz _res="FIB ${i}" 1154231858Sbz _port=$((CTRLPORT + 1000 + i)) 1155231858Sbz else 1156231858Sbz _res="${_fibtxt}" 1157231858Sbz _port=${CTRLPORT} 1158231858Sbz fi 1159231858Sbz nc_send_recv ${i} 1 "${_fibtxt}" "${_res}" ${PEERLINKLOCAL} \ 1160231858Sbz ${_port} "-6 ${_o} -w1" 1161231858Sbz check_rc $? ${_rc} ${testno} "${_fibtxt}" "${_reply}" 1162231858Sbz testno=$((testno + 1)) 1163231858Sbz 1164231858Sbz # If doing multiple transfer networks, replace PEERADDR. 1165231858Sbz _p="${PEERADDR}" 1166231858Sbz case ${_transfer} in 1167231858Sbz 1) PEERADDR=2001:2:${i}::2 ;; 1168231858Sbz esac 1169231858Sbz 1170231858Sbz eval _rc="\${rc_${i}_a}" 1171231858Sbz _fibtxt="${_n}_${i}_a ${_f} ${i} ${PEERADDR}" 1172231858Sbz if test ${_instances} -gt 1; then 1173231858Sbz _res="FIB ${i}" 1174231858Sbz _port=$((CTRLPORT + 1000 + i)) 1175231858Sbz else 1176231858Sbz _res="${_fibtxt}" 1177231858Sbz _port=${CTRLPORT} 1178231858Sbz fi 1179231858Sbz nc_send_recv ${i} 1 "${_fibtxt}" "${_res}" ${PEERADDR} \ 1180231858Sbz ${_port} "-6 ${_o} -w1" 1181231858Sbz check_rc $? ${_rc} ${testno} "${_fibtxt}" "${_reply}" 1182231858Sbz testno=$((testno + 1)) 1183231858Sbz 1184231858Sbz # Restore PEERADDR. 1185231858Sbz PEERADDR="${_p}" 1186231858Sbz 1187231858Sbz i=$((i + 1)) 1188231858Sbz done 1189231858Sbz} 1190231858Sbz 1191231858Sbz 1192231858Sbztestrx_setup_transfer_networks() 1193231858Sbz{ 1194231858Sbz local i 1195231858Sbz 1196231858Sbz i=0 1197231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 1198231858Sbz ifconfig ${IFACE} inet6 2001:2:${i}::1/64 -alias \ 1199231858Sbz > /dev/null 2>&1 || true 1200231858Sbz ifconfig ${IFACE} inet6 2001:2:${i}::1/64 alias 1201231858Sbz i=$((i + 1)) 1202231858Sbz done 1203231858Sbz} 1204231858Sbz 1205231858Sbztestrx_cleanup_transfer_networks() 1206231858Sbz{ 1207231858Sbz local i 1208231858Sbz 1209231858Sbz i=0 1210231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 1211231858Sbz ifconfig ${IFACE} inet6 2001:2:${i}::1/64 -alias \ 1212231858Sbz > /dev/null 2>&1 1213231858Sbz i=$((i + 1)) 1214231858Sbz done 1215231858Sbz} 1216231858Sbz 1217231858Sbz 1218231858Sbztestrx_run_test() 1219231858Sbz{ 1220231858Sbz local _n _t _fib _o _txt _msg i _reply _instances _destructive _transfer 1221231858Sbz _n="$1" 1222231858Sbz _t="$2" 1223231858Sbz _fib=$3 1224231858Sbz _o="$4" 1225231858Sbz _instances=$5 1226231858Sbz _detsructive=$6 1227231858Sbz _transfer=$7 1228231858Sbz 1229231858Sbz # Netcat options (for UDP basically). 1230231858Sbz case "${_o}" in 1231231858Sbz -i) _opts="" ;; # Use TCP for START/DONE. 1232231858Sbz *) _opts="${_o}" ;; 1233231858Sbz esac 1234231858Sbz 1235231858Sbz # Combined test case base name. 1236231858Sbz case ${USE_SOSETFIB} in 1237231858Sbz 0) _f="setfib" ;; 1238231858Sbz 1) _f="so_setfib" ;; 1239231858Sbz *) die "Unexpected value for SO_SETFIB: ${SO_SETFIB}" ;; 1240231858Sbz esac 1241231858Sbz _txt="${_n}_${_f}_${_t}_${_fib}_${_instances}_${_detsructive}_${_transfer}" 1242231858Sbz 1243231858Sbz print_debug "Starting test '${_txt}' (for ${_instances} instances)." 1244231858Sbz 1245231858Sbz case ${_transfer} in 1246231858Sbz 1) testrx_setup_transfer_networks ;; 1247231858Sbz esac 1248231858Sbz 1249231858Sbz # Let the other side a chance to get ready as well. 1250231858Sbz sleep 1 1251231858Sbz 1252231858Sbz set +e 1253231858Sbz # Let peer know that we are about to start. 1254231858Sbz _msg="START ${_txt}" 1255231858Sbz nc_send_recv ${_fib} ${WAITS} "${_msg}" "${_msg}" ${PEERADDR} \ 1256231858Sbz ${CTRLPORT} "-6 ${_opts} -w1" 1257231858Sbz case $? in 1258231858Sbz 0) ;; 1259231858Sbz *) die "Got invalid reply from peer." \ 1260231858Sbz "Expected '${_msg}', got '${_reply}'" ;; 1261231858Sbz esac 1262231858Sbz 1263231858Sbz # Let the other side a chance to get ready as well. 1264231858Sbz sleep 1 1265231858Sbz 1266231858Sbz # Send probe. 1267231858Sbz case "${_o}" in 1268231858Sbz -i) testtx_icmp6 "${_txt}_" ${_transfer} ;; 1269231858Sbz *) testrx_tcp_udp "${_txt}" "${_o}" "${_fib}" ${_instances} \ 1270231858Sbz ${_transfer} ;; 1271231858Sbz esac 1272231858Sbz 1273231858Sbz # Let peer know that we are done with this test to move to next. 1274231858Sbz # This must immediately succeed. 1275231858Sbz _msg="DONE ${_txt}" 1276231858Sbz nc_send_recv ${_fib} ${WAITS} "${_msg}" "${_msg}" ${PEERADDR} \ 1277231858Sbz ${CTRLPORT} "-6 ${_opts} -w1" 1278231858Sbz case $? in 1279231858Sbz 0) ;; 1280231858Sbz *) die "Got invalid reply from peer." \ 1281231858Sbz "Expected '${_msg}', got '${_reply}'" ;; 1282231858Sbz esac 1283231858Sbz 1284231858Sbz # Collect and validate the results. Always use TCP. 1285231858Sbz sleep 1 1286231858Sbz set +e 1287231858Sbz nc_send_recv ${_fib} 1 "RESULT REQUEST" "" ${PEERADDR} \ 1288231858Sbz ${CTRLPORT} "-6 -w1" 1289231858Sbz case "${_reply}" in 1290231858Sbz RESULT\ *) testrx_results ${_fib} "${_txt}_" "${_reply}" ${_instances} \ 1291231858Sbz ${_transfer} "${_o}" 1292231858Sbz ;; 1293231858Sbz *) die "Got invalid reply from peer." \ 1294231858Sbz "Expected 'RESULT ...', got '${_reply}'" ;; 1295231858Sbz esac 1296231858Sbz set -e 1297231858Sbz 1298231858Sbz case ${_transfer} in 1299231858Sbz 1) testrx_cleanup_transfer_networks ;; 1300231858Sbz esac 1301231858Sbz 1302231858Sbz print_debug "Successfully received status update '${_reply}'." 1303231858Sbz} 1304231858Sbz 1305231858Sbztestrx_main_setup_rc() 1306231858Sbz{ 1307231858Sbz local _n _t _fib _o _instances _destructive _transfer i 1308231858Sbz _n="$1" 1309231858Sbz _t="$2" 1310231858Sbz _fib=$3 1311231858Sbz _o="$4" 1312231858Sbz _instances=$5 1313231858Sbz _destructive=$6 1314231858Sbz _transfer=$7 1315231858Sbz 1316231858Sbz # Setup expected return values. 1317231858Sbz if test ${_destructive} -eq 0; then 1318231858Sbz i=0 1319231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 1320231858Sbz eval rc_${i}_l=0 1321231858Sbz eval rc_${i}_a=0 1322231858Sbz i=$((i + 1)) 1323231858Sbz done 1324231858Sbz else 1325231858Sbz i=0 1326231858Sbz while test ${i} -lt ${RT_NUMFIBS}; do 1327231858Sbz eval rc_${i}_l=0 1328231858Sbz case ${i} in 1329231858Sbz ${_fib}) eval rc_${i}_a=0 ;; 1330231858Sbz *) # ICMP6 cannot be distinguished and will 1331231858Sbz # always work in single transfer network. 1332231858Sbz case "${_o}" in 1333231858Sbz -i) case ${_transfer} in 1334231858Sbz 0) eval rc_${i}_a=0 ;; 1335231858Sbz 1) eval rc_${i}_a=1 ;; 1336231858Sbz esac 1337231858Sbz ;; 1338231858Sbz *) if test ${_instances} -eq 1 -a \ 1339231858Sbz ${_transfer} -eq 0; then 1340231858Sbz eval rc_${i}_a=0 1341231858Sbz else 1342231858Sbz eval rc_${i}_a=1 1343231858Sbz fi 1344231858Sbz ;; 1345231858Sbz esac 1346231858Sbz ;; 1347231858Sbz esac 1348231858Sbz i=$((i + 1)) 1349231858Sbz done 1350231858Sbz fi 1351231858Sbz 1352231858Sbz print_debug "${_n}_${t}_${_fib} ${_instances} ${_destructive}" \ 1353231858Sbz "${_transfer}" 1354231858Sbz testrx_run_test "${_n}" "${t}" ${_fib} "${_o}" ${_instances} \ 1355231858Sbz ${_destructive} ${_transfer} 1356231858Sbz} 1357231858Sbz 1358231858Sbztestrx_main() 1359231858Sbz{ 1360232114Sbz local _n _o s t fib _instances _destructive _transfer 1361231858Sbz _n="$1" 1362231858Sbz _o="$2" 1363231858Sbz _instances=$3 1364231858Sbz 1365231858Sbz : ${_instances:=1} 1366231858Sbz 1367231858Sbz print_debug "${_n}" 1368231858Sbz for _transfer in 1 0; do 1369231858Sbz for _destructive in 0 1; do 1370231858Sbz for t in ipfw ifconfig; do 1371231858Sbz 1372231858Sbz print_debug "${_n}_${t}" 1373232114Sbz fib=0 1374232114Sbz while test ${fib} -lt ${RT_NUMFIBS}; do 1375231858Sbz 1376231858Sbz testrx_main_setup_rc "${_n}" "${t}" \ 1377232114Sbz ${fib} "${_o}" ${_instances} \ 1378231858Sbz ${_destructive} ${_transfer} 1379231858Sbz 1380232114Sbz fib=$((fib + 1)) 1381231858Sbz done 1382231858Sbz done 1383231858Sbz done 1384231858Sbz done 1385231858Sbz} 1386231858Sbz 1387231858Sbz################################################################################ 1388231858Sbz# 1389231858Sbz# 1390231858Sbz# 1391231858Sbz 1392231858Sbztestrx_icmp6_same_addr_one_fib_a_time() 1393231858Sbz{ 1394231858Sbz 1395231858Sbz testrx_main \ 1396231858Sbz "testrx_icmp6_same_addr_one_fib_a_time" "-i" 1397231858Sbz} 1398231858Sbz 1399231858Sbztestrx_tcp6_same_addr_one_fib_a_time() 1400231858Sbz{ 1401231858Sbz 1402231858Sbz testrx_main \ 1403231858Sbz "testrx_tcp6_same_addr_one_fib_a_time" "" 1404231858Sbz} 1405231858Sbz 1406231858Sbz 1407231858Sbztestrx_udp6_same_addr_one_fib_a_time() 1408231858Sbz{ 1409231858Sbz 1410231858Sbz testrx_main \ 1411231858Sbz "testrx_udp6_same_addr_one_fib_a_time" "-u" 1412231858Sbz} 1413231858Sbz 1414231858Sbz 1415231858Sbz################################################################################ 1416231858Sbz 1417231858Sbztestrx_tcp6_same_addr_all_fibs_a_time() 1418231858Sbz{ 1419231858Sbz 1420231858Sbz testrx_main \ 1421231858Sbz "testrx_tcp6_same_addr_all_fibs_a_time" "" ${RT_NUMFIBS} 1422231858Sbz} 1423231858Sbz 1424231858Sbztestrx_udp6_same_addr_all_fibs_a_time() 1425231858Sbz{ 1426231858Sbz 1427231858Sbz testrx_main \ 1428231858Sbz "testrx_udp6_same_addr_all_fibs_a_time" "-u" ${RT_NUMFIBS} 1429231858Sbz} 1430231858Sbz 1431231858Sbz 1432231858Sbz################################################################################ 1433231858Sbz# 1434231858Sbz# Prereqs. 1435231858Sbz# 1436232114Sbzif test `sysctl -n security.jail.jailed` -eq 0; then 1437232114Sbz kldload ipfw > /dev/null 2>&1 || kldstat -v | grep -q ipfw 1438231858Sbz 1439232114Sbz # Reduce the time we wait in case of no reply to 2s. 1440232114Sbz sysctl net.inet.tcp.keepinit=2000 > /dev/null 2>&1 1441232114Sbzfi 1442232114Sbzipfw -f flush > /dev/null 2>&1 || die "please load ipfw in base system" 1443232114Sbzipfw add 65000 permit ip from any to any > /dev/null 2>&1 1444231858Sbz 1445231858Sbz################################################################################ 1446231858Sbz# 1447231858Sbz# Run tests. 1448231858Sbz# 1449231858Sbz 1450231858Sbz# 64 cases at 16 FIBs. 1451231858Sbzcheck_local_addr 1452231858Sbzcheck_local_tun 1453231858Sbz 1454231858Sbzsend_greeting 1455231858Sbz 1456231858Sbz# Initiator testing. 1457231858Sbzfor uso in 0 1; do 1458231858Sbz 1459231858Sbz USE_SOSETFIB=${uso} 1460231858Sbz 1461231858Sbz # Only run ICMP6 tests for the first loop. 1462231858Sbz # 160 cases at 16 FIBs. 1463231858Sbz test ${uso} -ne 0 || testtx_icmp6_connected && sleep 1 1464231858Sbz testtx_tcp6_connected && sleep 1 1465231858Sbz testtx_udp6_connected && sleep 1 1466231858Sbz 1467231858Sbz # 2560 cases at 16 FIBs. 1468231858Sbz test ${uso} -ne 0 || testtx_icmp6_connected_blackhole && sleep 1 1469231858Sbz testtx_tcp6_connected_blackhole && sleep 1 1470231858Sbz testtx_udp6_connected_blackhole && sleep 1 1471231858Sbz 1472231858Sbz # 2560 cases at 16 FIBs. 1473231858Sbz test ${uso} -ne 0 || testtx_icmp6_connected_transfernets && sleep 1 1474231858Sbz testtx_tcp6_connected_transfernets && sleep 1 1475231858Sbz testtx_udp6_connected_transfernets && sleep 1 1476231858Sbz 1477231858Sbz # 2560 cases at 16 FIBs. 1478231858Sbz test ${uso} -ne 0 || \ 1479231858Sbz testtx_icmp6_connected_ifconfig_transfernets && sleep 1 1480231858Sbz testtx_tcp6_connected_ifconfig_transfernets && sleep 1 1481231858Sbz testtx_udp6_connected_ifconfig_transfernets && sleep 1 1482231858Sbz 1483231858Sbz # 160 cases at 16 FIBs. 1484231858Sbz test ${uso} -ne 0 || testtx_icmp6_gateway && sleep 1 1485231858Sbz testtx_tcp6_gateway && sleep 1 1486231858Sbz testtx_udp6_gateway && sleep 1 1487231858Sbz 1488231858Sbz # 160 cases at 16 FIBs. 1489231858Sbz test ${uso} -ne 0 || testtx_icmp6_transfernets_gateways && sleep 1 1490231858Sbz testtx_tcp6_transfernets_gateways && sleep 1 1491231858Sbz testtx_udp6_transfernets_gateways && sleep 1 1492231858Sbz 1493231858Sbz # 2560 cases at 16 FIBs. 1494231858Sbz test ${uso} -ne 0 || testtx_icmp6_transfernets_gateway && sleep 1 1495231858Sbz testtx_tcp6_transfernets_gateway && sleep 1 1496231858Sbz testtx_udp6_transfernets_gateway && sleep 1 1497231858Sbzdone 1498231858Sbz 1499232114Sbz# Receiver testing. 1500231858Sbzfor uso in 0 1; do 1501231858Sbz 1502231858Sbz USE_SOSETFIB=${uso} 1503231858Sbz 1504231858Sbz # Only expect ICMP6 tests for the first loop. 1505231858Sbz # 6144 cases at 16 FIBs. 1506231858Sbz test ${uso} -ne 0 || testrx_icmp6_same_addr_one_fib_a_time && sleep 1 1507231858Sbz # 12288 cases at 16 FIBs. 1508231858Sbz testrx_tcp6_same_addr_one_fib_a_time && sleep 1 1509231858Sbz # 12288 cases at 16 FIBs. 1510231858Sbz testrx_udp6_same_addr_one_fib_a_time && sleep 1 1511231858Sbz 1512231858Sbz # 12288 cases at 16 FIBs. 1513231858Sbz testrx_tcp6_same_addr_all_fibs_a_time && sleep 1 1514231858Sbz # 12288 cases at 16 FIBs. 1515231858Sbz testrx_udp6_same_addr_all_fibs_a_time && sleep 1 1516231858Sbz 1517231858Sbzdone 1518231858Sbz 1519231858Sbzcleanup 1520231858Sbz 1521231858Sbz# end 1522