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