1d3373029SBjoern A. Zeeb#!/bin/sh 2d3373029SBjoern A. Zeeb#- 3d3373029SBjoern A. Zeeb# Copyright (c) 2012 Cisco Systems, Inc. 4d3373029SBjoern A. Zeeb# All rights reserved. 5d3373029SBjoern A. Zeeb# 6d3373029SBjoern A. Zeeb# This software was developed by Bjoern Zeeb under contract to 7d3373029SBjoern A. Zeeb# Cisco Systems, Inc.. 8d3373029SBjoern A. Zeeb# 9d3373029SBjoern A. Zeeb# Redistribution and use in source and binary forms, with or without 10d3373029SBjoern A. Zeeb# modification, are permitted provided that the following conditions 11d3373029SBjoern A. Zeeb# are met: 12d3373029SBjoern A. Zeeb# 1. Redistributions of source code must retain the above copyright 13d3373029SBjoern A. Zeeb# notice, this list of conditions and the following disclaimer. 14d3373029SBjoern A. Zeeb# 2. Redistributions in binary form must reproduce the above copyright 15d3373029SBjoern A. Zeeb# notice, this list of conditions and the following disclaimer in the 16d3373029SBjoern A. Zeeb# documentation and/or other materials provided with the distribution. 17d3373029SBjoern A. Zeeb# 18d3373029SBjoern A. Zeeb# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19d3373029SBjoern A. Zeeb# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20d3373029SBjoern A. Zeeb# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21d3373029SBjoern A. Zeeb# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22d3373029SBjoern A. Zeeb# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23d3373029SBjoern A. Zeeb# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24d3373029SBjoern A. Zeeb# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25d3373029SBjoern A. Zeeb# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26d3373029SBjoern A. Zeeb# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27d3373029SBjoern A. Zeeb# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28d3373029SBjoern A. Zeeb# SUCH DAMAGE. 29d3373029SBjoern A. Zeeb# 30d3373029SBjoern A. Zeeb# 31d3373029SBjoern A. Zeeb 32d3373029SBjoern A. Zeeb# We will use the RFC5180 (and Errata) benchmarking working group prefix 33d3373029SBjoern A. Zeeb# 2001:0002::/48 for testing. 34d3373029SBjoern A. ZeebPREFIX="2001:2:" 35d3373029SBjoern A. Zeeb 36d3373029SBjoern A. Zeeb# Set IFACE to the real interface you want to run the test on. 37d3373029SBjoern A. Zeeb: ${IFACE:=lo0} 38d3373029SBjoern A. Zeeb 39d3373029SBjoern A. Zeeb# Number of seconds to wait for peer node to synchronize for test. 40d3373029SBjoern A. Zeeb: ${WAITS:=120} 41d3373029SBjoern A. Zeeb 42d3373029SBjoern A. Zeeb# Control port we use to exchange messages between nodes to sync. tests, etc. 43d3373029SBjoern A. Zeeb: ${CTRLPORT:=6666} 44d3373029SBjoern A. Zeeb 45d3373029SBjoern A. Zeeb# Get the number of FIBs from the kernel. 46d3373029SBjoern A. ZeebRT_NUMFIBS=`sysctl -n net.fibs` 47d3373029SBjoern A. Zeeb 48d3373029SBjoern A. ZeebOURADDR="2001:2:ff00::1" 49d3373029SBjoern A. ZeebPEERADDR="2001:2:ff00::2" 50d3373029SBjoern A. ZeebPEERLINKLOCAL="" 51d3373029SBjoern A. Zeeb 52d3373029SBjoern A. Zeeb# By default all commands must succeed. Individual tests may disable this 53d3373029SBjoern A. Zeeb# temporary. 54d3373029SBjoern A. Zeebset -e 55d3373029SBjoern A. Zeeb 56d3373029SBjoern A. Zeeb# Debug magic. 57d3373029SBjoern A. Zeebcase "${DEBUG}" in 58d3373029SBjoern A. Zeeb42) set -x ;; 59d3373029SBjoern A. Zeebesac 60d3373029SBjoern A. Zeeb 61d3373029SBjoern A. Zeeb 62d3373029SBjoern A. Zeeb 63d3373029SBjoern A. Zeeb# 64d3373029SBjoern A. Zeeb# Helper functions. 65d3373029SBjoern A. Zeeb# 66d3373029SBjoern A. Zeebcheck_rc() 67d3373029SBjoern A. Zeeb{ 68d3373029SBjoern A. Zeeb local _rc _exp _testno _testname _msg _r 69d3373029SBjoern A. Zeeb _rc=$1 70d3373029SBjoern A. Zeeb _exp=$2 71d3373029SBjoern A. Zeeb _testno=$3 72d3373029SBjoern A. Zeeb _testname="$4" 73d3373029SBjoern A. Zeeb _msg="$5" 74d3373029SBjoern A. Zeeb 75d3373029SBjoern A. Zeeb _r="not ok" 76d3373029SBjoern A. Zeeb if test ${_rc} -eq ${_exp}; then 77d3373029SBjoern A. Zeeb _r="ok" 78d3373029SBjoern A. Zeeb fi 79d3373029SBjoern A. Zeeb echo "${_r} ${_testno} ${_testname} # ${_msg} ${_rc} ${_exp}" 80d3373029SBjoern A. Zeeb} 81d3373029SBjoern A. Zeeb 82d3373029SBjoern A. Zeebprint_debug() 83d3373029SBjoern A. Zeeb{ 84d3373029SBjoern A. Zeeb local _msg 85d3373029SBjoern A. Zeeb _msg="$*" 86d3373029SBjoern A. Zeeb 87d3373029SBjoern A. Zeeb case ${DEBUG} in 88d3373029SBjoern A. Zeeb ''|0) ;; 89d3373029SBjoern A. Zeeb *) echo "DEBUG: ${_msg}" >&2 ;; 90d3373029SBjoern A. Zeeb esac 91d3373029SBjoern A. Zeeb} 92d3373029SBjoern A. Zeeb 93d3373029SBjoern A. Zeebdie() 94d3373029SBjoern A. Zeeb{ 95d3373029SBjoern A. Zeeb local _msg 96d3373029SBjoern A. Zeeb _msg="$*" 97d3373029SBjoern A. Zeeb 98d3373029SBjoern A. Zeeb echo "ERROR: ${_msg}" >&2 99d3373029SBjoern A. Zeeb exit 1 100d3373029SBjoern A. Zeeb} 101d3373029SBjoern A. Zeeb 102d3373029SBjoern A. Zeeb# 103d3373029SBjoern A. Zeeb# Test functions. 104d3373029SBjoern A. Zeeb# 105d3373029SBjoern A. Zeeb 106d3373029SBjoern A. Zeeb# Make sure the local link-local and global addresses are reachable 107d3373029SBjoern A. Zeeb# from all FIBs. 108d3373029SBjoern A. Zeebcheck_local_addr() 109d3373029SBjoern A. Zeeb{ 110d3373029SBjoern A. Zeeb local _l i testno 111d3373029SBjoern A. Zeeb 112d3373029SBjoern A. Zeeb print_debug "Setting up interface ${IFACE}" 113d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 ${OURADDR}/64 alias up 114d3373029SBjoern A. Zeeb _l=`ifconfig ${IFACE} | awk '/inet6 fe80:/ { print $2 }'` 115d3373029SBjoern A. Zeeb 116d3373029SBjoern A. Zeeb # Let things settle. 117d3373029SBjoern A. Zeeb print_debug "Waiting 4 seconds for things to settle" 118d3373029SBjoern A. Zeeb sleep 4 119d3373029SBjoern A. Zeeb 120d3373029SBjoern A. Zeeb printf "1..%d\n" `expr 2 \* ${RT_NUMFIBS}` 121d3373029SBjoern A. Zeeb testno=1 122d3373029SBjoern A. Zeeb i=0 123d3373029SBjoern A. Zeeb set +e 124d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 125d3373029SBjoern A. Zeeb print_debug "Testing FIB ${i}" 126d3373029SBjoern A. Zeeb 127d3373029SBjoern A. Zeeb setfib -F${i} ping6 -n -c1 ${_l} > /dev/null 2>&1 128d3373029SBjoern A. Zeeb check_rc $? 0 ${testno} "check_local_addr_${i}_l" \ 129d3373029SBjoern A. Zeeb "FIB ${i} ${_l}" 130d3373029SBjoern A. Zeeb testno=$((testno + 1)) 131d3373029SBjoern A. Zeeb 132d3373029SBjoern A. Zeeb setfib -F${i} ping6 -n -c1 ${OURADDR} > /dev/null 2>&1 133d3373029SBjoern A. Zeeb check_rc $? 0 ${testno} "check_local_addr_${i}_a" \ 134d3373029SBjoern A. Zeeb "FIB ${i} ${OURADDR}" 135d3373029SBjoern A. Zeeb testno=$((testno + 1)) 136d3373029SBjoern A. Zeeb 137d3373029SBjoern A. Zeeb i=$((i + 1)) 138d3373029SBjoern A. Zeeb done 139d3373029SBjoern A. Zeeb set -e 140d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 ${OURADDR}/64 -alias 141d3373029SBjoern A. Zeeb} 142d3373029SBjoern A. Zeeb 143d3373029SBjoern A. Zeeb 144d3373029SBjoern A. Zeeb# Cloned tun(4) devices behave differently on FIB 0 vs. FIB 1..n after creation 145d3373029SBjoern A. Zeeb# (they also do in IPv4). 146d3373029SBjoern A. Zeebcheck_local_tun() 147d3373029SBjoern A. Zeeb{ 148d3373029SBjoern A. Zeeb local _l i testno IFACE _msg 149d3373029SBjoern A. Zeeb 150d3373029SBjoern A. Zeeb IFACE=tun42 151d3373029SBjoern A. Zeeb print_debug "Setting up interface ${IFACE}" 152d3373029SBjoern A. Zeeb ifconfig ${IFACE} create 153d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 ${OURADDR}/64 alias up 154d3373029SBjoern A. Zeeb _l=`ifconfig ${IFACE} | awk '/inet6 fe80:/ { print $2 }'` 155d3373029SBjoern A. Zeeb 156d3373029SBjoern A. Zeeb # Let things settle. 157d3373029SBjoern A. Zeeb print_debug "Waiting 4 seconds for things to settle" 158d3373029SBjoern A. Zeeb sleep 4 159d3373029SBjoern A. Zeeb 160d3373029SBjoern A. Zeeb printf "1..%d\n" `expr 2 \* ${RT_NUMFIBS}` 161d3373029SBjoern A. Zeeb testno=1 162d3373029SBjoern A. Zeeb _msg="" 163d3373029SBjoern A. Zeeb i=0 164d3373029SBjoern A. Zeeb set +e 165d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 166d3373029SBjoern A. Zeeb print_debug "Testing FIB ${i}" 167d3373029SBjoern A. Zeeb if test ${i} -gt 0; then 168d3373029SBjoern A. Zeeb # Flag the well known behaviour as such. 169d3373029SBjoern A. Zeeb _msg="TODO " 170d3373029SBjoern A. Zeeb fi 171d3373029SBjoern A. Zeeb 172d3373029SBjoern A. Zeeb setfib -F${i} ping6 -n -c1 ${_l} > /dev/null 2>&1 173d3373029SBjoern A. Zeeb check_rc $? 0 ${testno} "check_local_addr_${i}_l" \ 174d3373029SBjoern A. Zeeb "${_msg}FIB ${i} ${_l}" 175d3373029SBjoern A. Zeeb testno=$((testno + 1)) 176d3373029SBjoern A. Zeeb 177d3373029SBjoern A. Zeeb setfib -F${i} ping6 -n -c1 ${OURADDR} > /dev/null 2>&1 178d3373029SBjoern A. Zeeb check_rc $? 0 ${testno} "check_local_addr_${i}_a" \ 179d3373029SBjoern A. Zeeb "${_msg}FIB ${i} ${OURADDR}" 180d3373029SBjoern A. Zeeb testno=$((testno + 1)) 181d3373029SBjoern A. Zeeb 182d3373029SBjoern A. Zeeb i=$((i + 1)) 183d3373029SBjoern A. Zeeb done 184d3373029SBjoern A. Zeeb set -e 185d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 ${OURADDR}/64 -alias 186d3373029SBjoern A. Zeeb ifconfig ${IFACE} destroy 187d3373029SBjoern A. Zeeb} 188d3373029SBjoern A. Zeeb 189d3373029SBjoern A. Zeebcheck_remote_up() 190d3373029SBjoern A. Zeeb{ 191d3373029SBjoern A. Zeeb local _l i testno 192d3373029SBjoern A. Zeeb 193d3373029SBjoern A. Zeeb print_debug "Setting up interface ${IFACE}" 194d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 ${OURADDR}/64 alias up 195d3373029SBjoern A. Zeeb _l=`ifconfig ${IFACE} | awk '/inet6 fe80:/ { print $2 }'` 196d3373029SBjoern A. Zeeb 197d3373029SBjoern A. Zeeb # Let things settle. 198d3373029SBjoern A. Zeeb print_debug "Waiting 4 seconds for things to settle" 199d3373029SBjoern A. Zeeb sleep 4 200d3373029SBjoern A. Zeeb 201d3373029SBjoern A. Zeeb 202d3373029SBjoern A. Zeeb 203d3373029SBjoern A. Zeeb} 204d3373029SBjoern A. Zeeb 205d3373029SBjoern A. Zeebsend_greeting() 206d3373029SBjoern A. Zeeb{ 207d3373029SBjoern A. Zeeb local _l _greeting _keyword _fib _fibs _linklocal 208d3373029SBjoern A. Zeeb 209d3373029SBjoern A. Zeeb print_debug "Setting up interface ${IFACE}" 210d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 ${OURADDR}/64 alias up 211d3373029SBjoern A. Zeeb _l=`ifconfig ${IFACE} | awk '/inet6 fe80:/ { print $2 }'` 212d3373029SBjoern A. Zeeb 213d3373029SBjoern A. Zeeb # Let things settle. 214d3373029SBjoern A. Zeeb print_debug "Waiting 4 seconds for things to settle" 215d3373029SBjoern A. Zeeb sleep 4 216d3373029SBjoern A. Zeeb 217d3373029SBjoern A. Zeeb # Cleanup firewall and install rules to always allow NS/NA to succeed. 218d3373029SBjoern A. Zeeb # The latter is needed to allow indvidiual less specific later rules 219d3373029SBjoern A. Zeeb # from test cases to just disallow any IPv6 traffic on a matching FIB. 220d3373029SBjoern A. Zeeb ipfw -f flush > /dev/null 2>&1 2210e7ed5d6SBjoern A. Zeeb ipfw add 65000 permit ip from any to any > /dev/null 2>&1 222d3373029SBjoern A. Zeeb ipfw add 5 permit ipv6-icmp from any to any icmp6types 135,136 fib 0 \ 223d3373029SBjoern A. Zeeb via ${IFACE} out > /dev/null 2>&1 224d3373029SBjoern A. Zeeb 225d3373029SBjoern A. Zeeb set +e 226d3373029SBjoern A. Zeeb i=0 227d3373029SBjoern A. Zeeb rc=-1 228d3373029SBjoern A. Zeeb while test ${i} -lt ${WAITS} -a ${rc} -ne 0; do 229d3373029SBjoern A. Zeeb print_debug "Sending greeting #${i} to peer" 230d3373029SBjoern A. Zeeb _greeting=`echo "SETUP ${RT_NUMFIBS} ${_l}" | \ 231d3373029SBjoern A. Zeeb nc -6 -w 1 ${PEERADDR} ${CTRLPORT}` 232d3373029SBjoern A. Zeeb rc=$? 233d3373029SBjoern A. Zeeb i=$((i + 1)) 234d3373029SBjoern A. Zeeb # Might sleep longer in total but better than to DoS 235d3373029SBjoern A. Zeeb # and not get anywhere. 236d3373029SBjoern A. Zeeb sleep 1 237d3373029SBjoern A. Zeeb done 238d3373029SBjoern A. Zeeb set -e 239d3373029SBjoern A. Zeeb 240d3373029SBjoern A. Zeeb read _keyword _fibs _linklocal <<EOI 241d3373029SBjoern A. Zeeb${_greeting} 242d3373029SBjoern A. ZeebEOI 243d3373029SBjoern A. Zeeb print_debug "_keyword=${_keyword}" 244d3373029SBjoern A. Zeeb print_debug "_fibs=${_fibs}" 245d3373029SBjoern A. Zeeb print_debug "_linklocal=${_linklocal}" 246d3373029SBjoern A. Zeeb case ${_keyword} in 247d3373029SBjoern A. Zeeb SETUP) ;; 248d3373029SBjoern A. Zeeb *) die "Got invalid keyword in greeting: ${_greeting}" 249d3373029SBjoern A. Zeeb ;; 250d3373029SBjoern A. Zeeb esac 251d3373029SBjoern A. Zeeb if test ${_fibs} -ne ${RT_NUMFIBS}; then 252d3373029SBjoern A. Zeeb die "Number of FIBs not matching ours (${RT_NUMFIBS}) in" \ 253d3373029SBjoern A. Zeeb "greeting: ${_greeting}" 254d3373029SBjoern A. Zeeb fi 255d3373029SBjoern A. Zeeb PEERLINKLOCAL=${_linklocal} 256d3373029SBjoern A. Zeeb 257d3373029SBjoern A. Zeeb # Swap the zoneid to the local interface scope. 2580e7ed5d6SBjoern A. Zeeb PEERLINKLOCAL=${PEERLINKLOCAL%%\%*}"%${IFACE}" 259d3373029SBjoern A. Zeeb 260d3373029SBjoern A. Zeeb print_debug "Successfully exchanged greeting. Peer at ${PEERLINKLOCAL}" 261d3373029SBjoern A. Zeeb} 262d3373029SBjoern A. Zeeb 263d3373029SBjoern A. Zeebcleanup() 264d3373029SBjoern A. Zeeb{ 265d3373029SBjoern A. Zeeb 266d3373029SBjoern A. Zeeb # Cleanup ipfw. 267d3373029SBjoern A. Zeeb ipfw delete 5 > /dev/null 2>&1 268d3373029SBjoern A. Zeeb 269d3373029SBjoern A. Zeeb print_debug "Removing address from interface ${IFACE}" 270d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 ${OURADDR}/64 -alias 271d3373029SBjoern A. Zeeb} 272d3373029SBjoern A. Zeeb 273d3373029SBjoern A. Zeebtesttx_icmp6() 274d3373029SBjoern A. Zeeb{ 275d3373029SBjoern A. Zeeb local _n _transfer i testno _txt _fibtxt _rc _ec _p 276d3373029SBjoern A. Zeeb _n="$1" 277d3373029SBjoern A. Zeeb _transfer=$2 278d3373029SBjoern A. Zeeb 279d3373029SBjoern A. Zeeb printf "1..%d\n" `expr 2 \* ${RT_NUMFIBS}` 280d3373029SBjoern A. Zeeb testno=1 281d3373029SBjoern A. Zeeb set +e 282d3373029SBjoern A. Zeeb i=0 283d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 284d3373029SBjoern A. Zeeb _txt="${_n}${i}" 285d3373029SBjoern A. Zeeb print_debug "Testing ${_txt}" 286d3373029SBjoern A. Zeeb _fibtxt=`echo "${_txt}" | hd -v | cut -b11-60 | tr -d ' \r\n'` 287d3373029SBjoern A. Zeeb 288d3373029SBjoern A. Zeeb eval _rc="\${rc_${i}_l}" 289d3373029SBjoern A. Zeeb setfib -F${i} ping6 -n -c1 -p ${_fibtxt} \ 290d3373029SBjoern A. Zeeb ${PEERLINKLOCAL} > /dev/null 2>&1 291d3373029SBjoern A. Zeeb _ec=$? 292d3373029SBjoern A. Zeeb # We need to normalize the exit code of ping6. 293d3373029SBjoern A. Zeeb case ${_ec} in 294d3373029SBjoern A. Zeeb 0) ;; 295d3373029SBjoern A. Zeeb *) _ec=1 ;; 296d3373029SBjoern A. Zeeb esac 297d3373029SBjoern A. Zeeb check_rc ${_ec} ${_rc} ${testno} "${_txt}_l" \ 298d3373029SBjoern A. Zeeb "FIB ${i} ${PEERLINKLOCAL}" 299d3373029SBjoern A. Zeeb testno=$((testno + 1)) 300d3373029SBjoern A. Zeeb 301d3373029SBjoern A. Zeeb # If doing multiple transfer networks, replace PEERADDR. 302d3373029SBjoern A. Zeeb _p="${PEERADDR}" 303d3373029SBjoern A. Zeeb case ${_transfer} in 304d3373029SBjoern A. Zeeb 1) PEERADDR=2001:2:${i}::2 ;; 305d3373029SBjoern A. Zeeb esac 306d3373029SBjoern A. Zeeb 307d3373029SBjoern A. Zeeb eval _rc="\${rc_${i}_a}" 308d3373029SBjoern A. Zeeb setfib -F${i} ping6 -n -c1 -p ${_fibtxt} ${PEERADDR} \ 309d3373029SBjoern A. Zeeb > /dev/null 2>&1 310d3373029SBjoern A. Zeeb _ec=$? 311d3373029SBjoern A. Zeeb # We need to normalize the exit code of ping6. 312d3373029SBjoern A. Zeeb case ${_ec} in 313d3373029SBjoern A. Zeeb 0) ;; 314d3373029SBjoern A. Zeeb *) _ec=1 ;; 315d3373029SBjoern A. Zeeb esac 316d3373029SBjoern A. Zeeb check_rc ${_ec} ${_rc} ${testno} "${_txt}_a" \ 317d3373029SBjoern A. Zeeb "FIB ${i} ${PEERADDR}" 318d3373029SBjoern A. Zeeb testno=$((testno + 1)) 319d3373029SBjoern A. Zeeb 320d3373029SBjoern A. Zeeb # Restore PEERADDR. 321d3373029SBjoern A. Zeeb PEERADDR="${_p}" 322d3373029SBjoern A. Zeeb 323d3373029SBjoern A. Zeeb i=$((i + 1)) 324d3373029SBjoern A. Zeeb done 325d3373029SBjoern A. Zeeb set -e 326d3373029SBjoern A. Zeeb} 327d3373029SBjoern A. Zeeb 328d3373029SBjoern A. Zeebnc_send_recv() 329d3373029SBjoern A. Zeeb{ 330d3373029SBjoern A. Zeeb local _fib _loops _msg _expreply _addr _port _opts i 331d3373029SBjoern A. Zeeb _fib=$1 332d3373029SBjoern A. Zeeb _loops=$2 333d3373029SBjoern A. Zeeb _msg="$3" 334d3373029SBjoern A. Zeeb _expreply="$4" 335d3373029SBjoern A. Zeeb _addr=$5 336d3373029SBjoern A. Zeeb _port=$6 337d3373029SBjoern A. Zeeb _opts="$7" 338d3373029SBjoern A. Zeeb 339d3373029SBjoern A. Zeeb i=0 340d3373029SBjoern A. Zeeb while test ${i} -lt ${_loops}; do 341d3373029SBjoern A. Zeeb i=$((i + 1)) 342d3373029SBjoern A. Zeeb case "${USE_SOSETFIB}" in 343d3373029SBjoern A. Zeeb 1) 344d3373029SBjoern A. Zeeb _reply=`echo "${_msg}" | \ 345d3373029SBjoern A. Zeeb nc -V ${_fib} ${_opts} ${_addr} ${_port}` 346d3373029SBjoern A. Zeeb ;; 347d3373029SBjoern A. Zeeb *) 348d3373029SBjoern A. Zeeb _reply=`echo "${_msg}" | \ 349d3373029SBjoern A. Zeeb setfib -F${_fib} nc ${_opts} ${_addr} ${_port}` 350d3373029SBjoern A. Zeeb ;; 351d3373029SBjoern A. Zeeb esac 352d3373029SBjoern A. Zeeb if test "${_reply}" != "${_expreply}"; then 353d3373029SBjoern A. Zeeb if test ${i} -lt ${_loops}; then 354d3373029SBjoern A. Zeeb sleep 1 355d3373029SBjoern A. Zeeb else 356d3373029SBjoern A. Zeeb # Must let caller decide how to handle the error. 357d3373029SBjoern A. Zeeb # die "Got invalid reply from peer." \ 358d3373029SBjoern A. Zeeb # "Expected '${_expreply}', got '${_reply}'" 359d3373029SBjoern A. Zeeb return 1 360d3373029SBjoern A. Zeeb fi 361d3373029SBjoern A. Zeeb else 362d3373029SBjoern A. Zeeb break 363d3373029SBjoern A. Zeeb fi 364d3373029SBjoern A. Zeeb done 365d3373029SBjoern A. Zeeb return 0 366d3373029SBjoern A. Zeeb} 367d3373029SBjoern A. Zeeb 368d3373029SBjoern A. Zeebtesttx_tcp_udp() 369d3373029SBjoern A. Zeeb{ 370d3373029SBjoern A. Zeeb local _n _o _f testno i _fibtxt 371d3373029SBjoern A. Zeeb _n="$1" 372d3373029SBjoern A. Zeeb _o="$2" 373d3373029SBjoern A. Zeeb _f="$3" 374d3373029SBjoern A. Zeeb 375d3373029SBjoern A. Zeeb printf "1..%d\n" `expr 2 \* ${RT_NUMFIBS}` 376d3373029SBjoern A. Zeeb testno=1 377d3373029SBjoern A. Zeeb i=0 378d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 379d3373029SBjoern A. Zeeb print_debug "Testing ${_f} ${i}" 380d3373029SBjoern A. Zeeb 381d3373029SBjoern A. Zeeb eval _rc="\${rc_${i}_l}" 382d3373029SBjoern A. Zeeb _fibtxt="${_n}_${i}_l ${_f} ${i} ${PEERLINKLOCAL}" 383d3373029SBjoern A. Zeeb nc_send_recv ${i} 1 "${_fibtxt}" "${_fibtxt}" ${PEERLINKLOCAL} \ 384d3373029SBjoern A. Zeeb ${CTRLPORT} "-6 ${_o} -w1" 385d3373029SBjoern A. Zeeb check_rc $? ${_rc} ${testno} "${_fibtxt}" 386d3373029SBjoern A. Zeeb testno=$((testno + 1)) 387d3373029SBjoern A. Zeeb 388d3373029SBjoern A. Zeeb eval _rc="\${rc_${i}_a}" 389d3373029SBjoern A. Zeeb _fibtxt="${_n}_${i}_a ${_f} ${i} ${PEERADDR}" 390d3373029SBjoern A. Zeeb nc_send_recv ${i} 1 "${_fibtxt}" "${_fibtxt}" ${PEERADDR} \ 391d3373029SBjoern A. Zeeb ${CTRLPORT} "-6 ${_o} -w1" 392d3373029SBjoern A. Zeeb check_rc $? ${_rc} ${testno} "${_fibtxt}" 393d3373029SBjoern A. Zeeb testno=$((testno + 1)) 394d3373029SBjoern A. Zeeb 395d3373029SBjoern A. Zeeb i=$((i + 1)) 396d3373029SBjoern A. Zeeb done 397d3373029SBjoern A. Zeeb} 398d3373029SBjoern A. Zeeb 399d3373029SBjoern A. Zeeb# setfib TCP|UDP/IPv6 test on link-local and global address of peer from all FIBs. 400d3373029SBjoern A. Zeebtesttx_ulp6_connected() 401d3373029SBjoern A. Zeeb{ 402d3373029SBjoern A. Zeeb local _fibtxt _reply _n _o _rc _fib _f _opts 403d3373029SBjoern A. Zeeb _n=$1 404d3373029SBjoern A. Zeeb _o="$2" 405d3373029SBjoern A. Zeeb _fib=$3 406d3373029SBjoern A. Zeeb 407d3373029SBjoern A. Zeeb case "${USE_SOSETFIB}" in 408d3373029SBjoern A. Zeeb 1) _f="SO_SETFIB" ;; 409d3373029SBjoern A. Zeeb *) _f="SETFIB" ;; 410d3373029SBjoern A. Zeeb esac 411d3373029SBjoern A. Zeeb 412*2460e894SBjoern A. Zeeb if test "${_o}" = "-i" -a "${_f}" = "SO_SETFIB"; then 413d3373029SBjoern A. Zeeb print_debug "Skipping icmp6 tests for SO_SETFIB." 414d3373029SBjoern A. Zeeb return 0 415d3373029SBjoern A. Zeeb fi 416d3373029SBjoern A. Zeeb 417d3373029SBjoern A. Zeeb # Clear the neighbor table to get deterministic runs. 418d3373029SBjoern A. Zeeb ndp -cn > /dev/null 2>&1 419d3373029SBjoern A. Zeeb 420d3373029SBjoern A. Zeeb case "${_o}" in 421d3373029SBjoern A. Zeeb -i) _opts="" ;; # Use TCP for START/DONE. 422d3373029SBjoern A. Zeeb *) _opts="${_o}" ;; 423d3373029SBjoern A. Zeeb esac 424d3373029SBjoern A. Zeeb 425d3373029SBjoern A. Zeeb set +e 426d3373029SBjoern A. Zeeb # Let peer know that we are about to start. 427d3373029SBjoern A. Zeeb _msg="START ${_n}" 428d3373029SBjoern A. Zeeb nc_send_recv ${_fib} ${WAITS} "${_msg}" "${_msg}" ${PEERADDR} \ 429d3373029SBjoern A. Zeeb ${CTRLPORT} "-6 ${_opts} -w1" 430d3373029SBjoern A. Zeeb case $? in 431d3373029SBjoern A. Zeeb 0) ;; 432d3373029SBjoern A. Zeeb *) die "Got invalid reply from peer." \ 433d3373029SBjoern A. Zeeb "Expected '${_msg}', got '${_reply}'" ;; 434d3373029SBjoern A. Zeeb esac 435d3373029SBjoern A. Zeeb 436d3373029SBjoern A. Zeeb case "${_o}" in 437d3373029SBjoern A. Zeeb -i) testtx_icmp6 "${_n}" ;; 438d3373029SBjoern A. Zeeb *) testtx_tcp_udp "${_n}" "${_o}" "${_f}" ;; 439d3373029SBjoern A. Zeeb esac 440d3373029SBjoern A. Zeeb 441d3373029SBjoern A. Zeeb # Let peer know that we are done with this test to move to next. 442d3373029SBjoern A. Zeeb # This must immediately succeed. 443d3373029SBjoern A. Zeeb _msg="DONE ${_n}" 444d3373029SBjoern A. Zeeb nc_send_recv ${_fib} ${WAITS} "${_msg}" "${_msg}" ${PEERADDR} \ 445d3373029SBjoern A. Zeeb ${CTRLPORT} "-6 ${_opts} -w1" 446d3373029SBjoern A. Zeeb case $? in 447d3373029SBjoern A. Zeeb 0) ;; 448d3373029SBjoern A. Zeeb *) die "Got invalid reply from peer." \ 449d3373029SBjoern A. Zeeb "Expected '${_msg}', got '${_reply}'" ;; 450d3373029SBjoern A. Zeeb esac 451d3373029SBjoern A. Zeeb set -e 452d3373029SBjoern A. Zeeb 453d3373029SBjoern A. Zeeb print_debug "Successfully received status update '${_reply}'." 454d3373029SBjoern A. Zeeb} 455d3373029SBjoern A. Zeeb 456d3373029SBjoern A. Zeeb################################################################################ 457d3373029SBjoern A. Zeeb# 458d3373029SBjoern A. Zeeb# ping6|TCP/UDP connect link-local and global address of peer from all FIBs. 459d3373029SBjoern A. Zeeb# Default reachability test. 460d3373029SBjoern A. Zeeb# 461d3373029SBjoern A. Zeebtesttx_icmp6_connected() 462d3373029SBjoern A. Zeeb{ 463d3373029SBjoern A. Zeeb local i 464d3373029SBjoern A. Zeeb 465d3373029SBjoern A. Zeeb # Setup expected return values. 466d3373029SBjoern A. Zeeb i=0 467d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 468d3373029SBjoern A. Zeeb eval rc_${i}_l=0 469d3373029SBjoern A. Zeeb eval rc_${i}_a=0 470d3373029SBjoern A. Zeeb i=$((i + 1)) 471d3373029SBjoern A. Zeeb done 472d3373029SBjoern A. Zeeb 473d3373029SBjoern A. Zeeb testtx_ulp6_connected "testtx_icmp6_connected" "-i" 0 474d3373029SBjoern A. Zeeb} 475d3373029SBjoern A. Zeeb 476d3373029SBjoern A. Zeebtesttx_tcp6_connected() 477d3373029SBjoern A. Zeeb{ 478d3373029SBjoern A. Zeeb local i 479d3373029SBjoern A. Zeeb 480d3373029SBjoern A. Zeeb # Setup expected return values. 481d3373029SBjoern A. Zeeb i=0 482d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 483d3373029SBjoern A. Zeeb eval rc_${i}_l=0 484d3373029SBjoern A. Zeeb eval rc_${i}_a=0 485d3373029SBjoern A. Zeeb i=$((i + 1)) 486d3373029SBjoern A. Zeeb done 487d3373029SBjoern A. Zeeb 488d3373029SBjoern A. Zeeb testtx_ulp6_connected testtx_tcp6_connected "" 0 489d3373029SBjoern A. Zeeb} 490d3373029SBjoern A. Zeeb 491d3373029SBjoern A. Zeebtesttx_udp6_connected() 492d3373029SBjoern A. Zeeb{ 493d3373029SBjoern A. Zeeb local i 494d3373029SBjoern A. Zeeb 495d3373029SBjoern A. Zeeb # Setup expected return values. 496d3373029SBjoern A. Zeeb i=0 497d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 498d3373029SBjoern A. Zeeb eval rc_${i}_l=0 499d3373029SBjoern A. Zeeb eval rc_${i}_a=0 500d3373029SBjoern A. Zeeb i=$((i + 1)) 501d3373029SBjoern A. Zeeb done 502d3373029SBjoern A. Zeeb 503d3373029SBjoern A. Zeeb testtx_ulp6_connected testtx_udp6_connected "-u" 0 504d3373029SBjoern A. Zeeb} 505d3373029SBjoern A. Zeeb 506d3373029SBjoern A. Zeeb################################################################################ 507d3373029SBjoern A. Zeeb# 508d3373029SBjoern A. Zeeb# Use ipfw to return unreach messages for all but one FIB. Rotate over all. 509d3373029SBjoern A. Zeeb# Making sure error messages are properly returned. 510d3373029SBjoern A. Zeeb# 511d3373029SBjoern A. Zeebtesttx_ulp6_connected_blackhole() 512d3373029SBjoern A. Zeeb{ 5130e7ed5d6SBjoern A. Zeeb local fib i _n _o 514d3373029SBjoern A. Zeeb _n="$1" 515d3373029SBjoern A. Zeeb _o="$2" 516d3373029SBjoern A. Zeeb 5170e7ed5d6SBjoern A. Zeeb fib=0 5180e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 519d3373029SBjoern A. Zeeb 5200e7ed5d6SBjoern A. Zeeb print_debug "${_n} ${fib}" 521d3373029SBjoern A. Zeeb 522d3373029SBjoern A. Zeeb # Setup expected return values. 523d3373029SBjoern A. Zeeb i=0 524d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 525d3373029SBjoern A. Zeeb ipfw delete $((100 + i)) > /dev/null 2>&1 || true 526d3373029SBjoern A. Zeeb case ${i} in 5270e7ed5d6SBjoern A. Zeeb ${fib}) 528d3373029SBjoern A. Zeeb eval rc_${i}_l=0 529d3373029SBjoern A. Zeeb eval rc_${i}_a=0 530d3373029SBjoern A. Zeeb ;; 531d3373029SBjoern A. Zeeb *) eval rc_${i}_l=1 532d3373029SBjoern A. Zeeb eval rc_${i}_a=1 533d3373029SBjoern A. Zeeb ipfw add $((100 + i)) unreach6 admin-prohib \ 534d3373029SBjoern A. Zeeb ip6 from any to any fib ${i} via ${IFACE} \ 535d3373029SBjoern A. Zeeb out > /dev/null 2>&1 536d3373029SBjoern A. Zeeb ;; 537d3373029SBjoern A. Zeeb esac 538d3373029SBjoern A. Zeeb i=$((i + 1)) 539d3373029SBjoern A. Zeeb done 540d3373029SBjoern A. Zeeb 5410e7ed5d6SBjoern A. Zeeb testtx_ulp6_connected "${_n}${fib}" "${_o}" ${fib} 542d3373029SBjoern A. Zeeb case ${DEBUG} in 543d3373029SBjoern A. Zeeb ''|0) ;; 544d3373029SBjoern A. Zeeb *) ipfw show ;; 545d3373029SBjoern A. Zeeb esac 5460e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 547d3373029SBjoern A. Zeeb done 5480e7ed5d6SBjoern A. Zeeb fib=0 5490e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 5500e7ed5d6SBjoern A. Zeeb ipfw delete $((100 + fib)) > /dev/null 2>&1 || true 5510e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 552d3373029SBjoern A. Zeeb done 553d3373029SBjoern A. Zeeb} 554d3373029SBjoern A. Zeeb 555d3373029SBjoern A. Zeebtesttx_icmp6_connected_blackhole() 556d3373029SBjoern A. Zeeb{ 557d3373029SBjoern A. Zeeb 558d3373029SBjoern A. Zeeb testtx_ulp6_connected_blackhole \ 559d3373029SBjoern A. Zeeb "testtx_icmp6_connected_blackhole" "-i" 560d3373029SBjoern A. Zeeb} 561d3373029SBjoern A. Zeeb 562d3373029SBjoern A. Zeebtesttx_tcp6_connected_blackhole() 563d3373029SBjoern A. Zeeb{ 564d3373029SBjoern A. Zeeb 565d3373029SBjoern A. Zeeb testtx_ulp6_connected_blackhole \ 566d3373029SBjoern A. Zeeb "testtx_tcp6_connected_blackhole" "" 567d3373029SBjoern A. Zeeb} 568d3373029SBjoern A. Zeeb 569d3373029SBjoern A. Zeebtesttx_udp6_connected_blackhole() 570d3373029SBjoern A. Zeeb{ 571d3373029SBjoern A. Zeeb 572d3373029SBjoern A. Zeeb testtx_ulp6_connected_blackhole \ 573d3373029SBjoern A. Zeeb "testtx_udp6_connected_blackhole" "-u" 574d3373029SBjoern A. Zeeb} 575d3373029SBjoern A. Zeeb 576d3373029SBjoern A. Zeeb################################################################################ 577d3373029SBjoern A. Zeeb# 578d3373029SBjoern A. Zeeb# Setup a different transfer net on each FIB. Delete all but one connected 579d3373029SBjoern A. Zeeb# route in all FIBs (e.g. FIB 0 uses prefix 0, FIB 1 uses prefix 1 , ...). 580d3373029SBjoern A. Zeeb# 581d3373029SBjoern A. Zeeb# Need to tag NS/NA incoming to the right FIB given the default FIB does not 582d3373029SBjoern A. Zeeb# know about the prefix and thus cannot do proper source address lookups for 583d3373029SBjoern A. Zeeb# replying otherwise. Use ipfw. 584d3373029SBjoern A. Zeeb# 585d3373029SBjoern A. Zeebtesttx_ulp6_connected_transfernets() 586d3373029SBjoern A. Zeeb{ 5870e7ed5d6SBjoern A. Zeeb local fib i _n _o _p 588d3373029SBjoern A. Zeeb _n="$1" 589d3373029SBjoern A. Zeeb _o="$2" 590d3373029SBjoern A. Zeeb 591d3373029SBjoern A. Zeeb # Setup transfer networks and firewall. 592d3373029SBjoern A. Zeeb ipfw delete 10 > /dev/null 2>&1 || true 5930e7ed5d6SBjoern A. Zeeb fib=0 5940e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 5950e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias \ 596d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 5970e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 alias 5980e7ed5d6SBjoern A. Zeeb ipfw add 10 setfib ${fib} ipv6-icmp from 2001:2:${fib}::/64 \ 599d3373029SBjoern A. Zeeb to any ip6 icmp6types 135,136 via ${IFACE} in \ 600d3373029SBjoern A. Zeeb > /dev/null 2>&1 601d3373029SBjoern A. Zeeb # Remove connected routes from all but matching FIB. 602d3373029SBjoern A. Zeeb i=0 603d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 604d3373029SBjoern A. Zeeb case ${i} in 6050e7ed5d6SBjoern A. Zeeb ${fib});; 606d3373029SBjoern A. Zeeb *) setfib -F${i} route delete -inet6 \ 6070e7ed5d6SBjoern A. Zeeb -net 2001:2:${fib}:: > /dev/null 2>&1 608d3373029SBjoern A. Zeeb ;; 609d3373029SBjoern A. Zeeb esac 610d3373029SBjoern A. Zeeb i=$((i + 1)) 611d3373029SBjoern A. Zeeb done 6120e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 613d3373029SBjoern A. Zeeb done 614d3373029SBjoern A. Zeeb 615d3373029SBjoern A. Zeeb # Save PEERADDR 616d3373029SBjoern A. Zeeb _p=${PEERADDR} 617d3373029SBjoern A. Zeeb 618d3373029SBjoern A. Zeeb # Run tests. 6190e7ed5d6SBjoern A. Zeeb fib=0 6200e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 6210e7ed5d6SBjoern A. Zeeb PEERADDR=2001:2:${fib}::2 622d3373029SBjoern A. Zeeb 6230e7ed5d6SBjoern A. Zeeb print_debug "${_n} ${fib}" 624d3373029SBjoern A. Zeeb 625d3373029SBjoern A. Zeeb # Setup expected return values. 626d3373029SBjoern A. Zeeb i=0 627d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 628d3373029SBjoern A. Zeeb eval rc_${i}_l=0 629d3373029SBjoern A. Zeeb case ${i} in 6300e7ed5d6SBjoern A. Zeeb ${fib}) 631d3373029SBjoern A. Zeeb eval rc_${i}_a=0 632d3373029SBjoern A. Zeeb ;; 633d3373029SBjoern A. Zeeb *) eval rc_${i}_a=1 634d3373029SBjoern A. Zeeb ;; 635d3373029SBjoern A. Zeeb esac 636d3373029SBjoern A. Zeeb i=$((i + 1)) 637d3373029SBjoern A. Zeeb done 638d3373029SBjoern A. Zeeb 6390e7ed5d6SBjoern A. Zeeb testtx_ulp6_connected "${_n}${fib}" "${_o}" ${fib} 6400e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 641d3373029SBjoern A. Zeeb done 642d3373029SBjoern A. Zeeb 643d3373029SBjoern A. Zeeb # Restore PEERADDR 644d3373029SBjoern A. Zeeb PEERADDR=${_p} 645d3373029SBjoern A. Zeeb 646d3373029SBjoern A. Zeeb # Cleanup transfer networks and firewall. 6470e7ed5d6SBjoern A. Zeeb fib=0 6480e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 6490e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias 6500e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 651d3373029SBjoern A. Zeeb done 652d3373029SBjoern A. Zeeb ipfw delete 10 > /dev/null 2>&1 653d3373029SBjoern A. Zeeb} 654d3373029SBjoern A. Zeeb 655d3373029SBjoern A. Zeebtesttx_icmp6_connected_transfernets() 656d3373029SBjoern A. Zeeb{ 657d3373029SBjoern A. Zeeb 658d3373029SBjoern A. Zeeb testtx_ulp6_connected_transfernets \ 659d3373029SBjoern A. Zeeb "testtx_icmp6_connected_transfernets" "-i" 660d3373029SBjoern A. Zeeb} 661d3373029SBjoern A. Zeeb 662d3373029SBjoern A. Zeebtesttx_tcp6_connected_transfernets() 663d3373029SBjoern A. Zeeb{ 664d3373029SBjoern A. Zeeb 665d3373029SBjoern A. Zeeb testtx_ulp6_connected_transfernets \ 666d3373029SBjoern A. Zeeb "testtx_tcp6_connected_transfernets" "" 667d3373029SBjoern A. Zeeb} 668d3373029SBjoern A. Zeeb 669d3373029SBjoern A. Zeebtesttx_udp6_connected_transfernets() 670d3373029SBjoern A. Zeeb{ 671d3373029SBjoern A. Zeeb 672d3373029SBjoern A. Zeeb testtx_ulp6_connected_transfernets \ 673d3373029SBjoern A. Zeeb "testtx_udp6_connected_transfernets" "-u" 674d3373029SBjoern A. Zeeb} 675d3373029SBjoern A. Zeeb 676d3373029SBjoern A. Zeeb################################################################################ 677d3373029SBjoern A. Zeeb# 678d3373029SBjoern A. Zeeb# Setup a different transfernet on each FIB. Delete all but one connected 679d3373029SBjoern A. Zeeb# route in all FIBs (e.g. FIB 0 uses prefix 0, FIB 1 uses prefix 1 , ...). 680d3373029SBjoern A. Zeeb# 681d3373029SBjoern A. Zeeb# Need to tag NS/NA incoming to the right FIB given the default FIB does not 682d3373029SBjoern A. Zeeb# know about the prefix and thus cannot do proper source address lookups for 683d3373029SBjoern A. Zeeb# replying otherwise. Use ifconfig IFACE fib. 684d3373029SBjoern A. Zeeb# 685d3373029SBjoern A. Zeebtesttx_ulp6_connected_ifconfig_transfernets() 686d3373029SBjoern A. Zeeb{ 6870e7ed5d6SBjoern A. Zeeb local fib i _n _o _p 688d3373029SBjoern A. Zeeb _n="$1" 689d3373029SBjoern A. Zeeb _o="$2" 690d3373029SBjoern A. Zeeb 691d3373029SBjoern A. Zeeb # Setup transfer networks. 6920e7ed5d6SBjoern A. Zeeb fib=0 6930e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 6940e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias \ 695d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 6960e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 alias 697d3373029SBjoern A. Zeeb # Remove connected routes from all but matching FIB. 698d3373029SBjoern A. Zeeb i=0 699d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 700d3373029SBjoern A. Zeeb case ${i} in 7010e7ed5d6SBjoern A. Zeeb ${fib});; 702d3373029SBjoern A. Zeeb *) setfib -F${i} route delete -inet6 \ 7030e7ed5d6SBjoern A. Zeeb -net 2001:2:${fib}:: > /dev/null 2>&1 704d3373029SBjoern A. Zeeb ;; 705d3373029SBjoern A. Zeeb esac 706d3373029SBjoern A. Zeeb i=$((i + 1)) 707d3373029SBjoern A. Zeeb done 7080e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 709d3373029SBjoern A. Zeeb done 710d3373029SBjoern A. Zeeb 711d3373029SBjoern A. Zeeb # Save PEERADDR 712d3373029SBjoern A. Zeeb _p=${PEERADDR} 713d3373029SBjoern A. Zeeb 714d3373029SBjoern A. Zeeb # Run tests. 7150e7ed5d6SBjoern A. Zeeb fib=0 7160e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 7170e7ed5d6SBjoern A. Zeeb PEERADDR=2001:2:${fib}::2 718d3373029SBjoern A. Zeeb 7190e7ed5d6SBjoern A. Zeeb print_debug "${_n} ${fib}" 720d3373029SBjoern A. Zeeb 721d3373029SBjoern A. Zeeb # Setup expected return values. 722d3373029SBjoern A. Zeeb i=0 723d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 724d3373029SBjoern A. Zeeb eval rc_${i}_l=0 725d3373029SBjoern A. Zeeb case ${i} in 7260e7ed5d6SBjoern A. Zeeb ${fib}) 727d3373029SBjoern A. Zeeb eval rc_${i}_a=0 728d3373029SBjoern A. Zeeb ;; 729d3373029SBjoern A. Zeeb *) eval rc_${i}_a=1 730d3373029SBjoern A. Zeeb ;; 731d3373029SBjoern A. Zeeb esac 732d3373029SBjoern A. Zeeb i=$((i + 1)) 733d3373029SBjoern A. Zeeb done 734d3373029SBjoern A. Zeeb 7350e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} fib ${fib} 736d3373029SBjoern A. Zeeb 7370e7ed5d6SBjoern A. Zeeb testtx_ulp6_connected "${_n}${fib}" "${_o}" ${fib} 7380e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 739d3373029SBjoern A. Zeeb done 740d3373029SBjoern A. Zeeb 741d3373029SBjoern A. Zeeb # Restore PEERADDR 742d3373029SBjoern A. Zeeb PEERADDR=${_p} 743d3373029SBjoern A. Zeeb 744d3373029SBjoern A. Zeeb # Cleanup transfer networks. 7450e7ed5d6SBjoern A. Zeeb fib=0 7460e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 7470e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias 7480e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 749d3373029SBjoern A. Zeeb done 750d3373029SBjoern A. Zeeb ifconfig ${IFACE} fib 0 751d3373029SBjoern A. Zeeb} 752d3373029SBjoern A. Zeeb 753d3373029SBjoern A. Zeebtesttx_icmp6_connected_ifconfig_transfernets() 754d3373029SBjoern A. Zeeb{ 755d3373029SBjoern A. Zeeb 756d3373029SBjoern A. Zeeb testtx_ulp6_connected_ifconfig_transfernets \ 757d3373029SBjoern A. Zeeb "testtx_icmp6_connected_ifconfig_transfernets" "-i" 758d3373029SBjoern A. Zeeb} 759d3373029SBjoern A. Zeeb 760d3373029SBjoern A. Zeeb 761d3373029SBjoern A. Zeebtesttx_tcp6_connected_ifconfig_transfernets() 762d3373029SBjoern A. Zeeb{ 763d3373029SBjoern A. Zeeb 764d3373029SBjoern A. Zeeb testtx_ulp6_connected_ifconfig_transfernets \ 765d3373029SBjoern A. Zeeb "testtx_tcp6_connected_ifconfig_transfernets" "" 766d3373029SBjoern A. Zeeb} 767d3373029SBjoern A. Zeeb 768d3373029SBjoern A. Zeebtesttx_udp6_connected_ifconfig_transfernets() 769d3373029SBjoern A. Zeeb{ 770d3373029SBjoern A. Zeeb 771d3373029SBjoern A. Zeeb testtx_ulp6_connected_ifconfig_transfernets \ 772d3373029SBjoern A. Zeeb "testtx_udp6_connected_ifconfig_transfernets" "-u" 773d3373029SBjoern A. Zeeb} 774d3373029SBjoern A. Zeeb 775d3373029SBjoern A. Zeeb################################################################################ 776d3373029SBjoern A. Zeeb# 777d3373029SBjoern A. Zeeb# Make destination reachable through the same default route in each FIB only. 778d3373029SBjoern A. Zeeb# Run standard reachability test. 779d3373029SBjoern A. Zeeb# 780d3373029SBjoern A. Zeebtesttx_ulp6_gateway() 781d3373029SBjoern A. Zeeb{ 7820e7ed5d6SBjoern A. Zeeb local fib i _n _o _p 783d3373029SBjoern A. Zeeb _n="$1" 784d3373029SBjoern A. Zeeb _o="$2" 785d3373029SBjoern A. Zeeb 786d3373029SBjoern A. Zeeb # Setup default gateway and expected error codes. 7870e7ed5d6SBjoern A. Zeeb fib=0 7880e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 7890e7ed5d6SBjoern A. Zeeb setfib -F${fib} route delete -inet6 -net default \ 790d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 7910e7ed5d6SBjoern A. Zeeb setfib -F${fib} route add -inet6 -net default ${PEERADDR} \ 792d3373029SBjoern A. Zeeb > /dev/null 2>&1 793d3373029SBjoern A. Zeeb case "${_o}" in 7940e7ed5d6SBjoern A. Zeeb -i) eval rc_${fib}_l=0 ;; # ICMPv6 will succeed 7950e7ed5d6SBjoern A. Zeeb *) eval rc_${fib}_l=1 ;; 796d3373029SBjoern A. Zeeb esac 7970e7ed5d6SBjoern A. Zeeb eval rc_${fib}_a=0 7980e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 799d3373029SBjoern A. Zeeb done 800d3373029SBjoern A. Zeeb 801d3373029SBjoern A. Zeeb # Save PEERADDR 802d3373029SBjoern A. Zeeb _p=${PEERADDR} 803d3373029SBjoern A. Zeeb PEERADDR="2001:2:ff01::2" 804d3373029SBjoern A. Zeeb 805d3373029SBjoern A. Zeeb # Run tests. 806d3373029SBjoern A. Zeeb print_debug "${_n}" 807d3373029SBjoern A. Zeeb testtx_ulp6_connected "${_n}" "${_o}" 0 808d3373029SBjoern A. Zeeb 809d3373029SBjoern A. Zeeb # Restore PEERADDR 810d3373029SBjoern A. Zeeb PEERADDR=${_p} 811d3373029SBjoern A. Zeeb 812d3373029SBjoern A. Zeeb # Cleanup transfer networks. 8130e7ed5d6SBjoern A. Zeeb fib=0 8140e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 8150e7ed5d6SBjoern A. Zeeb setfib -F${fib} route delete -inet6 -net default \ 816d3373029SBjoern A. Zeeb > /dev/null 2>&1 8170e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 818d3373029SBjoern A. Zeeb done 819d3373029SBjoern A. Zeeb} 820d3373029SBjoern A. Zeeb 821d3373029SBjoern A. Zeebtesttx_icmp6_gateway() 822d3373029SBjoern A. Zeeb{ 823d3373029SBjoern A. Zeeb 824d3373029SBjoern A. Zeeb testtx_ulp6_gateway "testtx_icmp6_gateway" "-i" 825d3373029SBjoern A. Zeeb} 826d3373029SBjoern A. Zeeb 827d3373029SBjoern A. Zeebtesttx_tcp6_gateway() 828d3373029SBjoern A. Zeeb{ 829d3373029SBjoern A. Zeeb 830d3373029SBjoern A. Zeeb testtx_ulp6_gateway "testtx_tcp6_gateway" "" 831d3373029SBjoern A. Zeeb} 832d3373029SBjoern A. Zeeb 833d3373029SBjoern A. Zeebtesttx_udp6_gateway() 834d3373029SBjoern A. Zeeb{ 835d3373029SBjoern A. Zeeb 836d3373029SBjoern A. Zeeb testtx_ulp6_gateway "testtx_udp6_gateway" "-u" 837d3373029SBjoern A. Zeeb} 838d3373029SBjoern A. Zeeb 839d3373029SBjoern A. Zeeb################################################################################ 840d3373029SBjoern A. Zeeb# 841d3373029SBjoern A. Zeeb# Make destination reachable through a different default route in each FIB. 842d3373029SBjoern A. Zeeb# Generate a dedicated transfer network for that in each FIB. Delete all but 843d3373029SBjoern A. Zeeb# one connected route in all FIBs (e.g. FIB 0 uses prefix 0, ...). 844d3373029SBjoern A. Zeeb# 845d3373029SBjoern A. Zeeb# Have a default route present in each FIB all time. 846d3373029SBjoern A. Zeeb# 847d3373029SBjoern A. Zeeb# Need to tag NS/NA incoming to the right FIB given the default FIB does not 848d3373029SBjoern A. Zeeb# know about the prefix and thus cannot do proper source address lookups for 849d3373029SBjoern A. Zeeb# replying otherwise. Use ipfw. 850d3373029SBjoern A. Zeeb# 851d3373029SBjoern A. Zeeb# 852d3373029SBjoern A. Zeebtesttx_ulp6_transfernets_gateways() 853d3373029SBjoern A. Zeeb{ 8540e7ed5d6SBjoern A. Zeeb local fib i _n _o _p 855d3373029SBjoern A. Zeeb _n="$1" 856d3373029SBjoern A. Zeeb _o="$2" 857d3373029SBjoern A. Zeeb 858d3373029SBjoern A. Zeeb # Setup transfer networks, default routes, and firewall. 8590e7ed5d6SBjoern A. Zeeb fib=0 860d3373029SBjoern A. Zeeb ipfw delete 10 > /dev/null 2>&1 || true 8610e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 8620e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias \ 863d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 8640e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 alias \ 865d3373029SBjoern A. Zeeb > /dev/null 2>&1 8660e7ed5d6SBjoern A. Zeeb ipfw add 10 setfib ${fib} ipv6-icmp \ 8670e7ed5d6SBjoern A. Zeeb from 2001:2:${fib}::/64 to any ip6 icmp6types 135,136 \ 868d3373029SBjoern A. Zeeb via ${IFACE} in > /dev/null 2>&1 869d3373029SBjoern A. Zeeb # Remove connected routes from all but matching FIB. 870d3373029SBjoern A. Zeeb i=0 871d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 872d3373029SBjoern A. Zeeb case ${i} in 8730e7ed5d6SBjoern A. Zeeb ${fib});; 874d3373029SBjoern A. Zeeb *) setfib -F${i} route delete -inet6 \ 8750e7ed5d6SBjoern A. Zeeb -net 2001:2:${fib}:: > /dev/null 2>&1 876d3373029SBjoern A. Zeeb ;; 877d3373029SBjoern A. Zeeb esac 878d3373029SBjoern A. Zeeb i=$((i + 1)) 879d3373029SBjoern A. Zeeb done 880d3373029SBjoern A. Zeeb # Add default route. 8810e7ed5d6SBjoern A. Zeeb setfib -F${fib} route delete -inet6 -net default \ 882d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 8830e7ed5d6SBjoern A. Zeeb setfib -F${fib} route add -inet6 -net default \ 8840e7ed5d6SBjoern A. Zeeb 2001:2:${fib}::2 > /dev/null 2>&1 8850e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 886d3373029SBjoern A. Zeeb done 887d3373029SBjoern A. Zeeb 888d3373029SBjoern A. Zeeb # Save PEERADDR 889d3373029SBjoern A. Zeeb _p=${PEERADDR} 890d3373029SBjoern A. Zeeb PEERADDR="2001:2:ff01::2" 891d3373029SBjoern A. Zeeb 892d3373029SBjoern A. Zeeb # Setup expected return values. 893d3373029SBjoern A. Zeeb i=0 894d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 895d3373029SBjoern A. Zeeb case "${_o}" in 896d3373029SBjoern A. Zeeb -i) eval rc_${i}_l=0 ;; # ICMPv6 will succeed 897d3373029SBjoern A. Zeeb *) eval rc_${i}_l=1 ;; 898d3373029SBjoern A. Zeeb esac 899d3373029SBjoern A. Zeeb eval rc_${i}_a=0 900d3373029SBjoern A. Zeeb i=$((i + 1)) 901d3373029SBjoern A. Zeeb done 902d3373029SBjoern A. Zeeb 903d3373029SBjoern A. Zeeb # Run tests. 904d3373029SBjoern A. Zeeb print_debug "${_n}" 905d3373029SBjoern A. Zeeb testtx_ulp6_connected "${_n}" "${_o}" 0 906d3373029SBjoern A. Zeeb 907d3373029SBjoern A. Zeeb # Restore PEERADDR 908d3373029SBjoern A. Zeeb PEERADDR=${_p} 909d3373029SBjoern A. Zeeb 910d3373029SBjoern A. Zeeb # Cleanup default routes, transfer networks, and firewall. 9110e7ed5d6SBjoern A. Zeeb fib=0 9120e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 9130e7ed5d6SBjoern A. Zeeb setfib -F${fib} route delete -inet6 -net default \ 914d3373029SBjoern A. Zeeb > /dev/null 2>&1 9150e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias \ 916d3373029SBjoern A. Zeeb > /dev/null 2>&1 9170e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 918d3373029SBjoern A. Zeeb done 919d3373029SBjoern A. Zeeb ipfw delete 10 > /dev/null 2>&1 920d3373029SBjoern A. Zeeb} 921d3373029SBjoern A. Zeeb 922d3373029SBjoern A. Zeebtesttx_icmp6_transfernets_gateways() 923d3373029SBjoern A. Zeeb{ 924d3373029SBjoern A. Zeeb 925d3373029SBjoern A. Zeeb testtx_ulp6_transfernets_gateways \ 926d3373029SBjoern A. Zeeb "testtx_icmp6_transfernets_gateways" "-i" 927d3373029SBjoern A. Zeeb} 928d3373029SBjoern A. Zeeb 929d3373029SBjoern A. Zeebtesttx_tcp6_transfernets_gateways() 930d3373029SBjoern A. Zeeb{ 931d3373029SBjoern A. Zeeb 932d3373029SBjoern A. Zeeb testtx_ulp6_transfernets_gateways \ 933d3373029SBjoern A. Zeeb "testtx_tcp6_transfernets_gateways" "" 934d3373029SBjoern A. Zeeb} 935d3373029SBjoern A. Zeeb 936d3373029SBjoern A. Zeebtesttx_udp6_transfernets_gateways() 937d3373029SBjoern A. Zeeb{ 938d3373029SBjoern A. Zeeb 939d3373029SBjoern A. Zeeb testtx_ulp6_transfernets_gateways \ 940d3373029SBjoern A. Zeeb "testtx_udp6_transfernets_gateways" "-u" 941d3373029SBjoern A. Zeeb} 942d3373029SBjoern A. Zeeb 943d3373029SBjoern A. Zeeb################################################################################ 944d3373029SBjoern A. Zeeb# 945d3373029SBjoern A. Zeeb# Make destination reachable through a different default route in each FIB. 946d3373029SBjoern A. Zeeb# Generate a dedicated transfer network for that in each FIB. Delete all but 947d3373029SBjoern A. Zeeb# one connected route in all FIBs (e.g. FIB 0 uses prefix 0, ...). 948d3373029SBjoern A. Zeeb# 949d3373029SBjoern A. Zeeb# Only have a default route present in 1 FIB at a time. 950d3373029SBjoern A. Zeeb# 951d3373029SBjoern A. Zeeb# Need to tag NS/NA incoming to the right FIB given the default FIB does not 952d3373029SBjoern A. Zeeb# know about the prefix and thus cannot do proper source address lookups for 953d3373029SBjoern A. Zeeb# replying otherwise. Use ipfw. 954d3373029SBjoern A. Zeeb# 955d3373029SBjoern A. Zeebtesttx_ulp6_transfernets_gateway() 956d3373029SBjoern A. Zeeb{ 9570e7ed5d6SBjoern A. Zeeb local fib i _n _o _p 958d3373029SBjoern A. Zeeb _n="$1" 959d3373029SBjoern A. Zeeb _o="$2" 960d3373029SBjoern A. Zeeb 961d3373029SBjoern A. Zeeb # Setup transfer networks, default routes, and firewall. 9620e7ed5d6SBjoern A. Zeeb fib=0 963d3373029SBjoern A. Zeeb ipfw delete 10 > /dev/null 2>&1 || true 9640e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 9650e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias \ 966d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 9670e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 alias \ 968d3373029SBjoern A. Zeeb > /dev/null 2>&1 9690e7ed5d6SBjoern A. Zeeb ipfw add 10 setfib ${fib} ipv6-icmp \ 9700e7ed5d6SBjoern A. Zeeb from 2001:2:${fib}::/64 to any ip6 icmp6types 135,136 \ 971d3373029SBjoern A. Zeeb via ${IFACE} in > /dev/null 2>&1 972d3373029SBjoern A. Zeeb # Remove connected routes from all but matching FIB. 973d3373029SBjoern A. Zeeb i=0 974d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 975d3373029SBjoern A. Zeeb case ${i} in 9760e7ed5d6SBjoern A. Zeeb ${fib});; 977d3373029SBjoern A. Zeeb *) setfib -F${i} route delete -inet6 \ 9780e7ed5d6SBjoern A. Zeeb -net 2001:2:${fib}:: > /dev/null 2>&1 979d3373029SBjoern A. Zeeb ;; 980d3373029SBjoern A. Zeeb esac 981d3373029SBjoern A. Zeeb i=$((i + 1)) 982d3373029SBjoern A. Zeeb done 9830e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 984d3373029SBjoern A. Zeeb done 985d3373029SBjoern A. Zeeb 986d3373029SBjoern A. Zeeb # Save PEERADDR 987d3373029SBjoern A. Zeeb _p=${PEERADDR} 988d3373029SBjoern A. Zeeb PEERADDR="2001:2:ff01::2" 989d3373029SBjoern A. Zeeb 990d3373029SBjoern A. Zeeb # Run tests. 9910e7ed5d6SBjoern A. Zeeb fib=0 9920e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 993d3373029SBjoern A. Zeeb 9940e7ed5d6SBjoern A. Zeeb print_debug "${_n} ${fib}" 995d3373029SBjoern A. Zeeb 996d3373029SBjoern A. Zeeb # Setup expected return values. 997d3373029SBjoern A. Zeeb i=0 998d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 999d3373029SBjoern A. Zeeb case "${_o}" in 1000d3373029SBjoern A. Zeeb -i) eval rc_${i}_l=0 ;; # ICMPv6 will succeed 1001d3373029SBjoern A. Zeeb *) eval rc_${i}_l=1 ;; 1002d3373029SBjoern A. Zeeb esac 1003d3373029SBjoern A. Zeeb case ${i} in 10040e7ed5d6SBjoern A. Zeeb ${fib}) 1005d3373029SBjoern A. Zeeb eval rc_${i}_a=0 1006d3373029SBjoern A. Zeeb ;; 1007d3373029SBjoern A. Zeeb *) eval rc_${i}_a=1 1008d3373029SBjoern A. Zeeb ;; 1009d3373029SBjoern A. Zeeb esac 1010d3373029SBjoern A. Zeeb i=$((i + 1)) 1011d3373029SBjoern A. Zeeb done 1012d3373029SBjoern A. Zeeb 1013d3373029SBjoern A. Zeeb # Add default route. 10140e7ed5d6SBjoern A. Zeeb setfib -F${fib} route delete -inet6 -net default \ 1015d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 10160e7ed5d6SBjoern A. Zeeb setfib -F${fib} route add -inet6 -net default \ 10170e7ed5d6SBjoern A. Zeeb 2001:2:${fib}::2 > /dev/null 2>&1 1018d3373029SBjoern A. Zeeb 10190e7ed5d6SBjoern A. Zeeb testtx_ulp6_connected "${_n}${fib}" "${_o}" ${fib} 1020d3373029SBjoern A. Zeeb 1021d3373029SBjoern A. Zeeb # Delete default route again. 10220e7ed5d6SBjoern A. Zeeb setfib -F${fib} route delete -inet6 -net default \ 1023d3373029SBjoern A. Zeeb > /dev/null 2>&1 10240e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 1025d3373029SBjoern A. Zeeb done 1026d3373029SBjoern A. Zeeb 1027d3373029SBjoern A. Zeeb # Restore PEERADDR 1028d3373029SBjoern A. Zeeb PEERADDR=${_p} 1029d3373029SBjoern A. Zeeb 1030d3373029SBjoern A. Zeeb # Cleanup default routes, transfer networks, and firewall. 10310e7ed5d6SBjoern A. Zeeb fib=0 10320e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 10330e7ed5d6SBjoern A. Zeeb setfib -F${fib} route delete -inet6 -net default \ 1034d3373029SBjoern A. Zeeb > /dev/null 2>&1 10350e7ed5d6SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${fib}::1/64 -alias \ 1036d3373029SBjoern A. Zeeb > /dev/null 2>&1 10370e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 1038d3373029SBjoern A. Zeeb done 1039d3373029SBjoern A. Zeeb ipfw delete 10 > /dev/null 2>&1 1040d3373029SBjoern A. Zeeb} 1041d3373029SBjoern A. Zeeb 1042d3373029SBjoern A. Zeebtesttx_icmp6_transfernets_gateway() 1043d3373029SBjoern A. Zeeb{ 1044d3373029SBjoern A. Zeeb 1045d3373029SBjoern A. Zeeb testtx_ulp6_transfernets_gateway \ 1046d3373029SBjoern A. Zeeb "testtx_icmp6_transfernets_gateway" "-i" 1047d3373029SBjoern A. Zeeb} 1048d3373029SBjoern A. Zeeb 1049d3373029SBjoern A. Zeeb 1050d3373029SBjoern A. Zeebtesttx_tcp6_transfernets_gateway() 1051d3373029SBjoern A. Zeeb{ 1052d3373029SBjoern A. Zeeb 1053d3373029SBjoern A. Zeeb testtx_ulp6_transfernets_gateway \ 1054d3373029SBjoern A. Zeeb "testtx_tcp6_transfernets_gateway" "" 1055d3373029SBjoern A. Zeeb} 1056d3373029SBjoern A. Zeeb 1057d3373029SBjoern A. Zeebtesttx_udp6_transfernets_gateway() 1058d3373029SBjoern A. Zeeb{ 1059d3373029SBjoern A. Zeeb 1060d3373029SBjoern A. Zeeb testtx_ulp6_transfernets_gateway \ 1061d3373029SBjoern A. Zeeb "testtx_udp6_transfernets_gateway" "-u" 1062d3373029SBjoern A. Zeeb} 1063d3373029SBjoern A. Zeeb 1064d3373029SBjoern A. Zeeb 1065d3373029SBjoern A. Zeeb################################################################################ 1066d3373029SBjoern A. Zeeb# 1067d3373029SBjoern A. Zeeb# RX tests (Remotely originated connections). The FIB tests happens on peer. 1068d3373029SBjoern A. Zeeb# 1069d3373029SBjoern A. Zeeb# # For IPFW, IFCONFIG 1070d3373029SBjoern A. Zeeb# # For each FIB 1071d3373029SBjoern A. Zeeb# # Send OOB well known to work START, wait for reflect 1072d3373029SBjoern A. Zeeb# # Send probe, wait for reply with FIB# or RST/ICMP6 unreach 1073d3373029SBjoern A. Zeeb# # (in case of ICMP6 use magic like ipfw count and OOB reply) 1074d3373029SBjoern A. Zeeb# # Send OOB well known to work DONE, wait for reflect 1075d3373029SBjoern A. Zeeb# # Compare real with expected results. 1076d3373029SBjoern A. Zeeb# 1077d3373029SBjoern A. Zeebtestrx_results() 1078d3373029SBjoern A. Zeeb{ 1079d3373029SBjoern A. Zeeb local _r _n _fib i count _instances _transfer _o 1080d3373029SBjoern A. Zeeb _fib="$1" 1081d3373029SBjoern A. Zeeb _n="$2" 1082d3373029SBjoern A. Zeeb _r="$3" 1083d3373029SBjoern A. Zeeb _instances=$4 1084d3373029SBjoern A. Zeeb _transfer=$5 1085d3373029SBjoern A. Zeeb _o="$6" 1086d3373029SBjoern A. Zeeb 1087d3373029SBjoern A. Zeeb print_debug "testrx_results ${_fib} ${_n} ${_r} ${_instances}" 1088d3373029SBjoern A. Zeeb 1089d3373029SBjoern A. Zeeb # Trim "RESULT " 1090d3373029SBjoern A. Zeeb _r=${_r#* } 1091d3373029SBjoern A. Zeeb 1092d3373029SBjoern A. Zeeb echo "1..${RT_NUMFIBS}" 1093d3373029SBjoern A. Zeeb while read i count; do 1094d3373029SBjoern A. Zeeb if test ${_instances} -gt 1; then 1095d3373029SBjoern A. Zeeb if test ${count} -gt 0; then 1096d3373029SBjoern A. Zeeb echo "ok ${i} ${_n}result_${i} #" \ 1097d3373029SBjoern A. Zeeb "FIB ${i} ${count} (tested)" 1098d3373029SBjoern A. Zeeb else 1099d3373029SBjoern A. Zeeb echo "not ok ${i} ${_n}result_${i} #" \ 1100d3373029SBjoern A. Zeeb "FIB ${i} ${count} (tested)" 1101d3373029SBjoern A. Zeeb fi 1102d3373029SBjoern A. Zeeb else 1103d3373029SBjoern A. Zeeb case ${i} in 1104d3373029SBjoern A. Zeeb ${_fib}) 1105d3373029SBjoern A. Zeeb if test ${count} -gt 0; then 1106d3373029SBjoern A. Zeeb echo "ok ${i} ${_n}result_${i} #" \ 1107d3373029SBjoern A. Zeeb "FIB ${i} ${count} (tested)" 1108d3373029SBjoern A. Zeeb else 1109d3373029SBjoern A. Zeeb echo "not ok ${i} ${_n}result_${i} #" \ 1110d3373029SBjoern A. Zeeb "FIB ${i} ${count} (tested)" 1111d3373029SBjoern A. Zeeb fi 1112d3373029SBjoern A. Zeeb ;; 1113d3373029SBjoern A. Zeeb *) if test ${count} -eq 0; then 1114d3373029SBjoern A. Zeeb echo "ok ${i} ${_n}result_${i} #" \ 1115d3373029SBjoern A. Zeeb "FIB ${i} ${count}" 1116d3373029SBjoern A. Zeeb else 1117d3373029SBjoern A. Zeeb echo "not ok ${i} ${_n}result_${i} #" \ 1118d3373029SBjoern A. Zeeb "FIB ${i} ${count}" 1119d3373029SBjoern A. Zeeb fi 1120d3373029SBjoern A. Zeeb ;; 1121d3373029SBjoern A. Zeeb esac 1122d3373029SBjoern A. Zeeb fi 1123d3373029SBjoern A. Zeeb i=$((i + 1)) 1124d3373029SBjoern A. Zeeb done <<EOI 1125d3373029SBjoern A. Zeeb`echo "${_r}" | tr ',' '\n'` 1126d3373029SBjoern A. ZeebEOI 1127d3373029SBjoern A. Zeeb 1128d3373029SBjoern A. Zeeb} 1129d3373029SBjoern A. Zeeb 1130d3373029SBjoern A. Zeebtestrx_tcp_udp() 1131d3373029SBjoern A. Zeeb{ 1132d3373029SBjoern A. Zeeb local _n _o _f testno i _fibtxt _instances _res _port _transfer _p 1133d3373029SBjoern A. Zeeb _n="$1" 1134d3373029SBjoern A. Zeeb _o="$2" 1135d3373029SBjoern A. Zeeb _f="$3" 1136d3373029SBjoern A. Zeeb _instances=$4 1137d3373029SBjoern A. Zeeb _transfer=$5 1138d3373029SBjoern A. Zeeb 1139d3373029SBjoern A. Zeeb # Unused so far. 1140d3373029SBjoern A. Zeeb : ${_instances:=1} 1141d3373029SBjoern A. Zeeb 1142d3373029SBjoern A. Zeeb printf "1..%d\n" `expr 2 \* ${RT_NUMFIBS}` 1143d3373029SBjoern A. Zeeb testno=1 1144d3373029SBjoern A. Zeeb i=0 1145d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 1146d3373029SBjoern A. Zeeb print_debug "Testing ${_f} ${i}" 1147d3373029SBjoern A. Zeeb 1148d3373029SBjoern A. Zeeb # We are expecting the FIB number (only) to be returned. 1149d3373029SBjoern A. Zeeb eval _rc="\${rc_${i}_l}" 1150d3373029SBjoern A. Zeeb _fibtxt="${_n}_${i}_l ${_f} ${i} ${PEERLINKLOCAL}" 1151d3373029SBjoern A. Zeeb if test ${_instances} -gt 1; then 1152d3373029SBjoern A. Zeeb _res="FIB ${i}" 1153d3373029SBjoern A. Zeeb _port=$((CTRLPORT + 1000 + i)) 1154d3373029SBjoern A. Zeeb else 1155d3373029SBjoern A. Zeeb _res="${_fibtxt}" 1156d3373029SBjoern A. Zeeb _port=${CTRLPORT} 1157d3373029SBjoern A. Zeeb fi 1158d3373029SBjoern A. Zeeb nc_send_recv ${i} 1 "${_fibtxt}" "${_res}" ${PEERLINKLOCAL} \ 1159d3373029SBjoern A. Zeeb ${_port} "-6 ${_o} -w1" 1160d3373029SBjoern A. Zeeb check_rc $? ${_rc} ${testno} "${_fibtxt}" "${_reply}" 1161d3373029SBjoern A. Zeeb testno=$((testno + 1)) 1162d3373029SBjoern A. Zeeb 1163d3373029SBjoern A. Zeeb # If doing multiple transfer networks, replace PEERADDR. 1164d3373029SBjoern A. Zeeb _p="${PEERADDR}" 1165d3373029SBjoern A. Zeeb case ${_transfer} in 1166d3373029SBjoern A. Zeeb 1) PEERADDR=2001:2:${i}::2 ;; 1167d3373029SBjoern A. Zeeb esac 1168d3373029SBjoern A. Zeeb 1169d3373029SBjoern A. Zeeb eval _rc="\${rc_${i}_a}" 1170d3373029SBjoern A. Zeeb _fibtxt="${_n}_${i}_a ${_f} ${i} ${PEERADDR}" 1171d3373029SBjoern A. Zeeb if test ${_instances} -gt 1; then 1172d3373029SBjoern A. Zeeb _res="FIB ${i}" 1173d3373029SBjoern A. Zeeb _port=$((CTRLPORT + 1000 + i)) 1174d3373029SBjoern A. Zeeb else 1175d3373029SBjoern A. Zeeb _res="${_fibtxt}" 1176d3373029SBjoern A. Zeeb _port=${CTRLPORT} 1177d3373029SBjoern A. Zeeb fi 1178d3373029SBjoern A. Zeeb nc_send_recv ${i} 1 "${_fibtxt}" "${_res}" ${PEERADDR} \ 1179d3373029SBjoern A. Zeeb ${_port} "-6 ${_o} -w1" 1180d3373029SBjoern A. Zeeb check_rc $? ${_rc} ${testno} "${_fibtxt}" "${_reply}" 1181d3373029SBjoern A. Zeeb testno=$((testno + 1)) 1182d3373029SBjoern A. Zeeb 1183d3373029SBjoern A. Zeeb # Restore PEERADDR. 1184d3373029SBjoern A. Zeeb PEERADDR="${_p}" 1185d3373029SBjoern A. Zeeb 1186d3373029SBjoern A. Zeeb i=$((i + 1)) 1187d3373029SBjoern A. Zeeb done 1188d3373029SBjoern A. Zeeb} 1189d3373029SBjoern A. Zeeb 1190d3373029SBjoern A. Zeeb 1191d3373029SBjoern A. Zeebtestrx_setup_transfer_networks() 1192d3373029SBjoern A. Zeeb{ 1193d3373029SBjoern A. Zeeb local i 1194d3373029SBjoern A. Zeeb 1195d3373029SBjoern A. Zeeb i=0 1196d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 1197d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${i}::1/64 -alias \ 1198d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 1199d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${i}::1/64 alias 1200d3373029SBjoern A. Zeeb i=$((i + 1)) 1201d3373029SBjoern A. Zeeb done 1202d3373029SBjoern A. Zeeb} 1203d3373029SBjoern A. Zeeb 1204d3373029SBjoern A. Zeebtestrx_cleanup_transfer_networks() 1205d3373029SBjoern A. Zeeb{ 1206d3373029SBjoern A. Zeeb local i 1207d3373029SBjoern A. Zeeb 1208d3373029SBjoern A. Zeeb i=0 1209d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 1210d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${i}::1/64 -alias \ 1211d3373029SBjoern A. Zeeb > /dev/null 2>&1 1212d3373029SBjoern A. Zeeb i=$((i + 1)) 1213d3373029SBjoern A. Zeeb done 1214d3373029SBjoern A. Zeeb} 1215d3373029SBjoern A. Zeeb 1216d3373029SBjoern A. Zeeb 1217d3373029SBjoern A. Zeebtestrx_run_test() 1218d3373029SBjoern A. Zeeb{ 1219d3373029SBjoern A. Zeeb local _n _t _fib _o _txt _msg i _reply _instances _destructive _transfer 1220d3373029SBjoern A. Zeeb _n="$1" 1221d3373029SBjoern A. Zeeb _t="$2" 1222d3373029SBjoern A. Zeeb _fib=$3 1223d3373029SBjoern A. Zeeb _o="$4" 1224d3373029SBjoern A. Zeeb _instances=$5 1225d3373029SBjoern A. Zeeb _detsructive=$6 1226d3373029SBjoern A. Zeeb _transfer=$7 1227d3373029SBjoern A. Zeeb 1228d3373029SBjoern A. Zeeb # Netcat options (for UDP basically). 1229d3373029SBjoern A. Zeeb case "${_o}" in 1230d3373029SBjoern A. Zeeb -i) _opts="" ;; # Use TCP for START/DONE. 1231d3373029SBjoern A. Zeeb *) _opts="${_o}" ;; 1232d3373029SBjoern A. Zeeb esac 1233d3373029SBjoern A. Zeeb 1234d3373029SBjoern A. Zeeb # Combined test case base name. 1235d3373029SBjoern A. Zeeb case ${USE_SOSETFIB} in 1236d3373029SBjoern A. Zeeb 0) _f="setfib" ;; 1237d3373029SBjoern A. Zeeb 1) _f="so_setfib" ;; 1238d3373029SBjoern A. Zeeb *) die "Unexpected value for SO_SETFIB: ${SO_SETFIB}" ;; 1239d3373029SBjoern A. Zeeb esac 1240d3373029SBjoern A. Zeeb _txt="${_n}_${_f}_${_t}_${_fib}_${_instances}_${_detsructive}_${_transfer}" 1241d3373029SBjoern A. Zeeb 1242d3373029SBjoern A. Zeeb print_debug "Starting test '${_txt}' (for ${_instances} instances)." 1243d3373029SBjoern A. Zeeb 1244d3373029SBjoern A. Zeeb case ${_transfer} in 1245d3373029SBjoern A. Zeeb 1) testrx_setup_transfer_networks ;; 1246d3373029SBjoern A. Zeeb esac 1247d3373029SBjoern A. Zeeb 1248d3373029SBjoern A. Zeeb # Let the other side a chance to get ready as well. 1249d3373029SBjoern A. Zeeb sleep 1 1250d3373029SBjoern A. Zeeb 1251d3373029SBjoern A. Zeeb set +e 1252d3373029SBjoern A. Zeeb # Let peer know that we are about to start. 1253d3373029SBjoern A. Zeeb _msg="START ${_txt}" 1254d3373029SBjoern A. Zeeb nc_send_recv ${_fib} ${WAITS} "${_msg}" "${_msg}" ${PEERADDR} \ 1255d3373029SBjoern A. Zeeb ${CTRLPORT} "-6 ${_opts} -w1" 1256d3373029SBjoern A. Zeeb case $? in 1257d3373029SBjoern A. Zeeb 0) ;; 1258d3373029SBjoern A. Zeeb *) die "Got invalid reply from peer." \ 1259d3373029SBjoern A. Zeeb "Expected '${_msg}', got '${_reply}'" ;; 1260d3373029SBjoern A. Zeeb esac 1261d3373029SBjoern A. Zeeb 1262d3373029SBjoern A. Zeeb # Let the other side a chance to get ready as well. 1263d3373029SBjoern A. Zeeb sleep 1 1264d3373029SBjoern A. Zeeb 1265d3373029SBjoern A. Zeeb # Send probe. 1266d3373029SBjoern A. Zeeb case "${_o}" in 1267d3373029SBjoern A. Zeeb -i) testtx_icmp6 "${_txt}_" ${_transfer} ;; 1268d3373029SBjoern A. Zeeb *) testrx_tcp_udp "${_txt}" "${_o}" "${_fib}" ${_instances} \ 1269d3373029SBjoern A. Zeeb ${_transfer} ;; 1270d3373029SBjoern A. Zeeb esac 1271d3373029SBjoern A. Zeeb 1272d3373029SBjoern A. Zeeb # Let peer know that we are done with this test to move to next. 1273d3373029SBjoern A. Zeeb # This must immediately succeed. 1274d3373029SBjoern A. Zeeb _msg="DONE ${_txt}" 1275d3373029SBjoern A. Zeeb nc_send_recv ${_fib} ${WAITS} "${_msg}" "${_msg}" ${PEERADDR} \ 1276d3373029SBjoern A. Zeeb ${CTRLPORT} "-6 ${_opts} -w1" 1277d3373029SBjoern A. Zeeb case $? in 1278d3373029SBjoern A. Zeeb 0) ;; 1279d3373029SBjoern A. Zeeb *) die "Got invalid reply from peer." \ 1280d3373029SBjoern A. Zeeb "Expected '${_msg}', got '${_reply}'" ;; 1281d3373029SBjoern A. Zeeb esac 1282d3373029SBjoern A. Zeeb 1283d3373029SBjoern A. Zeeb # Collect and validate the results. Always use TCP. 1284d3373029SBjoern A. Zeeb sleep 1 1285d3373029SBjoern A. Zeeb set +e 1286d3373029SBjoern A. Zeeb nc_send_recv ${_fib} 1 "RESULT REQUEST" "" ${PEERADDR} \ 1287d3373029SBjoern A. Zeeb ${CTRLPORT} "-6 -w1" 1288d3373029SBjoern A. Zeeb case "${_reply}" in 1289d3373029SBjoern A. Zeeb RESULT\ *) testrx_results ${_fib} "${_txt}_" "${_reply}" ${_instances} \ 1290d3373029SBjoern A. Zeeb ${_transfer} "${_o}" 1291d3373029SBjoern A. Zeeb ;; 1292d3373029SBjoern A. Zeeb *) die "Got invalid reply from peer." \ 1293d3373029SBjoern A. Zeeb "Expected 'RESULT ...', got '${_reply}'" ;; 1294d3373029SBjoern A. Zeeb esac 1295d3373029SBjoern A. Zeeb set -e 1296d3373029SBjoern A. Zeeb 1297d3373029SBjoern A. Zeeb case ${_transfer} in 1298d3373029SBjoern A. Zeeb 1) testrx_cleanup_transfer_networks ;; 1299d3373029SBjoern A. Zeeb esac 1300d3373029SBjoern A. Zeeb 1301d3373029SBjoern A. Zeeb print_debug "Successfully received status update '${_reply}'." 1302d3373029SBjoern A. Zeeb} 1303d3373029SBjoern A. Zeeb 1304d3373029SBjoern A. Zeebtestrx_main_setup_rc() 1305d3373029SBjoern A. Zeeb{ 1306d3373029SBjoern A. Zeeb local _n _t _fib _o _instances _destructive _transfer i 1307d3373029SBjoern A. Zeeb _n="$1" 1308d3373029SBjoern A. Zeeb _t="$2" 1309d3373029SBjoern A. Zeeb _fib=$3 1310d3373029SBjoern A. Zeeb _o="$4" 1311d3373029SBjoern A. Zeeb _instances=$5 1312d3373029SBjoern A. Zeeb _destructive=$6 1313d3373029SBjoern A. Zeeb _transfer=$7 1314d3373029SBjoern A. Zeeb 1315d3373029SBjoern A. Zeeb # Setup expected return values. 1316d3373029SBjoern A. Zeeb if test ${_destructive} -eq 0; then 1317d3373029SBjoern A. Zeeb i=0 1318d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 1319d3373029SBjoern A. Zeeb eval rc_${i}_l=0 1320d3373029SBjoern A. Zeeb eval rc_${i}_a=0 1321d3373029SBjoern A. Zeeb i=$((i + 1)) 1322d3373029SBjoern A. Zeeb done 1323d3373029SBjoern A. Zeeb else 1324d3373029SBjoern A. Zeeb i=0 1325d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 1326d3373029SBjoern A. Zeeb eval rc_${i}_l=0 1327d3373029SBjoern A. Zeeb case ${i} in 1328d3373029SBjoern A. Zeeb ${_fib}) eval rc_${i}_a=0 ;; 1329d3373029SBjoern A. Zeeb *) # ICMP6 cannot be distinguished and will 1330d3373029SBjoern A. Zeeb # always work in single transfer network. 1331d3373029SBjoern A. Zeeb case "${_o}" in 1332d3373029SBjoern A. Zeeb -i) case ${_transfer} in 1333d3373029SBjoern A. Zeeb 0) eval rc_${i}_a=0 ;; 1334d3373029SBjoern A. Zeeb 1) eval rc_${i}_a=1 ;; 1335d3373029SBjoern A. Zeeb esac 1336d3373029SBjoern A. Zeeb ;; 1337d3373029SBjoern A. Zeeb *) if test ${_instances} -eq 1 -a \ 1338d3373029SBjoern A. Zeeb ${_transfer} -eq 0; then 1339d3373029SBjoern A. Zeeb eval rc_${i}_a=0 1340d3373029SBjoern A. Zeeb else 1341d3373029SBjoern A. Zeeb eval rc_${i}_a=1 1342d3373029SBjoern A. Zeeb fi 1343d3373029SBjoern A. Zeeb ;; 1344d3373029SBjoern A. Zeeb esac 1345d3373029SBjoern A. Zeeb ;; 1346d3373029SBjoern A. Zeeb esac 1347d3373029SBjoern A. Zeeb i=$((i + 1)) 1348d3373029SBjoern A. Zeeb done 1349d3373029SBjoern A. Zeeb fi 1350d3373029SBjoern A. Zeeb 1351d3373029SBjoern A. Zeeb print_debug "${_n}_${t}_${_fib} ${_instances} ${_destructive}" \ 1352d3373029SBjoern A. Zeeb "${_transfer}" 1353d3373029SBjoern A. Zeeb testrx_run_test "${_n}" "${t}" ${_fib} "${_o}" ${_instances} \ 1354d3373029SBjoern A. Zeeb ${_destructive} ${_transfer} 1355d3373029SBjoern A. Zeeb} 1356d3373029SBjoern A. Zeeb 1357d3373029SBjoern A. Zeebtestrx_main() 1358d3373029SBjoern A. Zeeb{ 13590e7ed5d6SBjoern A. Zeeb local _n _o s t fib _instances _destructive _transfer 1360d3373029SBjoern A. Zeeb _n="$1" 1361d3373029SBjoern A. Zeeb _o="$2" 1362d3373029SBjoern A. Zeeb _instances=$3 1363d3373029SBjoern A. Zeeb 1364d3373029SBjoern A. Zeeb : ${_instances:=1} 1365d3373029SBjoern A. Zeeb 1366d3373029SBjoern A. Zeeb print_debug "${_n}" 1367d3373029SBjoern A. Zeeb for _transfer in 1 0; do 1368d3373029SBjoern A. Zeeb for _destructive in 0 1; do 1369d3373029SBjoern A. Zeeb for t in ipfw ifconfig; do 1370d3373029SBjoern A. Zeeb 1371d3373029SBjoern A. Zeeb print_debug "${_n}_${t}" 13720e7ed5d6SBjoern A. Zeeb fib=0 13730e7ed5d6SBjoern A. Zeeb while test ${fib} -lt ${RT_NUMFIBS}; do 1374d3373029SBjoern A. Zeeb 1375d3373029SBjoern A. Zeeb testrx_main_setup_rc "${_n}" "${t}" \ 13760e7ed5d6SBjoern A. Zeeb ${fib} "${_o}" ${_instances} \ 1377d3373029SBjoern A. Zeeb ${_destructive} ${_transfer} 1378d3373029SBjoern A. Zeeb 13790e7ed5d6SBjoern A. Zeeb fib=$((fib + 1)) 1380d3373029SBjoern A. Zeeb done 1381d3373029SBjoern A. Zeeb done 1382d3373029SBjoern A. Zeeb done 1383d3373029SBjoern A. Zeeb done 1384d3373029SBjoern A. Zeeb} 1385d3373029SBjoern A. Zeeb 1386d3373029SBjoern A. Zeeb################################################################################ 1387d3373029SBjoern A. Zeeb# 1388d3373029SBjoern A. Zeeb# 1389d3373029SBjoern A. Zeeb# 1390d3373029SBjoern A. Zeeb 1391d3373029SBjoern A. Zeebtestrx_icmp6_same_addr_one_fib_a_time() 1392d3373029SBjoern A. Zeeb{ 1393d3373029SBjoern A. Zeeb 1394d3373029SBjoern A. Zeeb testrx_main \ 1395d3373029SBjoern A. Zeeb "testrx_icmp6_same_addr_one_fib_a_time" "-i" 1396d3373029SBjoern A. Zeeb} 1397d3373029SBjoern A. Zeeb 1398d3373029SBjoern A. Zeebtestrx_tcp6_same_addr_one_fib_a_time() 1399d3373029SBjoern A. Zeeb{ 1400d3373029SBjoern A. Zeeb 1401d3373029SBjoern A. Zeeb testrx_main \ 1402d3373029SBjoern A. Zeeb "testrx_tcp6_same_addr_one_fib_a_time" "" 1403d3373029SBjoern A. Zeeb} 1404d3373029SBjoern A. Zeeb 1405d3373029SBjoern A. Zeeb 1406d3373029SBjoern A. Zeebtestrx_udp6_same_addr_one_fib_a_time() 1407d3373029SBjoern A. Zeeb{ 1408d3373029SBjoern A. Zeeb 1409d3373029SBjoern A. Zeeb testrx_main \ 1410d3373029SBjoern A. Zeeb "testrx_udp6_same_addr_one_fib_a_time" "-u" 1411d3373029SBjoern A. Zeeb} 1412d3373029SBjoern A. Zeeb 1413d3373029SBjoern A. Zeeb 1414d3373029SBjoern A. Zeeb################################################################################ 1415d3373029SBjoern A. Zeeb 1416d3373029SBjoern A. Zeebtestrx_tcp6_same_addr_all_fibs_a_time() 1417d3373029SBjoern A. Zeeb{ 1418d3373029SBjoern A. Zeeb 1419d3373029SBjoern A. Zeeb testrx_main \ 1420d3373029SBjoern A. Zeeb "testrx_tcp6_same_addr_all_fibs_a_time" "" ${RT_NUMFIBS} 1421d3373029SBjoern A. Zeeb} 1422d3373029SBjoern A. Zeeb 1423d3373029SBjoern A. Zeebtestrx_udp6_same_addr_all_fibs_a_time() 1424d3373029SBjoern A. Zeeb{ 1425d3373029SBjoern A. Zeeb 1426d3373029SBjoern A. Zeeb testrx_main \ 1427d3373029SBjoern A. Zeeb "testrx_udp6_same_addr_all_fibs_a_time" "-u" ${RT_NUMFIBS} 1428d3373029SBjoern A. Zeeb} 1429d3373029SBjoern A. Zeeb 1430d3373029SBjoern A. Zeeb 1431d3373029SBjoern A. Zeeb################################################################################ 1432d3373029SBjoern A. Zeeb# 1433d3373029SBjoern A. Zeeb# Prereqs. 1434d3373029SBjoern A. Zeeb# 14350e7ed5d6SBjoern A. Zeebif test `sysctl -n security.jail.jailed` -eq 0; then 1436d3373029SBjoern A. Zeeb kldload ipfw > /dev/null 2>&1 || kldstat -v | grep -q ipfw 1437d3373029SBjoern A. Zeeb 1438d3373029SBjoern A. Zeeb # Reduce the time we wait in case of no reply to 2s. 1439d3373029SBjoern A. Zeeb sysctl net.inet.tcp.keepinit=2000 > /dev/null 2>&1 14400e7ed5d6SBjoern A. Zeebfi 14410e7ed5d6SBjoern A. Zeebipfw -f flush > /dev/null 2>&1 || die "please load ipfw in base system" 14420e7ed5d6SBjoern A. Zeebipfw add 65000 permit ip from any to any > /dev/null 2>&1 1443d3373029SBjoern A. Zeeb 1444d3373029SBjoern A. Zeeb################################################################################ 1445d3373029SBjoern A. Zeeb# 1446d3373029SBjoern A. Zeeb# Run tests. 1447d3373029SBjoern A. Zeeb# 1448d3373029SBjoern A. Zeeb 1449d3373029SBjoern A. Zeeb# 64 cases at 16 FIBs. 1450d3373029SBjoern A. Zeebcheck_local_addr 1451d3373029SBjoern A. Zeebcheck_local_tun 1452d3373029SBjoern A. Zeeb 1453d3373029SBjoern A. Zeebsend_greeting 1454d3373029SBjoern A. Zeeb 1455d3373029SBjoern A. Zeeb# Initiator testing. 1456d3373029SBjoern A. Zeebfor uso in 0 1; do 1457d3373029SBjoern A. Zeeb 1458d3373029SBjoern A. Zeeb USE_SOSETFIB=${uso} 1459d3373029SBjoern A. Zeeb 1460d3373029SBjoern A. Zeeb # Only run ICMP6 tests for the first loop. 1461d3373029SBjoern A. Zeeb # 160 cases at 16 FIBs. 1462d3373029SBjoern A. Zeeb test ${uso} -ne 0 || testtx_icmp6_connected && sleep 1 1463d3373029SBjoern A. Zeeb testtx_tcp6_connected && sleep 1 1464d3373029SBjoern A. Zeeb testtx_udp6_connected && sleep 1 1465d3373029SBjoern A. Zeeb 1466d3373029SBjoern A. Zeeb # 2560 cases at 16 FIBs. 1467d3373029SBjoern A. Zeeb test ${uso} -ne 0 || testtx_icmp6_connected_blackhole && sleep 1 1468d3373029SBjoern A. Zeeb testtx_tcp6_connected_blackhole && sleep 1 1469d3373029SBjoern A. Zeeb testtx_udp6_connected_blackhole && sleep 1 1470d3373029SBjoern A. Zeeb 1471d3373029SBjoern A. Zeeb # 2560 cases at 16 FIBs. 1472d3373029SBjoern A. Zeeb test ${uso} -ne 0 || testtx_icmp6_connected_transfernets && sleep 1 1473d3373029SBjoern A. Zeeb testtx_tcp6_connected_transfernets && sleep 1 1474d3373029SBjoern A. Zeeb testtx_udp6_connected_transfernets && sleep 1 1475d3373029SBjoern A. Zeeb 1476d3373029SBjoern A. Zeeb # 2560 cases at 16 FIBs. 1477d3373029SBjoern A. Zeeb test ${uso} -ne 0 || \ 1478d3373029SBjoern A. Zeeb testtx_icmp6_connected_ifconfig_transfernets && sleep 1 1479d3373029SBjoern A. Zeeb testtx_tcp6_connected_ifconfig_transfernets && sleep 1 1480d3373029SBjoern A. Zeeb testtx_udp6_connected_ifconfig_transfernets && sleep 1 1481d3373029SBjoern A. Zeeb 1482d3373029SBjoern A. Zeeb # 160 cases at 16 FIBs. 1483d3373029SBjoern A. Zeeb test ${uso} -ne 0 || testtx_icmp6_gateway && sleep 1 1484d3373029SBjoern A. Zeeb testtx_tcp6_gateway && sleep 1 1485d3373029SBjoern A. Zeeb testtx_udp6_gateway && sleep 1 1486d3373029SBjoern A. Zeeb 1487d3373029SBjoern A. Zeeb # 160 cases at 16 FIBs. 1488d3373029SBjoern A. Zeeb test ${uso} -ne 0 || testtx_icmp6_transfernets_gateways && sleep 1 1489d3373029SBjoern A. Zeeb testtx_tcp6_transfernets_gateways && sleep 1 1490d3373029SBjoern A. Zeeb testtx_udp6_transfernets_gateways && sleep 1 1491d3373029SBjoern A. Zeeb 1492d3373029SBjoern A. Zeeb # 2560 cases at 16 FIBs. 1493d3373029SBjoern A. Zeeb test ${uso} -ne 0 || testtx_icmp6_transfernets_gateway && sleep 1 1494d3373029SBjoern A. Zeeb testtx_tcp6_transfernets_gateway && sleep 1 1495d3373029SBjoern A. Zeeb testtx_udp6_transfernets_gateway && sleep 1 1496d3373029SBjoern A. Zeebdone 1497d3373029SBjoern A. Zeeb 14980e7ed5d6SBjoern A. Zeeb# Receiver testing. 1499d3373029SBjoern A. Zeebfor uso in 0 1; do 1500d3373029SBjoern A. Zeeb 1501d3373029SBjoern A. Zeeb USE_SOSETFIB=${uso} 1502d3373029SBjoern A. Zeeb 1503d3373029SBjoern A. Zeeb # Only expect ICMP6 tests for the first loop. 1504d3373029SBjoern A. Zeeb # 6144 cases at 16 FIBs. 1505d3373029SBjoern A. Zeeb test ${uso} -ne 0 || testrx_icmp6_same_addr_one_fib_a_time && sleep 1 1506d3373029SBjoern A. Zeeb # 12288 cases at 16 FIBs. 1507d3373029SBjoern A. Zeeb testrx_tcp6_same_addr_one_fib_a_time && sleep 1 1508d3373029SBjoern A. Zeeb # 12288 cases at 16 FIBs. 1509d3373029SBjoern A. Zeeb testrx_udp6_same_addr_one_fib_a_time && sleep 1 1510d3373029SBjoern A. Zeeb 1511d3373029SBjoern A. Zeeb # 12288 cases at 16 FIBs. 1512d3373029SBjoern A. Zeeb testrx_tcp6_same_addr_all_fibs_a_time && sleep 1 1513d3373029SBjoern A. Zeeb # 12288 cases at 16 FIBs. 1514d3373029SBjoern A. Zeeb testrx_udp6_same_addr_all_fibs_a_time && sleep 1 1515d3373029SBjoern A. Zeeb 1516d3373029SBjoern A. Zeebdone 1517d3373029SBjoern A. Zeeb 1518d3373029SBjoern A. Zeebcleanup 1519d3373029SBjoern A. Zeeb 1520d3373029SBjoern A. Zeeb# end 1521