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# Test setup: 33d3373029SBjoern A. Zeeb# 34d3373029SBjoern A. Zeeb# left ------------------------- middle ------------------------- right 35d3373029SBjoern A. Zeeb# IFACE IFACE IFACEFAR IFACE 36d3373029SBjoern A. Zeeb# LEFTADDR MIDDLELEFTADDR MIDDLERIGHTADDR RIGHTADDR 37d3373029SBjoern A. Zeeb# forwarding=1 38d3373029SBjoern A. Zeeb# initiator FIB tests reflector 39d3373029SBjoern A. Zeeb 40d3373029SBjoern A. Zeeb# We will use the RFC5180 (and Errata) benchmarking working group prefix 41d3373029SBjoern A. Zeeb# 2001:0002::/48 for testing. 42d3373029SBjoern A. ZeebPREFIX="2001:2:" 43d3373029SBjoern A. Zeeb 44d3373029SBjoern A. Zeeb# Set IFACE to the real interface you want to run the test on. 45d3373029SBjoern A. Zeeb# IFACEFAR is only relevant on the middle (forwarding) node and will be the 46d3373029SBjoern A. Zeeb# 'right' side (far end) one. 47d3373029SBjoern A. Zeeb: ${IFACE:=lo0} 48d3373029SBjoern A. Zeeb: ${IFACEFAR:=lo0} 49d3373029SBjoern A. Zeeb 50d3373029SBjoern A. Zeeb# Number of seconds to wait for peer node to synchronize for test. 51d3373029SBjoern A. Zeeb: ${WAITS:=120} 52d3373029SBjoern A. Zeeb 53d3373029SBjoern A. Zeeb# Control port we use to exchange messages between nodes to sync. tests, etc. 54d3373029SBjoern A. Zeeb: ${CTRLPORT:=6666} 55d3373029SBjoern A. Zeeb 56d3373029SBjoern A. Zeeb# Get the number of FIBs from the kernel. 57d3373029SBjoern A. ZeebRT_NUMFIBS=`sysctl -n net.fibs` 58d3373029SBjoern A. Zeeb 59d3373029SBjoern A. Zeeb# This is the initiator and connected middle node. 60d3373029SBjoern A. ZeebLEFTADDR="2001:2:fe00::1" 61d3373029SBjoern A. ZeebMIDDLELEFTADDR="2001:2:fe00::2" 62d3373029SBjoern A. Zeeb# This is the far end middle node and receiver side. 63d3373029SBjoern A. ZeebMIDDLERIGHTADDR="2001:2:ff00::1" 64d3373029SBjoern A. ZeebRIGHTADDR="2001:2:ff00::2" 65d3373029SBjoern A. Zeeb 66d3373029SBjoern A. Zeeb# By default all commands must succeed. Individual tests may disable this 67d3373029SBjoern A. Zeeb# temporary. 68d3373029SBjoern A. Zeebset -e 69d3373029SBjoern A. Zeeb 70d3373029SBjoern A. Zeeb# Debug magic. 71d3373029SBjoern A. Zeebcase "${DEBUG}" in 72d3373029SBjoern A. Zeeb42) set -x ;; 73d3373029SBjoern A. Zeebesac 74d3373029SBjoern A. Zeeb 75d3373029SBjoern A. Zeeb 76d3373029SBjoern A. Zeeb################################################################################ 77d3373029SBjoern A. Zeeb# 78d3373029SBjoern A. Zeeb# Input validation. 79d3373029SBjoern A. Zeeb# 80d3373029SBjoern A. Zeeb 81d3373029SBjoern A. Zeebnode=$1 82d3373029SBjoern A. Zeebcase ${node} in 83d3373029SBjoern A. Zeebleft) ;; 84d3373029SBjoern A. Zeebmiddle) ;; 85d3373029SBjoern A. Zeebright) ;; 86d3373029SBjoern A. Zeeb*) echo "ERROR: invalid node name '${node}'. Must be left, middle or" \ 87d3373029SBjoern A. Zeeb " right" >&1 88d3373029SBjoern A. Zeeb exit 1 89d3373029SBjoern A. Zeeb ;; 90d3373029SBjoern A. Zeebesac 91d3373029SBjoern A. Zeeb 92d3373029SBjoern A. Zeeb################################################################################ 93d3373029SBjoern A. Zeeb# 94d3373029SBjoern A. Zeeb# Helper functions. 95d3373029SBjoern A. Zeeb# 96d3373029SBjoern A. Zeebcheck_rc() 97d3373029SBjoern A. Zeeb{ 98d3373029SBjoern A. Zeeb local _rc _exp _testno _testname _msg _r 99d3373029SBjoern A. Zeeb _rc=$1 100d3373029SBjoern A. Zeeb _exp=$2 101d3373029SBjoern A. Zeeb _testno=$3 102d3373029SBjoern A. Zeeb _testname="$4" 103d3373029SBjoern A. Zeeb _msg="$5" 104d3373029SBjoern A. Zeeb 105d3373029SBjoern A. Zeeb _r="not ok" 106d3373029SBjoern A. Zeeb if test ${_rc} -eq ${_exp}; then 107d3373029SBjoern A. Zeeb _r="ok" 108d3373029SBjoern A. Zeeb fi 109d3373029SBjoern A. Zeeb echo "${_r} ${_testno} ${_testname} # ${_msg} ${_rc} ${_exp}" 110d3373029SBjoern A. Zeeb} 111d3373029SBjoern A. Zeeb 112d3373029SBjoern A. Zeebprint_debug() 113d3373029SBjoern A. Zeeb{ 114d3373029SBjoern A. Zeeb local _msg 115d3373029SBjoern A. Zeeb _msg="$*" 116d3373029SBjoern A. Zeeb 117d3373029SBjoern A. Zeeb case ${DEBUG} in 118d3373029SBjoern A. Zeeb ''|0) ;; 119d3373029SBjoern A. Zeeb *) echo "DEBUG: ${_msg}" >&2 ;; 120d3373029SBjoern A. Zeeb esac 121d3373029SBjoern A. Zeeb} 122d3373029SBjoern A. Zeeb 123d3373029SBjoern A. Zeebdie() 124d3373029SBjoern A. Zeeb{ 125d3373029SBjoern A. Zeeb local _msg 126d3373029SBjoern A. Zeeb _msg="$*" 127d3373029SBjoern A. Zeeb 128d3373029SBjoern A. Zeeb echo "ERROR: ${_msg}" >&2 129d3373029SBjoern A. Zeeb exit 1 130d3373029SBjoern A. Zeeb} 131d3373029SBjoern A. Zeeb 132d3373029SBjoern A. Zeeb 133d3373029SBjoern A. Zeeb################################################################################ 134d3373029SBjoern A. Zeeb# 135d3373029SBjoern A. Zeeb# Functions to configure networking and do a basic reachability check. 136d3373029SBjoern A. Zeeb# 137d3373029SBjoern A. Zeeb 138d3373029SBjoern A. Zeebsetup_networking() 139d3373029SBjoern A. Zeeb{ 140d3373029SBjoern A. Zeeb 141d3373029SBjoern A. Zeeb print_debug "Setting up networking" 142d3373029SBjoern A. Zeeb case ${node} in 143d3373029SBjoern A. Zeeb left) ifconfig ${IFACE} inet6 ${LEFTADDR}/64 -alias \ 144d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 145d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 ${LEFTADDR}/64 alias up 146d3373029SBjoern A. Zeeb ifconfig ${IFACE} fib 0 147d3373029SBjoern A. Zeeb sysctl net.inet6.ip6.forwarding=0 > /dev/null 148d3373029SBjoern A. Zeeb route delete -net -inet6 default > /dev/null 2>&1 || true 149d3373029SBjoern A. Zeeb route delete -host -inet6 ${RIGHTADDR} ${MIDDLELEFTADDR} \ 150d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 151d3373029SBjoern A. Zeeb route add -host -inet6 ${RIGHTADDR} ${MIDDLELEFTADDR} \ 152d3373029SBjoern A. Zeeb > /dev/null 153d3373029SBjoern A. Zeeb route delete -host -inet6 ${MIDDLERIGHTADDR} ${MIDDLELEFTADDR} \ 154d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 155d3373029SBjoern A. Zeeb route add -host -inet6 ${MIDDLERIGHTADDR} ${MIDDLELEFTADDR} \ 156d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 157d3373029SBjoern A. Zeeb ;; 158d3373029SBjoern A. Zeeb middle) ifconfig ${IFACE} inet6 ${MIDDLELEFTADDR}/64 -alias \ 159d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 160d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 ${MIDDLELEFTADDR}/64 alias up 161d3373029SBjoern A. Zeeb ifconfig ${IFACE} fib 0 162d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} inet6 ${MIDDLERIGHTADDR}/64 -alias \ 163d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 164d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} inet6 ${MIDDLERIGHTADDR}/64 alias up 165d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} fib 0 166d3373029SBjoern A. Zeeb sysctl net.inet6.ip6.forwarding=1 > /dev/null 167d3373029SBjoern A. Zeeb ;; 168d3373029SBjoern A. Zeeb right) ifconfig ${IFACE} inet6 ${RIGHTADDR}/64 -alias \ 169d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 170d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 ${RIGHTADDR}/64 alias up 171d3373029SBjoern A. Zeeb ifconfig ${IFACE} fib 0 172d3373029SBjoern A. Zeeb sysctl net.inet6.ip6.forwarding=0 > /dev/null 173d3373029SBjoern A. Zeeb route delete -net -inet6 default > /dev/null 2>&1 || true 174d3373029SBjoern A. Zeeb route delete -host -inet6 ${LEFTADDR} ${MIDDLERIGHTADDR} \ 175d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 176d3373029SBjoern A. Zeeb route add -host -inet6 ${LEFTADDR} ${MIDDLERIGHTADDR} \ 177d3373029SBjoern A. Zeeb > /dev/null 178d3373029SBjoern A. Zeeb route delete -host -inet6 ${MIDDLELEFTADDR} ${MIDDLERIGHTADDR} \ 179d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 180d3373029SBjoern A. Zeeb route add -host -inet6 ${MIDDLELEFTADDR} ${MIDDLERIGHTADDR} \ 181d3373029SBjoern A. Zeeb > /dev/null 182d3373029SBjoern A. Zeeb ;; 183d3373029SBjoern A. Zeeb esac 184d3373029SBjoern A. Zeeb 185d3373029SBjoern A. Zeeb # Let things settle. 186d3373029SBjoern A. Zeeb print_debug "Waiting 4 seconds for things to settle" 187d3373029SBjoern A. Zeeb sleep 4 188d3373029SBjoern A. Zeeb} 189d3373029SBjoern A. Zeeb 190d3373029SBjoern A. Zeebcleanup_networking() 191d3373029SBjoern A. Zeeb{ 192d3373029SBjoern A. Zeeb 193d3373029SBjoern A. Zeeb case ${node} in 194d3373029SBjoern A. Zeeb left) ifconfig ${IFACE} inet6 ${LEFTADDR}/64 -alias 195d3373029SBjoern A. Zeeb ;; 196d3373029SBjoern A. Zeeb middle) ifconfig ${IFACE} inet6 ${MIDDLELEFTADDR}/64 -alias 197d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} inet6 ${MIDDLERIGHTADDR}/64 -alias 198d3373029SBjoern A. Zeeb sysctl net.inet6.ip6.forwarding=0 > /dev/null 199d3373029SBjoern A. Zeeb ;; 200d3373029SBjoern A. Zeeb right) ifconfig ${IFACE} inet6 ${RIGHTADDR}/64 -alias 201d3373029SBjoern A. Zeeb ;; 202d3373029SBjoern A. Zeeb esac 203d3373029SBjoern A. Zeeb print_debug "Cleaned up networking" 204d3373029SBjoern A. Zeeb} 205d3373029SBjoern A. Zeeb 206d3373029SBjoern A. Zeeb_reachability_check() 207d3373029SBjoern A. Zeeb{ 208d3373029SBjoern A. Zeeb local _addr _rc 209d3373029SBjoern A. Zeeb _addr="$1" 210d3373029SBjoern A. Zeeb 211d3373029SBjoern A. Zeeb ping6 -n -c1 ${_addr} > /dev/null 2>&1 212d3373029SBjoern A. Zeeb _rc=$? 213d3373029SBjoern A. Zeeb case ${_rc} in 214d3373029SBjoern A. Zeeb 0) ;; 215d3373029SBjoern A. Zeeb *) print_debug "cannot ping6 ${_addr}, rc=${_rc}" 216d3373029SBjoern A. Zeeb return 1 217d3373029SBjoern A. Zeeb ;; 218d3373029SBjoern A. Zeeb esac 219d3373029SBjoern A. Zeeb return 0 220d3373029SBjoern A. Zeeb} 221d3373029SBjoern A. Zeeb 222d3373029SBjoern A. Zeebreachability_check() 223d3373029SBjoern A. Zeeb{ 224*0e7ed5d6SBjoern A. Zeeb local _i rc 225d3373029SBjoern A. Zeeb 226d3373029SBjoern A. Zeeb # Try to reach all control addresses on other nodes. 227d3373029SBjoern A. Zeeb # We need to loop for a while as we cannot expect all to be up 228d3373029SBjoern A. Zeeb # the very same moment. 229d3373029SBjoern A. Zeeb i=1 230*0e7ed5d6SBjoern A. Zeeb rc=42 231*0e7ed5d6SBjoern A. Zeeb while test ${rc} -ne 0 -a ${i} -le ${WAITS}; do 232d3373029SBjoern A. Zeeb print_debug "${i}/${WAITS} trying to ping6 control addresses." 233*0e7ed5d6SBjoern A. Zeeb rc=0 234d3373029SBjoern A. Zeeb set +e 235d3373029SBjoern A. Zeeb case ${node} in 236d3373029SBjoern A. Zeeb left) _reachability_check ${MIDDLELEFTADDR} 237*0e7ed5d6SBjoern A. Zeeb rc=$((rc + $?)) 238d3373029SBjoern A. Zeeb _reachability_check ${MIDDLERIGHTADDR} 239*0e7ed5d6SBjoern A. Zeeb rc=$((rc + $?)) 240d3373029SBjoern A. Zeeb _reachability_check ${RIGHTADDR} 241*0e7ed5d6SBjoern A. Zeeb rc=$((rc + $?)) 242d3373029SBjoern A. Zeeb ;; 243d3373029SBjoern A. Zeeb middle) _reachability_check ${LEFTADDR} 244*0e7ed5d6SBjoern A. Zeeb rc=$((rc + $?)) 245d3373029SBjoern A. Zeeb _reachability_check ${RIGHTADDR} 246*0e7ed5d6SBjoern A. Zeeb rc=$((rc + $?)) 247d3373029SBjoern A. Zeeb ;; 248d3373029SBjoern A. Zeeb right) _reachability_check ${MIDDLERIGHTADDR} 249*0e7ed5d6SBjoern A. Zeeb rc=$((rc + $?)) 250d3373029SBjoern A. Zeeb _reachability_check ${MIDDLELEFTADDR} 251*0e7ed5d6SBjoern A. Zeeb rc=$((rc + $?)) 252d3373029SBjoern A. Zeeb _reachability_check ${LEFTADDR} 253*0e7ed5d6SBjoern A. Zeeb rc=$((rc + $?)) 254d3373029SBjoern A. Zeeb ;; 255d3373029SBjoern A. Zeeb esac 256d3373029SBjoern A. Zeeb set -e 257d3373029SBjoern A. Zeeb sleep 1 258d3373029SBjoern A. Zeeb i=$((i + 1)) 259d3373029SBjoern A. Zeeb done 260d3373029SBjoern A. Zeeb} 261d3373029SBjoern A. Zeeb 262d3373029SBjoern A. Zeeb################################################################################ 263d3373029SBjoern A. Zeeb# 264d3373029SBjoern A. Zeeb# "Greeting" handling to sync notes to the agreed upon next test case. 265d3373029SBjoern A. Zeeb# 266d3373029SBjoern A. Zeebsend_control_msg() 267d3373029SBjoern A. Zeeb{ 268d3373029SBjoern A. Zeeb local _case _addr i rc _msg _keyword _fibs 269d3373029SBjoern A. Zeeb _case="$1" 270d3373029SBjoern A. Zeeb _addr="$2" 271d3373029SBjoern A. Zeeb 272d3373029SBjoern A. Zeeb set +e 273d3373029SBjoern A. Zeeb i=0 274d3373029SBjoern A. Zeeb rc=-1 275d3373029SBjoern A. Zeeb while test ${i} -lt ${WAITS} -a ${rc} -ne 0; do 276d3373029SBjoern A. Zeeb print_debug "Sending control msg #${i} to peer ${_addr}" 277d3373029SBjoern A. Zeeb _msg=`echo "${_case} ${RT_NUMFIBS}" | \ 278d3373029SBjoern A. Zeeb nc -6 -w 1 ${_addr} ${CTRLPORT}` 279d3373029SBjoern A. Zeeb rc=$? 280d3373029SBjoern A. Zeeb i=$((i + 1)) 281d3373029SBjoern A. Zeeb # Might sleep longer in total but better than to DoS 282d3373029SBjoern A. Zeeb # and not get anywhere. 283d3373029SBjoern A. Zeeb sleep 1 284d3373029SBjoern A. Zeeb done 285d3373029SBjoern A. Zeeb set -e 286d3373029SBjoern A. Zeeb 287d3373029SBjoern A. Zeeb read _keyword _fibs <<EOI 288d3373029SBjoern A. Zeeb${_msg} 289d3373029SBjoern A. ZeebEOI 290d3373029SBjoern A. Zeeb print_debug "_keyword=${_keyword}" 291d3373029SBjoern A. Zeeb print_debug "_fibs=${_fibs}" 292d3373029SBjoern A. Zeeb case ${_keyword} in 293d3373029SBjoern A. Zeeb ${_case});; 294d3373029SBjoern A. Zeeb *) die "Got invalid keyword from ${_addr} in control message:" \ 295d3373029SBjoern A. Zeeb "${_msg}" 296d3373029SBjoern A. Zeeb ;; 297d3373029SBjoern A. Zeeb esac 298d3373029SBjoern A. Zeeb if test ${_fibs} -ne ${RT_NUMFIBS}; then 299d3373029SBjoern A. Zeeb die "Number of FIBs not matching ours (${RT_NUMFIBS}) in" \ 300d3373029SBjoern A. Zeeb "control message from ${_addr}: ${_msg}" 301d3373029SBjoern A. Zeeb fi 302d3373029SBjoern A. Zeeb 303d3373029SBjoern A. Zeeb print_debug "Successfully exchanged control message with ${_addr}." 304d3373029SBjoern A. Zeeb} 305d3373029SBjoern A. Zeeb 306d3373029SBjoern A. Zeebsend_control_msgs() 307d3373029SBjoern A. Zeeb{ 308d3373029SBjoern A. Zeeb local _case _addr 309d3373029SBjoern A. Zeeb _case="$1" 310d3373029SBjoern A. Zeeb 311d3373029SBjoern A. Zeeb # Always start with the far end. Otherwise we will cut that off when 312d3373029SBjoern A. Zeeb # cleanly taering down things again. 313d3373029SBjoern A. Zeeb for _addr in ${RIGHTADDR} ${MIDDLELEFTADDR}; do 314d3373029SBjoern A. Zeeb send_control_msg "${_case}" ${_addr} 315d3373029SBjoern A. Zeeb done 316d3373029SBjoern A. Zeeb 317d3373029SBjoern A. Zeeb # Allow us to flush ipfw counters etc before new packets will arrive. 318d3373029SBjoern A. Zeeb sleep 1 319d3373029SBjoern A. Zeeb} 320d3373029SBjoern A. Zeeb 321d3373029SBjoern A. Zeeb# We are setup. Wait for the initiator to tell us that it is ready. 322d3373029SBjoern A. Zeebwait_remote_ready() 323d3373029SBjoern A. Zeeb{ 324d3373029SBjoern A. Zeeb local _case _msg _keyword _fibs 325d3373029SBjoern A. Zeeb _case="$1" 326d3373029SBjoern A. Zeeb 327d3373029SBjoern A. Zeeb # Wait for the remote to connect and start things. 328d3373029SBjoern A. Zeeb # We tell it the magic keyword, and our number of FIBs. 329d3373029SBjoern A. Zeeb _msg=`echo "${_case} ${RT_NUMFIBS}" | nc -6 -l ${CTRLPORT}` 330d3373029SBjoern A. Zeeb 331d3373029SBjoern A. Zeeb read _keyword _fibs <<EOI 332d3373029SBjoern A. Zeeb${_msg} 333d3373029SBjoern A. ZeebEOI 334d3373029SBjoern A. Zeeb print_debug "_keyword=${_keyword}" 335d3373029SBjoern A. Zeeb print_debug "_fibs=${_fibs}" 336d3373029SBjoern A. Zeeb case ${_keyword} in 337d3373029SBjoern A. Zeeb ${_case});; 338d3373029SBjoern A. Zeeb *) die "Got invalid keyword in control message: ${_msg}" 339d3373029SBjoern A. Zeeb ;; 340d3373029SBjoern A. Zeeb esac 341d3373029SBjoern A. Zeeb if test ${_fibs} -ne ${RT_NUMFIBS}; then 342d3373029SBjoern A. Zeeb die "Number of FIBs not matching ours (${RT_NUMFIBS}) in" \ 343d3373029SBjoern A. Zeeb "control message: ${_msg}" 344d3373029SBjoern A. Zeeb fi 345d3373029SBjoern A. Zeeb 346d3373029SBjoern A. Zeeb print_debug "Successfully received control message." 347d3373029SBjoern A. Zeeb} 348d3373029SBjoern A. Zeeb 349d3373029SBjoern A. Zeeb################################################################################ 350d3373029SBjoern A. Zeeb# 351d3373029SBjoern A. Zeeb# Test case helper functions. 352d3373029SBjoern A. Zeeb# 353d3373029SBjoern A. Zeeb# Please note that neither on the intiator nor the reflector are FIBs despite 354d3373029SBjoern A. Zeeb# a variable name might indicate. If such a variable is used it mirrors FIB 355d3373029SBjoern A. Zeeb# numbers from the middle node to match for test cases. 356d3373029SBjoern A. Zeeb# 357d3373029SBjoern A. Zeebtest_icmp6() 358d3373029SBjoern A. Zeeb{ 359d3373029SBjoern A. Zeeb local _maxfibs _addr _n _testno i _rc _ec 360d3373029SBjoern A. Zeeb _maxfibs=$1 361d3373029SBjoern A. Zeeb _addr="$2" 362d3373029SBjoern A. Zeeb _n="$3" 363d3373029SBjoern A. Zeeb 364d3373029SBjoern A. Zeeb printf "1..%d\n" ${_maxfibs} 365d3373029SBjoern A. Zeeb _testno=1 366d3373029SBjoern A. Zeeb set +e 367d3373029SBjoern A. Zeeb i=0 368d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfibs}; do 369d3373029SBjoern A. Zeeb _txt="${_n}_${i}" 370d3373029SBjoern A. Zeeb print_debug "Testing ${_txt}" 371d3373029SBjoern A. Zeeb 372d3373029SBjoern A. Zeeb # Generate HEX for ping6 payload. 373d3373029SBjoern A. Zeeb _fibtxt=`echo "${_txt}" | hd -v | cut -b11-60 | tr -d ' \r\n'` 374d3373029SBjoern A. Zeeb 375d3373029SBjoern A. Zeeb eval _rc="\${rc_${i}}" 376d3373029SBjoern A. Zeeb ping6 -n -c1 -p ${_fibtxt} ${_addr} > /dev/null 2>&1 377d3373029SBjoern A. Zeeb _ec=$? 378d3373029SBjoern A. Zeeb # We need to normalize the exit code of ping6. 379d3373029SBjoern A. Zeeb case ${_ec} in 380d3373029SBjoern A. Zeeb 0) ;; 381d3373029SBjoern A. Zeeb *) _ec=1 ;; 382d3373029SBjoern A. Zeeb esac 383d3373029SBjoern A. Zeeb check_rc ${_ec} ${_rc} ${_testno} "${_txt}" "FIB ${i} ${_addr}" 384d3373029SBjoern A. Zeeb testno=$((testno + 1)) 385d3373029SBjoern A. Zeeb i=$((i + 1)) 386d3373029SBjoern A. Zeeb done 387d3373029SBjoern A. Zeeb set -e 388d3373029SBjoern A. Zeeb} 389d3373029SBjoern A. Zeeb 390d3373029SBjoern A. Zeebtest_ulp_reflect_one() 391d3373029SBjoern A. Zeeb{ 392*0e7ed5d6SBjoern A. Zeeb local _txt _opts port fib 393d3373029SBjoern A. Zeeb _txt="$1" 394d3373029SBjoern A. Zeeb _opts="$2" 395*0e7ed5d6SBjoern A. Zeeb port=$3 396*0e7ed5d6SBjoern A. Zeeb fib=$4 397d3373029SBjoern A. Zeeb 398*0e7ed5d6SBjoern A. Zeeb print_debug "./reflect -p $((port + 1 + fib)) -t ${_txt}" "${_opts}" 399*0e7ed5d6SBjoern A. Zeeb ./reflect -p $((port + 1 + fib)) -t ${_txt} ${_opts} 400d3373029SBjoern A. Zeeb print_debug "reflect '${_txt}' terminated without error." 401d3373029SBjoern A. Zeeb} 402d3373029SBjoern A. Zeeb 403d3373029SBjoern A. Zeebtest_ulp_reflect_multiple() 404d3373029SBjoern A. Zeeb{ 405d3373029SBjoern A. Zeeb local _maxfibs _txt _opts i _jobs _p 406d3373029SBjoern A. Zeeb _maxfibs=$1 407d3373029SBjoern A. Zeeb _txt="$2" 408d3373029SBjoern A. Zeeb _opts="$3" 409d3373029SBjoern A. Zeeb 410d3373029SBjoern A. Zeeb i=0 411d3373029SBjoern A. Zeeb _jobs="" 412d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfibs}; do 413d3373029SBjoern A. Zeeb print_debug "./reflect -p $((CTRLPORT + 1000 + i))" \ 414d3373029SBjoern A. Zeeb "-t ${_txt} ${_opts} -N -f ${i} &" 415d3373029SBjoern A. Zeeb ./reflect -p $((CTRLPORT + 1000 + i)) \ 416d3373029SBjoern A. Zeeb -t ${_txt} ${_opts} -N -f ${i} & 417d3373029SBjoern A. Zeeb _p=$! 418d3373029SBjoern A. Zeeb _jobs="${_jobs}${_p} " 419d3373029SBjoern A. Zeeb i=$((i + 1)) 420d3373029SBjoern A. Zeeb done 421d3373029SBjoern A. Zeeb 422d3373029SBjoern A. Zeeb # Start OOB control connection for START/DONE. 423d3373029SBjoern A. Zeeb testrx_run_one "${_txt}" "${_opts}" 424d3373029SBjoern A. Zeeb print_debug "KILL ${_jobs}" 425d3373029SBjoern A. Zeeb for i in ${_jobs}; do 426d3373029SBjoern A. Zeeb kill ${i} || true 427d3373029SBjoern A. Zeeb done 428d3373029SBjoern A. Zeeb #killall reflect || true 429d3373029SBjoern A. Zeeb print_debug "reflects for '${_txt}' terminated without error." 430d3373029SBjoern A. Zeeb} 431d3373029SBjoern A. Zeeb 432d3373029SBjoern A. Zeebnc_send_recv() 433d3373029SBjoern A. Zeeb{ 434d3373029SBjoern A. Zeeb local _loops _msg _expreply _addr _port _opts i 435d3373029SBjoern A. Zeeb _loops=$1 436d3373029SBjoern A. Zeeb _msg="$2" 437d3373029SBjoern A. Zeeb _expreply="$3" 438d3373029SBjoern A. Zeeb _addr=$4 439d3373029SBjoern A. Zeeb _port=$5 440d3373029SBjoern A. Zeeb _opts="$6" 441d3373029SBjoern A. Zeeb 442d3373029SBjoern A. Zeeb i=0 443d3373029SBjoern A. Zeeb while test ${i} -lt ${_loops}; do 444d3373029SBjoern A. Zeeb i=$((i + 1)) 445d3373029SBjoern A. Zeeb print_debug "e ${_msg} | nc -6 -w1 ${_opts} ${_addr} ${_port}" 446d3373029SBjoern A. Zeeb _reply=`echo "${_msg}" | nc -6 -w1 ${_opts} ${_addr} ${_port}` 447d3373029SBjoern A. Zeeb if test "${_reply}" != "${_expreply}"; then 448d3373029SBjoern A. Zeeb if test ${i} -lt ${_loops}; then 449d3373029SBjoern A. Zeeb sleep 1 450d3373029SBjoern A. Zeeb else 451d3373029SBjoern A. Zeeb # Must let caller decide how to handle the error. 452d3373029SBjoern A. Zeeb # die "Got invalid reply from peer." \ 453d3373029SBjoern A. Zeeb # "Expected '${_expreply}', got '${_reply}'" 454d3373029SBjoern A. Zeeb return 1 455d3373029SBjoern A. Zeeb fi 456d3373029SBjoern A. Zeeb else 457d3373029SBjoern A. Zeeb break 458d3373029SBjoern A. Zeeb fi 459d3373029SBjoern A. Zeeb done 460d3373029SBjoern A. Zeeb return 0 461d3373029SBjoern A. Zeeb} 462d3373029SBjoern A. Zeeb 463d3373029SBjoern A. Zeebtest_ulp() 464d3373029SBjoern A. Zeeb{ 465*0e7ed5d6SBjoern A. Zeeb local maxfibs _msg _addr port fib i _txt testno _rc _reply 466*0e7ed5d6SBjoern A. Zeeb maxfibs=$1 467d3373029SBjoern A. Zeeb _msg="$2" 468d3373029SBjoern A. Zeeb _addr=$3 469*0e7ed5d6SBjoern A. Zeeb port=$4 470*0e7ed5d6SBjoern A. Zeeb fib=$5 471d3373029SBjoern A. Zeeb 472*0e7ed5d6SBjoern A. Zeeb printf "1..%d\n" $((${maxfibs} * 2)) 473d3373029SBjoern A. Zeeb testno=1 474d3373029SBjoern A. Zeeb i=0 475*0e7ed5d6SBjoern A. Zeeb while test ${i} -lt ${maxfibs}; do 476d3373029SBjoern A. Zeeb 477*0e7ed5d6SBjoern A. Zeeb if test ${i} -eq $((${maxfibs} - 1)); then 478d3373029SBjoern A. Zeeb # Last one; signal DONE. 479d3373029SBjoern A. Zeeb _txt="DONE ${_msg}_${i}" 480d3373029SBjoern A. Zeeb else 481d3373029SBjoern A. Zeeb _txt="DONE ${_msg}_${i}" 482d3373029SBjoern A. Zeeb fi 483d3373029SBjoern A. Zeeb 484d3373029SBjoern A. Zeeb eval _rc="\${rc_${i}}" 485d3373029SBjoern A. Zeeb 486d3373029SBjoern A. Zeeb # Test TCP. 487*0e7ed5d6SBjoern A. Zeeb nc_send_recv ${maxfibs} "${_txt}" "${_txt}" ${_addr} \ 488*0e7ed5d6SBjoern A. Zeeb $((${port} + 1 + fib)) "" 489d3373029SBjoern A. Zeeb check_rc $? ${_rc} ${testno} "${_msg}_${i}_tcp" \ 490*0e7ed5d6SBjoern A. Zeeb "[${_addr}]:$((${port} + 1 + fib)) ${_reply}" 491d3373029SBjoern A. Zeeb testno=$((testno + 1)) 492d3373029SBjoern A. Zeeb sleep 1 493d3373029SBjoern A. Zeeb 494d3373029SBjoern A. Zeeb # Test UDP. 495*0e7ed5d6SBjoern A. Zeeb nc_send_recv ${maxfibs} "${_txt}" "${_txt}" ${_addr} \ 496*0e7ed5d6SBjoern A. Zeeb $((${port} + 1 + fib)) "-u" 497d3373029SBjoern A. Zeeb check_rc $? ${_rc} ${testno} "${_msg}_${i}_udp" \ 498*0e7ed5d6SBjoern A. Zeeb "[${_addr}]:$((${port} + 1 + fib)) ${_reply}" 499d3373029SBjoern A. Zeeb sleep 1 500d3373029SBjoern A. Zeeb 501d3373029SBjoern A. Zeeb i=$((i + 1)) 502d3373029SBjoern A. Zeeb testno=$((testno + 1)) 503d3373029SBjoern A. Zeeb done 504d3373029SBjoern A. Zeeb} 505d3373029SBjoern A. Zeeb 506d3373029SBjoern A. Zeebsetup_ipfw_count() 507d3373029SBjoern A. Zeeb{ 508*0e7ed5d6SBjoern A. Zeeb local i port maxfib _p _fib _ofib 509*0e7ed5d6SBjoern A. Zeeb port=$1 510*0e7ed5d6SBjoern A. Zeeb maxfib=$2 511d3373029SBjoern A. Zeeb _fib=$3 512d3373029SBjoern A. Zeeb _ofib=$4 513d3373029SBjoern A. Zeeb 514d3373029SBjoern A. Zeeb i=0 515*0e7ed5d6SBjoern A. Zeeb while test ${i} -lt ${maxfib}; do 516d3373029SBjoern A. Zeeb 517d3373029SBjoern A. Zeeb case ${_ofib} in 518*0e7ed5d6SBjoern A. Zeeb -1) _p=$((port + 1 + i)) ;; 519*0e7ed5d6SBjoern A. Zeeb *) _p=$((port + 1 + maxfib - 1 - i)) ;; 520d3373029SBjoern A. Zeeb esac 521d3373029SBjoern A. Zeeb 522d3373029SBjoern A. Zeeb # Only count ICMP6 echo replies. 523d3373029SBjoern A. Zeeb ipfw add $((10000 + i)) count ipv6-icmp from any to any \ 524d3373029SBjoern A. Zeeb icmp6types 129 fib ${i} via ${IFACE} out > /dev/null 525d3373029SBjoern A. Zeeb ipfw add $((10000 + i)) count tcp from any to any \ 526d3373029SBjoern A. Zeeb src-port ${_p} fib ${i} via ${IFACE} out > /dev/null 527d3373029SBjoern A. Zeeb ipfw add $((10000 + i)) count udp from any to any \ 528d3373029SBjoern A. Zeeb src-port ${_p} fib ${i} via ${IFACE} out > /dev/null 529d3373029SBjoern A. Zeeb 530d3373029SBjoern A. Zeeb # Only count ICMP6 echo requests. 531d3373029SBjoern A. Zeeb ipfw add $((20000 + i)) count ipv6-icmp from any to any \ 532d3373029SBjoern A. Zeeb icmp6types 128 fib ${i} via ${IFACEFAR} out > /dev/null 533d3373029SBjoern A. Zeeb ipfw add $((20000 + i)) count tcp from any to any \ 534*0e7ed5d6SBjoern A. Zeeb dst-port $((${port} + 1 + i)) fib ${i} \ 535d3373029SBjoern A. Zeeb via ${IFACEFAR} out > /dev/null 536d3373029SBjoern A. Zeeb ipfw add $((20000 + i)) count udp from any to any \ 537*0e7ed5d6SBjoern A. Zeeb dst-port $((${port} + 1 + i)) fib ${i} \ 538d3373029SBjoern A. Zeeb via ${IFACEFAR} out > /dev/null 539d3373029SBjoern A. Zeeb 540d3373029SBjoern A. Zeeb i=$((i + 1)) 541d3373029SBjoern A. Zeeb done 542d3373029SBjoern A. Zeeb} 543d3373029SBjoern A. Zeeb 544d3373029SBjoern A. Zeebreport_ipfw_count() 545d3373029SBjoern A. Zeeb{ 546*0e7ed5d6SBjoern A. Zeeb local _fib _o i _rstr _c _req _p _opts base 547d3373029SBjoern A. Zeeb _o="$2" 548d3373029SBjoern A. Zeeb 549d3373029SBjoern A. Zeeb case ${DEBUG} in 550d3373029SBjoern A. Zeeb ''|0) ;; 551d3373029SBjoern A. Zeeb *) ipfw show ;; 552d3373029SBjoern A. Zeeb esac 553d3373029SBjoern A. Zeeb 554d3373029SBjoern A. Zeeb _rstr="RESULTS " 555*0e7ed5d6SBjoern A. Zeeb for base in 10000 20000; do 556d3373029SBjoern A. Zeeb for _o in i t u; do 557*0e7ed5d6SBjoern A. Zeeb case ${base} in 558d3373029SBjoern A. Zeeb 10000) _rstr="${_rstr}\nLEFT " ;; 559d3373029SBjoern A. Zeeb 20000) _rstr="${_rstr}\nRIGHT " ;; 560d3373029SBjoern A. Zeeb esac 561d3373029SBjoern A. Zeeb case ${_o} in 562d3373029SBjoern A. Zeeb i) _rstr="${_rstr}ICMP6 " ;; 563d3373029SBjoern A. Zeeb t) _rstr="${_rstr}TCP " ;; 564d3373029SBjoern A. Zeeb u) _rstr="${_rstr}UDP " ;; 565d3373029SBjoern A. Zeeb esac 566d3373029SBjoern A. Zeeb i=0 567d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 568d3373029SBjoern A. Zeeb 569d3373029SBjoern A. Zeeb case "${_o}" in 570*0e7ed5d6SBjoern A. Zeeb i) _c=`ipfw show $((${base} + i)) | \ 571d3373029SBjoern A. Zeeb awk '/ ipv6-icmp / { print $2 }'` ;; 572*0e7ed5d6SBjoern A. Zeeb t) _c=`ipfw show $((${base} + i)) | \ 573d3373029SBjoern A. Zeeb awk '/ tcp / { print $2 }'` ;; 574*0e7ed5d6SBjoern A. Zeeb u) _c=`ipfw show $((${base} + i)) | \ 575d3373029SBjoern A. Zeeb awk '/ udp / { print $2 }'` ;; 576d3373029SBjoern A. Zeeb esac 577d3373029SBjoern A. Zeeb _rstr="${_rstr}${i} ${_c}," 578d3373029SBjoern A. Zeeb 579d3373029SBjoern A. Zeeb i=$((i + 1)) 580d3373029SBjoern A. Zeeb done 581d3373029SBjoern A. Zeeb done 582d3373029SBjoern A. Zeeb i=0 583d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 584*0e7ed5d6SBjoern A. Zeeb ipfw delete $((${base} + i)) > /dev/null 2>&1 || true 585d3373029SBjoern A. Zeeb i=$((i + 1)) 586d3373029SBjoern A. Zeeb done 587d3373029SBjoern A. Zeeb done 588d3373029SBjoern A. Zeeb 589d3373029SBjoern A. Zeeb # We do not care about the request. 590d3373029SBjoern A. Zeeb _req=`printf "${_rstr}" | nc -6 -l $((${CTRLPORT} - 1))` 591d3373029SBjoern A. Zeeb print_debug "$? -- ${_req} -- ${_rstr}" 592d3373029SBjoern A. Zeeb} 593d3373029SBjoern A. Zeeb 594d3373029SBjoern A. Zeebfetch_ipfw_count() 595d3373029SBjoern A. Zeeb{ 596d3373029SBjoern A. Zeeb local _n _reply _line _edge _type _fib _count _rc _ec _status 597d3373029SBjoern A. Zeeb _n="$1" 598d3373029SBjoern A. Zeeb 599d3373029SBjoern A. Zeeb # Leave node some time to build result set. 600d3373029SBjoern A. Zeeb sleep 3 601d3373029SBjoern A. Zeeb 602d3373029SBjoern A. Zeeb print_debug "Asking for ipfw count results..." 603d3373029SBjoern A. Zeeb set +e 604d3373029SBjoern A. Zeeb nc_send_recv 1 "RESULT REQUEST" "" ${MIDDLELEFTADDR} \ 605d3373029SBjoern A. Zeeb $((${CTRLPORT} - 1)) "" 606d3373029SBjoern A. Zeeb set -e 607d3373029SBjoern A. Zeeb case "${_reply}" in 608d3373029SBjoern A. Zeeb RESULTS\ *) ;; 609d3373029SBjoern A. Zeeb *) die "Got invalid reply from peer." \ 610d3373029SBjoern A. Zeeb "Expected 'RESULTS ...', got '${_reply}'" ;; 611d3373029SBjoern A. Zeeb esac 612d3373029SBjoern A. Zeeb 613d3373029SBjoern A. Zeeb # Trim "RESULTS " 614d3373029SBjoern A. Zeeb _reply=${_reply#* } 615d3373029SBjoern A. Zeeb 616d3373029SBjoern A. Zeeb # FIBs * {left, right} * {icmp6, tcp, udp} 617d3373029SBjoern A. Zeeb printf "1..%d\n" $((RT_NUMFIBS * 2 * 3)) 618d3373029SBjoern A. Zeeb testno=1 619d3373029SBjoern A. Zeeb while read _line; do 620d3373029SBjoern A. Zeeb print_debug "_line == ${_line}" 621d3373029SBjoern A. Zeeb _edge=${_line%% *} 622d3373029SBjoern A. Zeeb _line=${_line#* } 623d3373029SBjoern A. Zeeb _type=${_line%% *} 624d3373029SBjoern A. Zeeb _line=${_line#* } 625d3373029SBjoern A. Zeeb 626d3373029SBjoern A. Zeeb while read _fib _count; do 627d3373029SBjoern A. Zeeb eval _em="\${rc_${_n}_${_edge}_${_type}_${_fib}}" 628d3373029SBjoern A. Zeeb : ${_em:=-42} 629d3373029SBjoern A. Zeeb if test ${_count} -gt 0; then 630d3373029SBjoern A. Zeeb _rc=1 631d3373029SBjoern A. Zeeb else 632d3373029SBjoern A. Zeeb _rc=0 633d3373029SBjoern A. Zeeb fi 634d3373029SBjoern A. Zeeb if test ${_rc} -eq ${_em}; then 635d3373029SBjoern A. Zeeb _status="ok" 636d3373029SBjoern A. Zeeb else 637d3373029SBjoern A. Zeeb _status="not ok" 638d3373029SBjoern A. Zeeb fi 639d3373029SBjoern A. Zeeb printf "%s %d %s # count=%s _rc=%d _em=%d\n" \ 640d3373029SBjoern A. Zeeb "${_status}" ${testno} "${_n}_${_edge}_${_type}_${_fib}" \ 641d3373029SBjoern A. Zeeb ${_count} ${_rc} ${_em} 642d3373029SBjoern A. Zeeb testno=$((testno + 1)) 643d3373029SBjoern A. Zeeb done <<EOi 644d3373029SBjoern A. Zeeb`printf "${_line}" | tr ',' '\n'` 645d3373029SBjoern A. ZeebEOi 646d3373029SBjoern A. Zeeb 647d3373029SBjoern A. Zeeb done <<EOo 648d3373029SBjoern A. Zeeb`printf "${_reply}" | grep -v "^$"` 649d3373029SBjoern A. ZeebEOo 650d3373029SBjoern A. Zeeb 651d3373029SBjoern A. Zeeb print_debug "ipfw count results processed" 652d3373029SBjoern A. Zeeb} 653d3373029SBjoern A. Zeeb 654d3373029SBjoern A. Zeeb################################################################################ 655d3373029SBjoern A. Zeeb# 656d3373029SBjoern A. Zeeb# Test cases. 657d3373029SBjoern A. Zeeb# 658d3373029SBjoern A. Zeeb# In general we set the FIB on in, but count on out. 659d3373029SBjoern A. Zeeb# 660d3373029SBjoern A. Zeeb 661d3373029SBjoern A. Zeeb_fwd_default_fib_symmetric_results() 662d3373029SBjoern A. Zeeb{ 663d3373029SBjoern A. Zeeb local _n i _edge _type _rc 664d3373029SBjoern A. Zeeb _n="$1" 665d3373029SBjoern A. Zeeb 666d3373029SBjoern A. Zeeb i=0 667d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 668d3373029SBjoern A. Zeeb for _edge in "LEFT" "RIGHT"; do 669d3373029SBjoern A. Zeeb for _type in "ICMP6" "TCP" "UDP"; do 670d3373029SBjoern A. Zeeb 671d3373029SBjoern A. Zeeb case ${i} in 672d3373029SBjoern A. Zeeb 0) eval rc_${_n}_${_edge}_${_type}_${i}=1 673d3373029SBjoern A. Zeeb #print_debug \ 674d3373029SBjoern A. Zeeb # "rc_${_n}_${_edge}_${_type}_${i}=1" 675d3373029SBjoern A. Zeeb ;; 676d3373029SBjoern A. Zeeb *) eval rc_${_n}_${_edge}_${_type}_${i}=0 677d3373029SBjoern A. Zeeb #print_debug \ 678d3373029SBjoern A. Zeeb # "rc_${_n}_${_edge}_${_type}_${i}=0" 679d3373029SBjoern A. Zeeb ;; 680d3373029SBjoern A. Zeeb esac 681d3373029SBjoern A. Zeeb 682d3373029SBjoern A. Zeeb done 683d3373029SBjoern A. Zeeb done 684d3373029SBjoern A. Zeeb i=$((i + 1)) 685d3373029SBjoern A. Zeeb done 686d3373029SBjoern A. Zeeb} 687d3373029SBjoern A. Zeeb 688d3373029SBjoern A. Zeeb_fwd_default_fib_symmetric_left() 689d3373029SBjoern A. Zeeb{ 690d3373029SBjoern A. Zeeb local _n 691d3373029SBjoern A. Zeeb _n="$1" 692d3373029SBjoern A. Zeeb 693d3373029SBjoern A. Zeeb send_control_msgs "START_${_n}" 694d3373029SBjoern A. Zeeb 695d3373029SBjoern A. Zeeb # Setup expected return code 696d3373029SBjoern A. Zeeb rc_0=0 697d3373029SBjoern A. Zeeb 698d3373029SBjoern A. Zeeb # Initiate probes for ICMP6, TCP and UDP. 699d3373029SBjoern A. Zeeb test_icmp6 1 ${RIGHTADDR} "${_n}_icmp6" 700d3373029SBjoern A. Zeeb test_ulp 1 "${_n}" ${RIGHTADDR} ${CTRLPORT} 0 701d3373029SBjoern A. Zeeb 702d3373029SBjoern A. Zeeb send_control_msgs "STOP_${_n}" 703d3373029SBjoern A. Zeeb _fwd_default_fib_symmetric_results "${_n}" 704d3373029SBjoern A. Zeeb fetch_ipfw_count "${_n}" 705d3373029SBjoern A. Zeeb} 706d3373029SBjoern A. Zeeb 707d3373029SBjoern A. Zeeb_fwd_default_fib_symmetric_middle() 708d3373029SBjoern A. Zeeb{ 709d3373029SBjoern A. Zeeb local _n 710d3373029SBjoern A. Zeeb _n="$1" 711d3373029SBjoern A. Zeeb 712d3373029SBjoern A. Zeeb setup_ipfw_count ${CTRLPORT} ${RT_NUMFIBS} 0 -1 713d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}" 714d3373029SBjoern A. Zeeb ipfw -q zero > /dev/null 715d3373029SBjoern A. Zeeb # Nothing to do for the middle node testing the default. 716d3373029SBjoern A. Zeeb sleep 1 717d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}" 718d3373029SBjoern A. Zeeb report_ipfw_count 719d3373029SBjoern A. Zeeb} 720d3373029SBjoern A. Zeeb 721d3373029SBjoern A. Zeeb_fwd_default_fib_symmetric_right() 722d3373029SBjoern A. Zeeb{ 723d3373029SBjoern A. Zeeb local _n 724d3373029SBjoern A. Zeeb _n="$1" 725d3373029SBjoern A. Zeeb 726d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}" 727d3373029SBjoern A. Zeeb 728d3373029SBjoern A. Zeeb # No need to do anything for ICMPv6. 729d3373029SBjoern A. Zeeb # Start reflect for TCP and UDP. 730d3373029SBjoern A. Zeeb test_ulp_reflect_one "${_n}_tcp" "-N -T TCP6" 0 ${CTRLPORT} 731d3373029SBjoern A. Zeeb test_ulp_reflect_one "${_n}_udp" "-N -T UDP6" 0 ${CTRLPORT} 732d3373029SBjoern A. Zeeb 733d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}" 734d3373029SBjoern A. Zeeb} 735d3373029SBjoern A. Zeeb 736d3373029SBjoern A. Zeebfwd_default_fib_symmetric() 737d3373029SBjoern A. Zeeb{ 738d3373029SBjoern A. Zeeb local _n 739d3373029SBjoern A. Zeeb 740d3373029SBjoern A. Zeeb _n="fwd_default_fib_symmetric" 741d3373029SBjoern A. Zeeb 742d3373029SBjoern A. Zeeb print_debug "${_n}" 743d3373029SBjoern A. Zeeb case ${node} in 744d3373029SBjoern A. Zeeb left) _fwd_default_fib_symmetric_left ${_n} ;; 745d3373029SBjoern A. Zeeb middle) _fwd_default_fib_symmetric_middle ${_n} ;; 746d3373029SBjoern A. Zeeb right) _fwd_default_fib_symmetric_right ${_n} ;; 747d3373029SBjoern A. Zeeb esac 748d3373029SBjoern A. Zeeb} 749d3373029SBjoern A. Zeeb 750d3373029SBjoern A. Zeeb_fwd_default_fib_symmetric_middle_ifconfig() 751d3373029SBjoern A. Zeeb{ 752d3373029SBjoern A. Zeeb local _n 753d3373029SBjoern A. Zeeb _n="$1" 754d3373029SBjoern A. Zeeb 755d3373029SBjoern A. Zeeb ifconfig ${IFACE} fib 0 756d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} fib 0 757d3373029SBjoern A. Zeeb setup_ipfw_count ${CTRLPORT} ${RT_NUMFIBS} 0 -1 758d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}" 759d3373029SBjoern A. Zeeb ipfw -q zero > /dev/null 760d3373029SBjoern A. Zeeb # Nothing to do for the middle node testing the default. 761d3373029SBjoern A. Zeeb sleep 1 762d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}" 763d3373029SBjoern A. Zeeb report_ipfw_count 764d3373029SBjoern A. Zeeb} 765d3373029SBjoern A. Zeeb 766d3373029SBjoern A. Zeebfwd_default_fib_symmetric_ifconfig() 767d3373029SBjoern A. Zeeb{ 768d3373029SBjoern A. Zeeb local _n 769d3373029SBjoern A. Zeeb 770d3373029SBjoern A. Zeeb _n="fwd_default_fib_symmetric_ifconfig" 771d3373029SBjoern A. Zeeb 772d3373029SBjoern A. Zeeb print_debug "${_n}" 773d3373029SBjoern A. Zeeb case ${node} in 774d3373029SBjoern A. Zeeb left) _fwd_default_fib_symmetric_left ${_n} ;; 775d3373029SBjoern A. Zeeb middle) _fwd_default_fib_symmetric_middle_ifconfig ${_n} ;; 776d3373029SBjoern A. Zeeb right) _fwd_default_fib_symmetric_right ${_n} ;; 777d3373029SBjoern A. Zeeb esac 778d3373029SBjoern A. Zeeb} 779d3373029SBjoern A. Zeeb 780d3373029SBjoern A. Zeeb_fwd_default_fib_symmetric_middle_ipfw() 781d3373029SBjoern A. Zeeb{ 782d3373029SBjoern A. Zeeb local _n 783d3373029SBjoern A. Zeeb _n="$1" 784d3373029SBjoern A. Zeeb 785d3373029SBjoern A. Zeeb ipfw add 100 setfib 0 ipv6-icmp from any to any \ 786d3373029SBjoern A. Zeeb icmp6types 128 via ${IFACE} in > /dev/null 787d3373029SBjoern A. Zeeb ipfw add 100 setfib 0 ip6 from any to any \ 788d3373029SBjoern A. Zeeb proto tcp dst-port ${CTRLPORT} via ${IFACE} in > /dev/null 789d3373029SBjoern A. Zeeb ipfw add 100 setfib 0 ip6 from any to any \ 790d3373029SBjoern A. Zeeb proto udp dst-port ${CTRLPORT} via ${IFACE} in > /dev/null 791d3373029SBjoern A. Zeeb 792d3373029SBjoern A. Zeeb ipfw add 100 setfib 0 ipv6-icmp from any to any \ 793d3373029SBjoern A. Zeeb icmp6types 128 via ${IFACEFAR} in > /dev/null 794d3373029SBjoern A. Zeeb ipfw add 100 setfib 0 tcp from any to any \ 795d3373029SBjoern A. Zeeb dst-port ${CTRLPORT} via ${IFACEFAR} in > /dev/null 796d3373029SBjoern A. Zeeb ipfw add 100 setfib 0 udp from any to any \ 797d3373029SBjoern A. Zeeb dst-port ${CTRLPORT} via ${IFACEFAR} in > /dev/null 798d3373029SBjoern A. Zeeb 799d3373029SBjoern A. Zeeb setup_ipfw_count ${CTRLPORT} ${RT_NUMFIBS} 0 -1 800d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}" 801d3373029SBjoern A. Zeeb ipfw -q zero > /dev/null 802d3373029SBjoern A. Zeeb # Nothing to do for the middle node testing the default. 803d3373029SBjoern A. Zeeb sleep 1 804d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}" 805d3373029SBjoern A. Zeeb report_ipfw_count 806d3373029SBjoern A. Zeeb 807d3373029SBjoern A. Zeeb ipfw delete 100 > /dev/null 808d3373029SBjoern A. Zeeb} 809d3373029SBjoern A. Zeeb 810d3373029SBjoern A. Zeebfwd_default_fib_symmetric_ipfw() 811d3373029SBjoern A. Zeeb{ 812d3373029SBjoern A. Zeeb local _n 813d3373029SBjoern A. Zeeb 814d3373029SBjoern A. Zeeb _n="fwd_default_fib_symmetric_ipfw" 815d3373029SBjoern A. Zeeb 816d3373029SBjoern A. Zeeb print_debug "${_n}" 817d3373029SBjoern A. Zeeb case ${node} in 818d3373029SBjoern A. Zeeb left) _fwd_default_fib_symmetric_left ${_n} ;; 819d3373029SBjoern A. Zeeb middle) _fwd_default_fib_symmetric_middle_ipfw ${_n} ;; 820d3373029SBjoern A. Zeeb right) _fwd_default_fib_symmetric_right ${_n} ;; 821d3373029SBjoern A. Zeeb esac 822d3373029SBjoern A. Zeeb} 823d3373029SBjoern A. Zeeb 824d3373029SBjoern A. Zeeb################################################################################ 825d3373029SBjoern A. Zeeb 826d3373029SBjoern A. Zeeb_fwd_fib_symmetric_results() 827d3373029SBjoern A. Zeeb{ 828d3373029SBjoern A. Zeeb local _n _fib i _edge _type _rc 829d3373029SBjoern A. Zeeb _n="$1" 830d3373029SBjoern A. Zeeb _fib=$2 831d3373029SBjoern A. Zeeb 832d3373029SBjoern A. Zeeb i=0 833d3373029SBjoern A. Zeeb while test ${i} -lt ${RT_NUMFIBS}; do 834d3373029SBjoern A. Zeeb for _edge in "LEFT" "RIGHT"; do 835d3373029SBjoern A. Zeeb for _type in "ICMP6" "TCP" "UDP"; do 836d3373029SBjoern A. Zeeb 837d3373029SBjoern A. Zeeb case ${i} in 838d3373029SBjoern A. Zeeb ${_fib}) eval rc_${_n}_${_edge}_${_type}_${i}=1 839d3373029SBjoern A. Zeeb #print_debug \ 840d3373029SBjoern A. Zeeb # "rc_${_n}_${_edge}_${_type}_${i}=1" 841d3373029SBjoern A. Zeeb ;; 842d3373029SBjoern A. Zeeb *) eval rc_${_n}_${_edge}_${_type}_${i}=0 843d3373029SBjoern A. Zeeb #print_debug \ 844d3373029SBjoern A. Zeeb # "rc_${_n}_${_edge}_${_type}_${i}=0" 845d3373029SBjoern A. Zeeb ;; 846d3373029SBjoern A. Zeeb esac 847d3373029SBjoern A. Zeeb 848d3373029SBjoern A. Zeeb done 849d3373029SBjoern A. Zeeb done 850d3373029SBjoern A. Zeeb i=$((i + 1)) 851d3373029SBjoern A. Zeeb done 852d3373029SBjoern A. Zeeb} 853d3373029SBjoern A. Zeeb 854d3373029SBjoern A. Zeeb_fwd_fib_symmetric_left() 855d3373029SBjoern A. Zeeb{ 856d3373029SBjoern A. Zeeb local _n _maxfib i 857d3373029SBjoern A. Zeeb _n="$1" 858d3373029SBjoern A. Zeeb _maxfib=$2 859d3373029SBjoern A. Zeeb 860d3373029SBjoern A. Zeeb # Setup expected return code 861d3373029SBjoern A. Zeeb i=0 862d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 863d3373029SBjoern A. Zeeb eval rc_${i}=0 864d3373029SBjoern A. Zeeb i=$((i + 1)) 865d3373029SBjoern A. Zeeb done 866d3373029SBjoern A. Zeeb 867d3373029SBjoern A. Zeeb # Initiate probes for ICMP6, TCP and UDP. 868d3373029SBjoern A. Zeeb i=0 869d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 870d3373029SBjoern A. Zeeb 871d3373029SBjoern A. Zeeb sleep 1 872d3373029SBjoern A. Zeeb 873d3373029SBjoern A. Zeeb send_control_msgs "START_${_n}_${i}" 874d3373029SBjoern A. Zeeb 875d3373029SBjoern A. Zeeb test_icmp6 1 ${RIGHTADDR} "${_n}_${i}_icmp6" 876d3373029SBjoern A. Zeeb test_ulp 1 "${_n}_${i}" ${RIGHTADDR} ${CTRLPORT} ${i} 877d3373029SBjoern A. Zeeb 878d3373029SBjoern A. Zeeb send_control_msgs "STOP_${_n}_${i}" 879d3373029SBjoern A. Zeeb _fwd_fib_symmetric_results "${_n}_${i}" ${i} 880d3373029SBjoern A. Zeeb fetch_ipfw_count "${_n}_${i}" 881d3373029SBjoern A. Zeeb i=$((i + 1)) 882d3373029SBjoern A. Zeeb done 883d3373029SBjoern A. Zeeb} 884d3373029SBjoern A. Zeeb 885d3373029SBjoern A. Zeeb_fwd_fib_symmetric_right() 886d3373029SBjoern A. Zeeb{ 887d3373029SBjoern A. Zeeb local _n _maxfib i 888d3373029SBjoern A. Zeeb _n="$1" 889d3373029SBjoern A. Zeeb _maxfib=$2 890d3373029SBjoern A. Zeeb 891d3373029SBjoern A. Zeeb i=0 892d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 893d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}_${i}" 894d3373029SBjoern A. Zeeb 895d3373029SBjoern A. Zeeb # No need to do anything for ICMPv6. 896d3373029SBjoern A. Zeeb # Start reflect for TCP and UDP. 897d3373029SBjoern A. Zeeb test_ulp_reflect_one "${_n}_tcp" "-N -T TCP6" ${i} ${CTRLPORT} 898d3373029SBjoern A. Zeeb test_ulp_reflect_one "${_n}_udp" "-N -T UDP6" ${i} ${CTRLPORT} 899d3373029SBjoern A. Zeeb 900d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}_${i}" 901d3373029SBjoern A. Zeeb i=$((i + 1)) 902d3373029SBjoern A. Zeeb done 903d3373029SBjoern A. Zeeb} 904d3373029SBjoern A. Zeeb 905d3373029SBjoern A. Zeeb_fwd_fib_symmetric_middle_ifconfig() 906d3373029SBjoern A. Zeeb{ 907d3373029SBjoern A. Zeeb local _n _maxfib i 908d3373029SBjoern A. Zeeb _n="$1" 909d3373029SBjoern A. Zeeb _maxfib=$2 910d3373029SBjoern A. Zeeb 911d3373029SBjoern A. Zeeb i=0 912d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 913d3373029SBjoern A. Zeeb ifconfig ${IFACE} fib ${i} 914d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} fib ${i} 915d3373029SBjoern A. Zeeb setup_ipfw_count ${CTRLPORT} ${_maxfib} ${i} -1 916d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}_${i}" 917d3373029SBjoern A. Zeeb ipfw -q zero > /dev/null 918d3373029SBjoern A. Zeeb # Nothing to do for the middle node testing the default. 919d3373029SBjoern A. Zeeb sleep 1 920d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}_${i}" 921d3373029SBjoern A. Zeeb report_ipfw_count 922d3373029SBjoern A. Zeeb i=$((i + 1)) 923d3373029SBjoern A. Zeeb done 924d3373029SBjoern A. Zeeb} 925d3373029SBjoern A. Zeeb 926d3373029SBjoern A. Zeeb_fwd_fib_symmetric_middle_ipfw() 927d3373029SBjoern A. Zeeb{ 928d3373029SBjoern A. Zeeb local _n _maxfib i _port 929d3373029SBjoern A. Zeeb _n="$1" 930d3373029SBjoern A. Zeeb _maxfib=$2 931d3373029SBjoern A. Zeeb 932d3373029SBjoern A. Zeeb i=0 933d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 934d3373029SBjoern A. Zeeb _port=$((CTRLPORT + 1 + i)) 935d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} ipv6-icmp from any to any \ 936d3373029SBjoern A. Zeeb icmp6types 128 via ${IFACE} in > /dev/null 937d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} tcp from any to any \ 938d3373029SBjoern A. Zeeb dst-port ${_port} via ${IFACE} in > /dev/null 939d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} udp from any to any \ 940d3373029SBjoern A. Zeeb dst-port ${_port} via ${IFACE} in > /dev/null 941d3373029SBjoern A. Zeeb 942d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} ipv6-icmp from any to any \ 943d3373029SBjoern A. Zeeb icmp6types 129 via ${IFACEFAR} in > /dev/null 944d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} tcp from any to any \ 945d3373029SBjoern A. Zeeb src-port ${_port} via ${IFACEFAR} in > /dev/null 946d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} udp from any to any \ 947d3373029SBjoern A. Zeeb src-port ${_port} via ${IFACEFAR} in > /dev/null 948d3373029SBjoern A. Zeeb 949d3373029SBjoern A. Zeeb setup_ipfw_count ${CTRLPORT} ${_maxfib} ${i} -1 950d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}_${i}" 951d3373029SBjoern A. Zeeb ipfw -q zero > /dev/null 952d3373029SBjoern A. Zeeb # Nothing to do for the middle node testing the default. 953d3373029SBjoern A. Zeeb sleep 1 954d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}_${i}" 955d3373029SBjoern A. Zeeb report_ipfw_count 956d3373029SBjoern A. Zeeb 957d3373029SBjoern A. Zeeb ipfw delete 100 > /dev/null 958d3373029SBjoern A. Zeeb i=$((i + 1)) 959d3373029SBjoern A. Zeeb done 960d3373029SBjoern A. Zeeb} 961d3373029SBjoern A. Zeeb 962d3373029SBjoern A. Zeebfwd_fib_symmetric_ifconfig() 963d3373029SBjoern A. Zeeb{ 964d3373029SBjoern A. Zeeb local _maxfib _n 965d3373029SBjoern A. Zeeb _maxfib=$1 966d3373029SBjoern A. Zeeb 967d3373029SBjoern A. Zeeb _n="fwd_fib_symmetric_ifconfig" 968d3373029SBjoern A. Zeeb 969d3373029SBjoern A. Zeeb print_debug "${_n} ${_maxfib}" 970d3373029SBjoern A. Zeeb case ${node} in 971d3373029SBjoern A. Zeeb left) _fwd_fib_symmetric_left ${_n} ${_maxfib} ;; 972d3373029SBjoern A. Zeeb middle) _fwd_fib_symmetric_middle_ifconfig ${_n} ${_maxfib} ;; 973d3373029SBjoern A. Zeeb right) _fwd_fib_symmetric_right ${_n} ${_maxfib} ;; 974d3373029SBjoern A. Zeeb esac 975d3373029SBjoern A. Zeeb} 976d3373029SBjoern A. Zeeb 977d3373029SBjoern A. Zeebfwd_fib_symmetric_ipfw() 978d3373029SBjoern A. Zeeb{ 979d3373029SBjoern A. Zeeb local _maxfib _n 980d3373029SBjoern A. Zeeb _maxfib=$1 981d3373029SBjoern A. Zeeb 982d3373029SBjoern A. Zeeb _n="fwd_fib_symmetric_ipfw" 983d3373029SBjoern A. Zeeb 984d3373029SBjoern A. Zeeb print_debug "${_n} ${_maxfib}" 985d3373029SBjoern A. Zeeb case ${node} in 986d3373029SBjoern A. Zeeb left) _fwd_fib_symmetric_left ${_n} ${_maxfib} ;; 987d3373029SBjoern A. Zeeb middle) _fwd_fib_symmetric_middle_ipfw ${_n} ${_maxfib} ;; 988d3373029SBjoern A. Zeeb right) _fwd_fib_symmetric_right ${_n} ${_maxfib} ;; 989d3373029SBjoern A. Zeeb esac 990d3373029SBjoern A. Zeeb} 991d3373029SBjoern A. Zeeb 992d3373029SBjoern A. Zeeb################################################################################ 993d3373029SBjoern A. Zeeb 994d3373029SBjoern A. Zeeb_fwd_fib_asymmetric_results() 995d3373029SBjoern A. Zeeb{ 996*0e7ed5d6SBjoern A. Zeeb local _n fib maxfib i _edge _type _rc 997d3373029SBjoern A. Zeeb _n="$1" 998*0e7ed5d6SBjoern A. Zeeb fib=$2 999*0e7ed5d6SBjoern A. Zeeb maxfib=$3 1000d3373029SBjoern A. Zeeb 1001d3373029SBjoern A. Zeeb i=0 1002*0e7ed5d6SBjoern A. Zeeb while test ${i} -lt ${maxfib}; do 1003d3373029SBjoern A. Zeeb _edge="RIGHT" 1004d3373029SBjoern A. Zeeb for _type in "ICMP6" "TCP" "UDP"; do 1005d3373029SBjoern A. Zeeb 1006d3373029SBjoern A. Zeeb case ${i} in 1007*0e7ed5d6SBjoern A. Zeeb ${fib}) eval rc_${_n}_${_edge}_${_type}_${i}=1 1008d3373029SBjoern A. Zeeb #print_debug \ 1009d3373029SBjoern A. Zeeb # "rc_${_n}_${_edge}_${_type}_${i}=1" 1010d3373029SBjoern A. Zeeb ;; 1011d3373029SBjoern A. Zeeb *) eval rc_${_n}_${_edge}_${_type}_${i}=0 1012d3373029SBjoern A. Zeeb #print_debug \ 1013d3373029SBjoern A. Zeeb # "rc_${_n}_${_edge}_${_type}_${i}=0" 1014d3373029SBjoern A. Zeeb ;; 1015d3373029SBjoern A. Zeeb esac 1016d3373029SBjoern A. Zeeb 1017d3373029SBjoern A. Zeeb done 1018d3373029SBjoern A. Zeeb i=$((i + 1)) 1019d3373029SBjoern A. Zeeb done 1020*0e7ed5d6SBjoern A. Zeeb fib=$((maxfib - 1 - fib)) 1021d3373029SBjoern A. Zeeb i=0 1022*0e7ed5d6SBjoern A. Zeeb while test ${i} -lt ${maxfib}; do 1023d3373029SBjoern A. Zeeb _edge="LEFT" 1024d3373029SBjoern A. Zeeb for _type in "ICMP6" "TCP" "UDP"; do 1025d3373029SBjoern A. Zeeb 1026d3373029SBjoern A. Zeeb case ${i} in 1027*0e7ed5d6SBjoern A. Zeeb ${fib}) eval rc_${_n}_${_edge}_${_type}_${i}=1 1028d3373029SBjoern A. Zeeb #print_debug \ 1029d3373029SBjoern A. Zeeb # "rc_${_n}_${_edge}_${_type}_${i}=1" 1030d3373029SBjoern A. Zeeb ;; 1031d3373029SBjoern A. Zeeb *) eval rc_${_n}_${_edge}_${_type}_${i}=0 1032d3373029SBjoern A. Zeeb #print_debug \ 1033d3373029SBjoern A. Zeeb # "rc_${_n}_${_edge}_${_type}_${i}=0" 1034d3373029SBjoern A. Zeeb ;; 1035d3373029SBjoern A. Zeeb esac 1036d3373029SBjoern A. Zeeb 1037d3373029SBjoern A. Zeeb done 1038d3373029SBjoern A. Zeeb i=$((i + 1)) 1039d3373029SBjoern A. Zeeb done 1040d3373029SBjoern A. Zeeb} 1041d3373029SBjoern A. Zeeb 1042d3373029SBjoern A. Zeeb_fwd_fib_asymmetric_left() 1043d3373029SBjoern A. Zeeb{ 1044d3373029SBjoern A. Zeeb local _n _maxfib i 1045d3373029SBjoern A. Zeeb _n="$1" 1046d3373029SBjoern A. Zeeb _maxfib=$2 1047d3373029SBjoern A. Zeeb 1048d3373029SBjoern A. Zeeb # Setup expected return code 1049d3373029SBjoern A. Zeeb i=0 1050d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1051d3373029SBjoern A. Zeeb eval rc_${i}=0 1052d3373029SBjoern A. Zeeb i=$((i + 1)) 1053d3373029SBjoern A. Zeeb done 1054d3373029SBjoern A. Zeeb 1055d3373029SBjoern A. Zeeb # Initiate probes for ICMP6, TCP and UDP. 1056d3373029SBjoern A. Zeeb i=0 1057d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1058d3373029SBjoern A. Zeeb 1059d3373029SBjoern A. Zeeb sleep 1 1060d3373029SBjoern A. Zeeb 1061d3373029SBjoern A. Zeeb send_control_msgs "START_${_n}_${i}" 1062d3373029SBjoern A. Zeeb 1063d3373029SBjoern A. Zeeb test_icmp6 1 ${RIGHTADDR} "${_n}_${i}_icmp6" 1064d3373029SBjoern A. Zeeb test_ulp 1 "${_n}_${i}" ${RIGHTADDR} ${CTRLPORT} ${i} 1065d3373029SBjoern A. Zeeb 1066d3373029SBjoern A. Zeeb send_control_msgs "STOP_${_n}_${i}" 1067d3373029SBjoern A. Zeeb _fwd_fib_asymmetric_results "${_n}_${i}" ${i} ${_maxfib} 1068d3373029SBjoern A. Zeeb fetch_ipfw_count "${_n}_${i}" 1069d3373029SBjoern A. Zeeb i=$((i + 1)) 1070d3373029SBjoern A. Zeeb done 1071d3373029SBjoern A. Zeeb} 1072d3373029SBjoern A. Zeeb 1073d3373029SBjoern A. Zeeb_fwd_fib_asymmetric_middle_ifconfig() 1074d3373029SBjoern A. Zeeb{ 1075*0e7ed5d6SBjoern A. Zeeb local _n maxfib i 1076d3373029SBjoern A. Zeeb _n="$1" 1077*0e7ed5d6SBjoern A. Zeeb maxfib=$2 1078d3373029SBjoern A. Zeeb 1079d3373029SBjoern A. Zeeb i=0 1080*0e7ed5d6SBjoern A. Zeeb while test ${i} -lt ${maxfib}; do 1081d3373029SBjoern A. Zeeb ifconfig ${IFACE} fib ${i} 1082*0e7ed5d6SBjoern A. Zeeb ifconfig ${IFACEFAR} fib $((${maxfib} - 1 - ${i})) 1083*0e7ed5d6SBjoern A. Zeeb setup_ipfw_count ${CTRLPORT} ${maxfib} ${i} \ 1084*0e7ed5d6SBjoern A. Zeeb $((${maxfib} - 1 - ${i})) 1085d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}_${i}" 1086d3373029SBjoern A. Zeeb ipfw -q zero > /dev/null 1087d3373029SBjoern A. Zeeb # Nothing to do for the middle node testing the default. 1088d3373029SBjoern A. Zeeb sleep 1 1089d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}_${i}" 1090d3373029SBjoern A. Zeeb report_ipfw_count 1091d3373029SBjoern A. Zeeb i=$((i + 1)) 1092d3373029SBjoern A. Zeeb done 1093d3373029SBjoern A. Zeeb} 1094d3373029SBjoern A. Zeeb 1095d3373029SBjoern A. Zeeb_fwd_fib_asymmetric_middle_ipfw() 1096d3373029SBjoern A. Zeeb{ 1097*0e7ed5d6SBjoern A. Zeeb local _n maxfib i j _port 1098d3373029SBjoern A. Zeeb _n="$1" 1099*0e7ed5d6SBjoern A. Zeeb maxfib=$2 1100d3373029SBjoern A. Zeeb 1101d3373029SBjoern A. Zeeb i=0 1102*0e7ed5d6SBjoern A. Zeeb while test ${i} -lt ${maxfib}; do 1103d3373029SBjoern A. Zeeb 1104d3373029SBjoern A. Zeeb _port=$((CTRLPORT + 1 + i)) 1105d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} ipv6-icmp from any to any \ 1106d3373029SBjoern A. Zeeb icmp6types 128 via ${IFACE} in > /dev/null 1107d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} tcp from any to any \ 1108d3373029SBjoern A. Zeeb dst-port ${_port} via ${IFACE} in > /dev/null 1109d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} udp from any to any \ 1110d3373029SBjoern A. Zeeb dst-port ${_port} via ${IFACE} in > /dev/null 1111d3373029SBjoern A. Zeeb 1112*0e7ed5d6SBjoern A. Zeeb j=$((${maxfib} - 1 - ${i})) 1113d3373029SBjoern A. Zeeb ipfw add 100 setfib ${j} ipv6-icmp from any to any \ 1114d3373029SBjoern A. Zeeb icmp6types 129 via ${IFACEFAR} in > /dev/null 1115d3373029SBjoern A. Zeeb ipfw add 100 setfib ${j} tcp from any to any \ 1116d3373029SBjoern A. Zeeb src-port ${_port} via ${IFACEFAR} in > /dev/null 1117d3373029SBjoern A. Zeeb ipfw add 100 setfib ${j} udp from any to any \ 1118d3373029SBjoern A. Zeeb src-port ${_port} via ${IFACEFAR} in > /dev/null 1119d3373029SBjoern A. Zeeb 1120*0e7ed5d6SBjoern A. Zeeb setup_ipfw_count ${CTRLPORT} ${maxfib} ${i} ${j} 1121d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}_${i}" 1122d3373029SBjoern A. Zeeb ipfw -q zero > /dev/null 1123d3373029SBjoern A. Zeeb # Nothing to do for the middle node testing the default. 1124d3373029SBjoern A. Zeeb sleep 1 1125d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}_${i}" 1126d3373029SBjoern A. Zeeb report_ipfw_count 1127d3373029SBjoern A. Zeeb 1128d3373029SBjoern A. Zeeb ipfw delete 100 > /dev/null 1129d3373029SBjoern A. Zeeb i=$((i + 1)) 1130d3373029SBjoern A. Zeeb done 1131d3373029SBjoern A. Zeeb} 1132d3373029SBjoern A. Zeeb 1133d3373029SBjoern A. Zeebfwd_fib_asymmetric_ifconfig() 1134d3373029SBjoern A. Zeeb{ 1135d3373029SBjoern A. Zeeb local _maxfib _n 1136d3373029SBjoern A. Zeeb _maxfib=$1 1137d3373029SBjoern A. Zeeb 1138d3373029SBjoern A. Zeeb _n="fwd_fib_asymmetric_ifconfig" 1139d3373029SBjoern A. Zeeb 1140d3373029SBjoern A. Zeeb print_debug "${_n} ${_maxfib}" 1141d3373029SBjoern A. Zeeb case ${node} in 1142d3373029SBjoern A. Zeeb left) _fwd_fib_asymmetric_left ${_n} ${_maxfib} ;; 1143d3373029SBjoern A. Zeeb middle) _fwd_fib_asymmetric_middle_ifconfig ${_n} ${_maxfib} ;; 1144d3373029SBjoern A. Zeeb right) _fwd_fib_symmetric_right ${_n} ${_maxfib} ;; 1145d3373029SBjoern A. Zeeb esac 1146d3373029SBjoern A. Zeeb} 1147d3373029SBjoern A. Zeeb 1148d3373029SBjoern A. Zeebfwd_fib_asymmetric_ipfw() 1149d3373029SBjoern A. Zeeb{ 1150d3373029SBjoern A. Zeeb local _maxfib _n 1151d3373029SBjoern A. Zeeb _maxfib=$1 1152d3373029SBjoern A. Zeeb 1153d3373029SBjoern A. Zeeb _n="fwd_fib_asymmetric_ipfw" 1154d3373029SBjoern A. Zeeb 1155d3373029SBjoern A. Zeeb print_debug "${_n} ${_maxfib}" 1156d3373029SBjoern A. Zeeb case ${node} in 1157d3373029SBjoern A. Zeeb left) _fwd_fib_asymmetric_left ${_n} ${_maxfib} ;; 1158d3373029SBjoern A. Zeeb middle) _fwd_fib_asymmetric_middle_ipfw ${_n} ${_maxfib} ;; 1159d3373029SBjoern A. Zeeb right) _fwd_fib_symmetric_right ${_n} ${_maxfib} ;; 1160d3373029SBjoern A. Zeeb esac 1161d3373029SBjoern A. Zeeb} 1162d3373029SBjoern A. Zeeb 1163d3373029SBjoern A. Zeeb################################################################################ 1164d3373029SBjoern A. Zeeb 1165d3373029SBjoern A. Zeeb_fwd_fib_symmetric_destructive_left() 1166d3373029SBjoern A. Zeeb{ 1167d3373029SBjoern A. Zeeb local _n _maxfib i _addr 1168d3373029SBjoern A. Zeeb _n="$1" 1169d3373029SBjoern A. Zeeb _maxfib=$2 1170d3373029SBjoern A. Zeeb 1171d3373029SBjoern A. Zeeb # Setup expected return code 1172d3373029SBjoern A. Zeeb i=0 1173d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1174d3373029SBjoern A. Zeeb eval rc_${i}=0 1175d3373029SBjoern A. Zeeb i=$((i + 1)) 1176d3373029SBjoern A. Zeeb done 1177d3373029SBjoern A. Zeeb 1178d3373029SBjoern A. Zeeb # Add default route. 1179d3373029SBjoern A. Zeeb route add -net -inet6 default ${MIDDLELEFTADDR} > /dev/null 1180d3373029SBjoern A. Zeeb 1181d3373029SBjoern A. Zeeb # Initiate probes for ICMP6, TCP and UDP. 1182d3373029SBjoern A. Zeeb i=0 1183d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1184d3373029SBjoern A. Zeeb 1185d3373029SBjoern A. Zeeb sleep 1 1186d3373029SBjoern A. Zeeb 1187d3373029SBjoern A. Zeeb send_control_msgs "START_${_n}_${i}" 1188d3373029SBjoern A. Zeeb 1189d3373029SBjoern A. Zeeb _addr="2001:2:${i}::2" 1190d3373029SBjoern A. Zeeb test_icmp6 1 ${_addr} "${_n}_${i}_icmp6" 1191d3373029SBjoern A. Zeeb test_ulp 1 "${_n}_${i}" ${_addr} ${CTRLPORT} ${i} 1192d3373029SBjoern A. Zeeb 1193d3373029SBjoern A. Zeeb send_control_msgs "STOP_${_n}_${i}" 1194d3373029SBjoern A. Zeeb _fwd_fib_symmetric_results "${_n}_${i}" ${i} 1195d3373029SBjoern A. Zeeb fetch_ipfw_count "${_n}_${i}" 1196d3373029SBjoern A. Zeeb i=$((i + 1)) 1197d3373029SBjoern A. Zeeb done 1198d3373029SBjoern A. Zeeb 1199d3373029SBjoern A. Zeeb # Cleanup networking. 1200d3373029SBjoern A. Zeeb route delete -net -inet6 default > /dev/null 1201d3373029SBjoern A. Zeeb} 1202d3373029SBjoern A. Zeeb 1203d3373029SBjoern A. Zeeb_fwd_fib_symmetric_destructive_right() 1204d3373029SBjoern A. Zeeb{ 1205d3373029SBjoern A. Zeeb local _n _maxfib i _addr 1206d3373029SBjoern A. Zeeb _n="$1" 1207d3373029SBjoern A. Zeeb _maxfib=$2 1208d3373029SBjoern A. Zeeb 1209d3373029SBjoern A. Zeeb # Setup networking (ideally we'd use the link-local). 1210d3373029SBjoern A. Zeeb route add -net -inet6 default ${MIDDLERIGHTADDR} > /dev/null 2>&1 1211d3373029SBjoern A. Zeeb i=0 1212d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1213d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${i}::2/64 alias 1214d3373029SBjoern A. Zeeb i=$((i + 1)) 1215d3373029SBjoern A. Zeeb done 1216d3373029SBjoern A. Zeeb 1217d3373029SBjoern A. Zeeb i=0 1218d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1219d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}_${i}" 1220d3373029SBjoern A. Zeeb 1221d3373029SBjoern A. Zeeb # No need to do anything for ICMPv6. 1222d3373029SBjoern A. Zeeb # Start reflect for TCP and UDP. 1223d3373029SBjoern A. Zeeb _addr="2001:2:${i}::2" 1224d3373029SBjoern A. Zeeb test_ulp_reflect_one "${_n}_tcp" "-N -T TCP6 -A ${_addr}" \ 1225d3373029SBjoern A. Zeeb ${i} ${CTRLPORT} 1226d3373029SBjoern A. Zeeb test_ulp_reflect_one "${_n}_udp" "-N -T UDP6 -A ${_addr}" \ 1227d3373029SBjoern A. Zeeb ${i} ${CTRLPORT} 1228d3373029SBjoern A. Zeeb 1229d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}_${i}" 1230d3373029SBjoern A. Zeeb i=$((i + 1)) 1231d3373029SBjoern A. Zeeb done 1232d3373029SBjoern A. Zeeb 1233d3373029SBjoern A. Zeeb # Cleanup networking again. 1234d3373029SBjoern A. Zeeb route delete -net -inet6 default > /dev/null 2>&1 1235d3373029SBjoern A. Zeeb i=0 1236d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1237d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${i}::2/64 -alias 1238d3373029SBjoern A. Zeeb i=$((i + 1)) 1239d3373029SBjoern A. Zeeb done 1240d3373029SBjoern A. Zeeb 1241d3373029SBjoern A. Zeeb} 1242d3373029SBjoern A. Zeeb 1243d3373029SBjoern A. Zeeb 1244d3373029SBjoern A. Zeeb_fwd_fib_symmetric_destructive_middle_setup_networking() 1245d3373029SBjoern A. Zeeb{ 1246d3373029SBjoern A. Zeeb local _maxfib i j 1247d3373029SBjoern A. Zeeb _maxfib=$1 1248d3373029SBjoern A. Zeeb 1249d3373029SBjoern A. Zeeb # Setup networking. 1250d3373029SBjoern A. Zeeb i=0 1251d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1252d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} inet6 2001:2:${i}::1/64 -alias \ 1253d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 1254d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} inet6 2001:2:${i}::1/64 alias 1255d3373029SBjoern A. Zeeb j=0 1256d3373029SBjoern A. Zeeb while test ${j} -lt ${_maxfib}; do 1257d3373029SBjoern A. Zeeb # Only work on all other FIBs. 1258d3373029SBjoern A. Zeeb if test ${j} -ne ${i}; then 1259d3373029SBjoern A. Zeeb setfib -F ${j} route delete -net -inet6 \ 1260d3373029SBjoern A. Zeeb 2001:2:${i}::/64 > /dev/null 1261d3373029SBjoern A. Zeeb fi 1262d3373029SBjoern A. Zeeb j=$((j + 1)) 1263d3373029SBjoern A. Zeeb done 1264d3373029SBjoern A. Zeeb i=$((i + 1)) 1265d3373029SBjoern A. Zeeb done 1266d3373029SBjoern A. Zeeb} 1267d3373029SBjoern A. Zeeb 1268d3373029SBjoern A. Zeeb_fwd_fib_symmetric_destructive_middle_cleanup_networking() 1269d3373029SBjoern A. Zeeb{ 1270d3373029SBjoern A. Zeeb local _maxfib i 1271d3373029SBjoern A. Zeeb _maxfib=$1 1272d3373029SBjoern A. Zeeb 1273d3373029SBjoern A. Zeeb # Cleanup networking again. 1274d3373029SBjoern A. Zeeb i=0 1275d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1276d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} inet6 2001:2:${i}::1/64 -alias 1277d3373029SBjoern A. Zeeb i=$((i + 1)) 1278d3373029SBjoern A. Zeeb done 1279d3373029SBjoern A. Zeeb} 1280d3373029SBjoern A. Zeeb 1281d3373029SBjoern A. Zeeb_fwd_fib_symmetric_destructive_middle_ifconfig() 1282d3373029SBjoern A. Zeeb{ 1283d3373029SBjoern A. Zeeb local _n _maxfib i 1284d3373029SBjoern A. Zeeb _n="$1" 1285d3373029SBjoern A. Zeeb _maxfib=$2 1286d3373029SBjoern A. Zeeb 1287d3373029SBjoern A. Zeeb _fwd_fib_symmetric_destructive_middle_setup_networking ${_maxfib} 1288d3373029SBjoern A. Zeeb 1289d3373029SBjoern A. Zeeb i=0 1290d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1291d3373029SBjoern A. Zeeb ifconfig ${IFACE} fib ${i} 1292d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} fib ${i} 1293d3373029SBjoern A. Zeeb setup_ipfw_count ${CTRLPORT} ${_maxfib} ${i} -1 1294d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}_${i}" 1295d3373029SBjoern A. Zeeb ipfw -q zero > /dev/null 1296d3373029SBjoern A. Zeeb # Nothing to do for the middle node testing the default. 1297d3373029SBjoern A. Zeeb sleep 1 1298d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}_${i}" 1299d3373029SBjoern A. Zeeb report_ipfw_count 1300d3373029SBjoern A. Zeeb i=$((i + 1)) 1301d3373029SBjoern A. Zeeb done 1302d3373029SBjoern A. Zeeb 1303d3373029SBjoern A. Zeeb _fwd_fib_symmetric_destructive_middle_cleanup_networking ${_maxfib} 1304d3373029SBjoern A. Zeeb} 1305d3373029SBjoern A. Zeeb 1306d3373029SBjoern A. Zeeb_fwd_fib_symmetric_destructive_middle_ipfw() 1307d3373029SBjoern A. Zeeb{ 1308d3373029SBjoern A. Zeeb local _n _maxfib i _port 1309d3373029SBjoern A. Zeeb _n="$1" 1310d3373029SBjoern A. Zeeb _maxfib=$2 1311d3373029SBjoern A. Zeeb 1312d3373029SBjoern A. Zeeb _fwd_fib_symmetric_destructive_middle_setup_networking ${_maxfib} 1313d3373029SBjoern A. Zeeb 1314d3373029SBjoern A. Zeeb i=0 1315d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1316d3373029SBjoern A. Zeeb _port=$((CTRLPORT + 1 + i)) 1317d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} ipv6-icmp from any to any \ 1318d3373029SBjoern A. Zeeb icmp6types 128 via ${IFACE} in > /dev/null 1319d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} tcp from any to any \ 1320d3373029SBjoern A. Zeeb dst-port ${_port} via ${IFACE} in > /dev/null 1321d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} udp from any to any \ 1322d3373029SBjoern A. Zeeb dst-port ${_port} via ${IFACE} in > /dev/null 1323d3373029SBjoern A. Zeeb 1324d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} ipv6-icmp from any to any \ 1325d3373029SBjoern A. Zeeb icmp6types 129 via ${IFACEFAR} in > /dev/null 1326d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} tcp from any to any \ 1327d3373029SBjoern A. Zeeb src-port ${_port} via ${IFACEFAR} in > /dev/null 1328d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} udp from any to any \ 1329d3373029SBjoern A. Zeeb src-port ${_port} via ${IFACEFAR} in > /dev/null 1330d3373029SBjoern A. Zeeb 1331d3373029SBjoern A. Zeeb setup_ipfw_count ${CTRLPORT} ${_maxfib} ${i} -1 1332d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}_${i}" 1333d3373029SBjoern A. Zeeb ipfw -q zero > /dev/null 1334d3373029SBjoern A. Zeeb # Nothing to do for the middle node testing the default. 1335d3373029SBjoern A. Zeeb sleep 1 1336d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}_${i}" 1337d3373029SBjoern A. Zeeb report_ipfw_count 1338d3373029SBjoern A. Zeeb 1339d3373029SBjoern A. Zeeb ipfw delete 100 > /dev/null 1340d3373029SBjoern A. Zeeb i=$((i + 1)) 1341d3373029SBjoern A. Zeeb done 1342d3373029SBjoern A. Zeeb 1343d3373029SBjoern A. Zeeb _fwd_fib_symmetric_destructive_middle_cleanup_networking ${_maxfib} 1344d3373029SBjoern A. Zeeb} 1345d3373029SBjoern A. Zeeb 1346d3373029SBjoern A. Zeebfwd_fib_symmetric_destructive_ifconfig() 1347d3373029SBjoern A. Zeeb{ 1348d3373029SBjoern A. Zeeb local _maxfib _n 1349d3373029SBjoern A. Zeeb _maxfib=$1 1350d3373029SBjoern A. Zeeb 1351d3373029SBjoern A. Zeeb _n="fwd_fib_symmetric_destructive_ifconfig" 1352d3373029SBjoern A. Zeeb 1353d3373029SBjoern A. Zeeb print_debug "${_n} ${_maxfib}" 1354d3373029SBjoern A. Zeeb case ${node} in 1355d3373029SBjoern A. Zeeb left) _fwd_fib_symmetric_destructive_left ${_n} ${_maxfib} ;; 1356d3373029SBjoern A. Zeeb middle) _fwd_fib_symmetric_destructive_middle_ifconfig \ 1357d3373029SBjoern A. Zeeb ${_n} ${_maxfib} ;; 1358d3373029SBjoern A. Zeeb right) _fwd_fib_symmetric_destructive_right ${_n} ${_maxfib} ;; 1359d3373029SBjoern A. Zeeb esac 1360d3373029SBjoern A. Zeeb} 1361d3373029SBjoern A. Zeeb 1362d3373029SBjoern A. Zeebfwd_fib_symmetric_destructive_ipfw() 1363d3373029SBjoern A. Zeeb{ 1364d3373029SBjoern A. Zeeb local _maxfib _n 1365d3373029SBjoern A. Zeeb _maxfib=$1 1366d3373029SBjoern A. Zeeb 1367d3373029SBjoern A. Zeeb _n="fwd_fib_symmetric_destructive_ipfw" 1368d3373029SBjoern A. Zeeb 1369d3373029SBjoern A. Zeeb print_debug "${_n} ${_maxfib}" 1370d3373029SBjoern A. Zeeb case ${node} in 1371d3373029SBjoern A. Zeeb left) _fwd_fib_symmetric_destructive_left ${_n} ${_maxfib} ;; 1372d3373029SBjoern A. Zeeb middle) _fwd_fib_symmetric_destructive_middle_ipfw \ 1373d3373029SBjoern A. Zeeb ${_n} ${_maxfib} ;; 1374d3373029SBjoern A. Zeeb right) _fwd_fib_symmetric_destructive_right ${_n} ${_maxfib} ;; 1375d3373029SBjoern A. Zeeb esac 1376d3373029SBjoern A. Zeeb} 1377d3373029SBjoern A. Zeeb 1378d3373029SBjoern A. Zeeb################################################################################ 1379d3373029SBjoern A. Zeeb 1380d3373029SBjoern A. Zeeb_fwd_fib_symmetric_destructive_defroute_left() 1381d3373029SBjoern A. Zeeb{ 1382d3373029SBjoern A. Zeeb local _n _maxfib i _addr 1383d3373029SBjoern A. Zeeb _n="$1" 1384d3373029SBjoern A. Zeeb _maxfib=$2 1385d3373029SBjoern A. Zeeb 1386d3373029SBjoern A. Zeeb # Setup expected return code 1387d3373029SBjoern A. Zeeb i=0 1388d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1389d3373029SBjoern A. Zeeb eval rc_${i}=0 1390d3373029SBjoern A. Zeeb i=$((i + 1)) 1391d3373029SBjoern A. Zeeb done 1392d3373029SBjoern A. Zeeb 1393d3373029SBjoern A. Zeeb # Add default route. 1394d3373029SBjoern A. Zeeb route delete -net -inet6 default > /dev/null 2>&1 || true 1395d3373029SBjoern A. Zeeb route add -net -inet6 default ${MIDDLELEFTADDR} > /dev/null 1396d3373029SBjoern A. Zeeb 1397d3373029SBjoern A. Zeeb # Initiate probes for ICMP6, TCP and UDP. 1398d3373029SBjoern A. Zeeb _addr="2001:2:1234::2" 1399d3373029SBjoern A. Zeeb i=0 1400d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1401d3373029SBjoern A. Zeeb 1402d3373029SBjoern A. Zeeb sleep 1 1403d3373029SBjoern A. Zeeb 1404d3373029SBjoern A. Zeeb send_control_msgs "START_${_n}_${i}" 1405d3373029SBjoern A. Zeeb 1406d3373029SBjoern A. Zeeb test_icmp6 1 "${_addr}" "${_n}_${i}_icmp6" 1407d3373029SBjoern A. Zeeb test_ulp 1 "${_n}_${i}" "${_addr}" ${CTRLPORT} ${i} 1408d3373029SBjoern A. Zeeb 1409d3373029SBjoern A. Zeeb send_control_msgs "STOP_${_n}_${i}" 1410d3373029SBjoern A. Zeeb _fwd_fib_symmetric_results "${_n}_${i}" ${i} 1411d3373029SBjoern A. Zeeb fetch_ipfw_count "${_n}_${i}" 1412d3373029SBjoern A. Zeeb i=$((i + 1)) 1413d3373029SBjoern A. Zeeb done 1414d3373029SBjoern A. Zeeb 1415d3373029SBjoern A. Zeeb # Cleanup networking. 1416d3373029SBjoern A. Zeeb route delete -net -inet6 default > /dev/null 2>&1 1417d3373029SBjoern A. Zeeb} 1418d3373029SBjoern A. Zeeb 1419d3373029SBjoern A. Zeeb_fwd_fib_symmetric_destructive_defroute_right() 1420d3373029SBjoern A. Zeeb{ 1421d3373029SBjoern A. Zeeb local _n _maxfib i _addr 1422d3373029SBjoern A. Zeeb _n="$1" 1423d3373029SBjoern A. Zeeb _maxfib=$2 1424d3373029SBjoern A. Zeeb 1425d3373029SBjoern A. Zeeb # Setup networking (ideally we'd use the link-local). 1426d3373029SBjoern A. Zeeb route delete -net -inet6 default > /dev/null 2>&1 || true 1427d3373029SBjoern A. Zeeb route add -net -inet6 default ${MIDDLERIGHTADDR} > /dev/null 2>&1 1428d3373029SBjoern A. Zeeb i=0 1429d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1430d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${i}::2/64 -alias \ 1431d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 1432d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${i}::2/64 alias 1433d3373029SBjoern A. Zeeb i=$((i + 1)) 1434d3373029SBjoern A. Zeeb done 1435d3373029SBjoern A. Zeeb _addr="2001:2:1234::2" 1436d3373029SBjoern A. Zeeb ifconfig lo0 inet6 ${_addr}/128 alias 1437d3373029SBjoern A. Zeeb 1438d3373029SBjoern A. Zeeb i=0 1439d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1440d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}_${i}" 1441d3373029SBjoern A. Zeeb 1442d3373029SBjoern A. Zeeb # No need to do anything for ICMPv6. 1443d3373029SBjoern A. Zeeb # Start reflect for TCP and UDP. 1444d3373029SBjoern A. Zeeb test_ulp_reflect_one "${_n}_tcp" "-N -T TCP6 -A ${_addr}" \ 1445d3373029SBjoern A. Zeeb ${i} ${CTRLPORT} 1446d3373029SBjoern A. Zeeb test_ulp_reflect_one "${_n}_udp" "-N -T UDP6 -A ${_addr}" \ 1447d3373029SBjoern A. Zeeb ${i} ${CTRLPORT} 1448d3373029SBjoern A. Zeeb 1449d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}_${i}" 1450d3373029SBjoern A. Zeeb i=$((i + 1)) 1451d3373029SBjoern A. Zeeb done 1452d3373029SBjoern A. Zeeb 1453d3373029SBjoern A. Zeeb # Cleanup networking again. 1454d3373029SBjoern A. Zeeb route delete -net -inet6 default > /dev/null 2>&1 1455d3373029SBjoern A. Zeeb i=0 1456d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1457d3373029SBjoern A. Zeeb ifconfig ${IFACE} inet6 2001:2:${i}::2/64 -alias 1458d3373029SBjoern A. Zeeb i=$((i + 1)) 1459d3373029SBjoern A. Zeeb done 1460d3373029SBjoern A. Zeeb ifconfig lo0 inet6 ${_addr}/128 -alias 1461d3373029SBjoern A. Zeeb 1462d3373029SBjoern A. Zeeb} 1463d3373029SBjoern A. Zeeb 1464d3373029SBjoern A. Zeeb_fwd_fib_symmetric_destructive_defroute_middle_setup_networking() 1465d3373029SBjoern A. Zeeb{ 1466d3373029SBjoern A. Zeeb local _maxfib i j 1467d3373029SBjoern A. Zeeb _maxfib=$1 1468d3373029SBjoern A. Zeeb 1469d3373029SBjoern A. Zeeb # Setup networking. 1470d3373029SBjoern A. Zeeb i=0 1471d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1472d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} inet6 2001:2:${i}::1/64 -alias \ 1473d3373029SBjoern A. Zeeb > /dev/null 2>&1 || true 1474d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} inet6 2001:2:${i}::1/64 alias 1475d3373029SBjoern A. Zeeb j=0 1476d3373029SBjoern A. Zeeb while test ${j} -lt ${_maxfib}; do 1477d3373029SBjoern A. Zeeb # Only work on all other FIBs. 1478d3373029SBjoern A. Zeeb if test ${j} -ne ${i}; then 1479d3373029SBjoern A. Zeeb setfib -F ${j} route delete -net -inet6 \ 1480d3373029SBjoern A. Zeeb 2001:2:${i}::/64 > /dev/null 1481d3373029SBjoern A. Zeeb fi 1482d3373029SBjoern A. Zeeb j=$((j + 1)) 1483d3373029SBjoern A. Zeeb done 1484d3373029SBjoern A. Zeeb setfib -F ${i} route delete -net -inet6 \ 1485d3373029SBjoern A. Zeeb 2001:2:1234::2 2001:2:${i}::2 > /dev/null 2>&1 || true 1486d3373029SBjoern A. Zeeb setfib -F ${i} route add -net -inet6 \ 1487d3373029SBjoern A. Zeeb 2001:2:1234::2 2001:2:${i}::2 > /dev/null 1488d3373029SBjoern A. Zeeb i=$((i + 1)) 1489d3373029SBjoern A. Zeeb done 1490d3373029SBjoern A. Zeeb} 1491d3373029SBjoern A. Zeeb 1492d3373029SBjoern A. Zeeb_fwd_fib_symmetric_destructive_defroute_middle_cleanup_networking() 1493d3373029SBjoern A. Zeeb{ 1494d3373029SBjoern A. Zeeb local _maxfib i 1495d3373029SBjoern A. Zeeb _maxfib=$1 1496d3373029SBjoern A. Zeeb 1497d3373029SBjoern A. Zeeb # Cleanup networking again. 1498d3373029SBjoern A. Zeeb i=0 1499d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1500d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} inet6 2001:2:${i}::1/64 -alias 1501d3373029SBjoern A. Zeeb setfib -F ${i} route delete -net -inet6 \ 1502d3373029SBjoern A. Zeeb 2001:2:1234::2 2001:2:${i}::2 > /dev/null 1503d3373029SBjoern A. Zeeb i=$((i + 1)) 1504d3373029SBjoern A. Zeeb done 1505d3373029SBjoern A. Zeeb} 1506d3373029SBjoern A. Zeeb 1507d3373029SBjoern A. Zeeb_fwd_fib_symmetric_destructive_defroute_middle_ifconfig() 1508d3373029SBjoern A. Zeeb{ 1509d3373029SBjoern A. Zeeb local _n _maxfib i 1510d3373029SBjoern A. Zeeb _n="$1" 1511d3373029SBjoern A. Zeeb _maxfib=$2 1512d3373029SBjoern A. Zeeb 1513d3373029SBjoern A. Zeeb _fwd_fib_symmetric_destructive_defroute_middle_setup_networking \ 1514d3373029SBjoern A. Zeeb ${_maxfib} 1515d3373029SBjoern A. Zeeb 1516d3373029SBjoern A. Zeeb i=0 1517d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1518d3373029SBjoern A. Zeeb ifconfig ${IFACE} fib ${i} 1519d3373029SBjoern A. Zeeb ifconfig ${IFACEFAR} fib ${i} 1520d3373029SBjoern A. Zeeb setup_ipfw_count ${CTRLPORT} ${_maxfib} ${i} -1 1521d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}_${i}" 1522d3373029SBjoern A. Zeeb ipfw -q zero > /dev/null 1523d3373029SBjoern A. Zeeb # Nothing to do for the middle node testing the default. 1524d3373029SBjoern A. Zeeb sleep 1 1525d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}_${i}" 1526d3373029SBjoern A. Zeeb report_ipfw_count 1527d3373029SBjoern A. Zeeb i=$((i + 1)) 1528d3373029SBjoern A. Zeeb done 1529d3373029SBjoern A. Zeeb 1530d3373029SBjoern A. Zeeb _fwd_fib_symmetric_destructive_defroute_middle_cleanup_networking \ 1531d3373029SBjoern A. Zeeb ${_maxfib} 1532d3373029SBjoern A. Zeeb} 1533d3373029SBjoern A. Zeeb 1534d3373029SBjoern A. Zeeb_fwd_fib_symmetric_destructive_defroute_middle_ipfw() 1535d3373029SBjoern A. Zeeb{ 1536d3373029SBjoern A. Zeeb local _n _maxfib i _port 1537d3373029SBjoern A. Zeeb _n="$1" 1538d3373029SBjoern A. Zeeb _maxfib=$2 1539d3373029SBjoern A. Zeeb 1540d3373029SBjoern A. Zeeb _fwd_fib_symmetric_destructive_defroute_middle_setup_networking \ 1541d3373029SBjoern A. Zeeb ${_maxfib} 1542d3373029SBjoern A. Zeeb 1543d3373029SBjoern A. Zeeb i=0 1544d3373029SBjoern A. Zeeb while test ${i} -lt ${_maxfib}; do 1545d3373029SBjoern A. Zeeb _port=$((CTRLPORT + 1 + i)) 1546d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} ipv6-icmp from any to any \ 1547d3373029SBjoern A. Zeeb icmp6types 128 via ${IFACE} in > /dev/null 1548d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} tcp from any to any \ 1549d3373029SBjoern A. Zeeb dst-port ${_port} via ${IFACE} in > /dev/null 1550d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} udp from any to any \ 1551d3373029SBjoern A. Zeeb dst-port ${_port} via ${IFACE} in > /dev/null 1552d3373029SBjoern A. Zeeb 1553d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} ipv6-icmp from any to any \ 1554d3373029SBjoern A. Zeeb icmp6types 129 via ${IFACEFAR} in > /dev/null 1555d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} tcp from any to any \ 1556d3373029SBjoern A. Zeeb src-port ${_port} via ${IFACEFAR} in > /dev/null 1557d3373029SBjoern A. Zeeb ipfw add 100 setfib ${i} udp from any to any \ 1558d3373029SBjoern A. Zeeb src-port ${_port} via ${IFACEFAR} in > /dev/null 1559d3373029SBjoern A. Zeeb 1560d3373029SBjoern A. Zeeb setup_ipfw_count ${CTRLPORT} ${_maxfib} ${i} -1 1561d3373029SBjoern A. Zeeb wait_remote_ready "START_${_n}_${i}" 1562d3373029SBjoern A. Zeeb ipfw -q zero > /dev/null 1563d3373029SBjoern A. Zeeb # Nothing to do for the middle node testing the default. 1564d3373029SBjoern A. Zeeb sleep 1 1565d3373029SBjoern A. Zeeb wait_remote_ready "STOP_${_n}_${i}" 1566d3373029SBjoern A. Zeeb report_ipfw_count 1567d3373029SBjoern A. Zeeb 1568d3373029SBjoern A. Zeeb ipfw delete 100 > /dev/null 1569d3373029SBjoern A. Zeeb i=$((i + 1)) 1570d3373029SBjoern A. Zeeb done 1571d3373029SBjoern A. Zeeb 1572d3373029SBjoern A. Zeeb _fwd_fib_symmetric_destructive_defroute_middle_cleanup_networking \ 1573d3373029SBjoern A. Zeeb ${_maxfib} 1574d3373029SBjoern A. Zeeb} 1575d3373029SBjoern A. Zeeb 1576d3373029SBjoern A. Zeebfwd_fib_symmetric_destructive_defroute_ifconfig() 1577d3373029SBjoern A. Zeeb{ 1578d3373029SBjoern A. Zeeb local _maxfib _n 1579d3373029SBjoern A. Zeeb _maxfib=$1 1580d3373029SBjoern A. Zeeb 1581d3373029SBjoern A. Zeeb _n="fwd_fib_symmetric_destructive_defroute_ifconfig" 1582d3373029SBjoern A. Zeeb 1583d3373029SBjoern A. Zeeb print_debug "${_n} ${_maxfib}" 1584d3373029SBjoern A. Zeeb case ${node} in 1585d3373029SBjoern A. Zeeb left) _fwd_fib_symmetric_destructive_defroute_left \ 1586d3373029SBjoern A. Zeeb ${_n} ${_maxfib} ;; 1587d3373029SBjoern A. Zeeb middle) _fwd_fib_symmetric_destructive_defroute_middle_ifconfig \ 1588d3373029SBjoern A. Zeeb ${_n} ${_maxfib} ;; 1589d3373029SBjoern A. Zeeb right) _fwd_fib_symmetric_destructive_defroute_right \ 1590d3373029SBjoern A. Zeeb ${_n} ${_maxfib} ;; 1591d3373029SBjoern A. Zeeb esac 1592d3373029SBjoern A. Zeeb} 1593d3373029SBjoern A. Zeeb 1594d3373029SBjoern A. Zeebfwd_fib_symmetric_destructive_defroute_ipfw() 1595d3373029SBjoern A. Zeeb{ 1596d3373029SBjoern A. Zeeb local _maxfib _n 1597d3373029SBjoern A. Zeeb _maxfib=$1 1598d3373029SBjoern A. Zeeb 1599d3373029SBjoern A. Zeeb _n="fwd_fib_symmetric_destructive_defroute_ipfw" 1600d3373029SBjoern A. Zeeb 1601d3373029SBjoern A. Zeeb print_debug "${_n} ${_maxfib}" 1602d3373029SBjoern A. Zeeb case ${node} in 1603d3373029SBjoern A. Zeeb left) _fwd_fib_symmetric_destructive_defroute_left \ 1604d3373029SBjoern A. Zeeb ${_n} ${_maxfib} ;; 1605d3373029SBjoern A. Zeeb middle) _fwd_fib_symmetric_destructive_defroute_middle_ipfw \ 1606d3373029SBjoern A. Zeeb ${_n} ${_maxfib} ;; 1607d3373029SBjoern A. Zeeb right) _fwd_fib_symmetric_destructive_defroute_right \ 1608d3373029SBjoern A. Zeeb ${_n} ${_maxfib} ;; 1609d3373029SBjoern A. Zeeb esac 1610d3373029SBjoern A. Zeeb} 1611d3373029SBjoern A. Zeeb 1612d3373029SBjoern A. Zeeb################################################################################ 1613d3373029SBjoern A. Zeeb# 1614d3373029SBjoern A. Zeeb# MAIN 1615d3373029SBjoern A. Zeeb# 1616d3373029SBjoern A. Zeeb 1617d3373029SBjoern A. Zeeb# Same for all hosts. 1618d3373029SBjoern A. Zeebif test `sysctl -n security.jail.jailed` -eq 0; then 1619d3373029SBjoern A. Zeeb kldload ipfw > /dev/null 2>&1 || kldstat -v | grep -q ipfw 1620d3373029SBjoern A. Zeebfi 1621d3373029SBjoern A. Zeebipfw -f flush > /dev/null 2>&1 || die "please load ipfw in base system" 1622d3373029SBjoern A. Zeebipfw add 65000 permit ip from any to any > /dev/null 2>&1 1623d3373029SBjoern A. Zeeb 1624d3373029SBjoern A. Zeeb# Per host setup. 1625d3373029SBjoern A. Zeebsetup_networking 1626d3373029SBjoern A. Zeebreachability_check 1627d3373029SBjoern A. Zeeb 1628d3373029SBjoern A. Zeeb# 1629d3373029SBjoern A. Zeeb# Tests 1630d3373029SBjoern A. Zeeb# 1631d3373029SBjoern A. Zeeb 1632d3373029SBjoern A. Zeebfwd_default_fib_symmetric 1633d3373029SBjoern A. Zeebfwd_default_fib_symmetric_ifconfig 1634d3373029SBjoern A. Zeebfwd_default_fib_symmetric_ipfw 1635d3373029SBjoern A. Zeeb 1636d3373029SBjoern A. Zeebfwd_fib_symmetric_ifconfig ${RT_NUMFIBS} 1637d3373029SBjoern A. Zeebfwd_fib_symmetric_ipfw ${RT_NUMFIBS} 1638d3373029SBjoern A. Zeeb 1639d3373029SBjoern A. Zeebfwd_fib_asymmetric_ifconfig ${RT_NUMFIBS} 1640d3373029SBjoern A. Zeebfwd_fib_asymmetric_ipfw ${RT_NUMFIBS} 1641d3373029SBjoern A. Zeeb 1642d3373029SBjoern A. Zeebfwd_fib_symmetric_destructive_ifconfig ${RT_NUMFIBS} 1643d3373029SBjoern A. Zeebfwd_fib_symmetric_destructive_ipfw ${RT_NUMFIBS} 1644d3373029SBjoern A. Zeeb 1645d3373029SBjoern A. Zeebfwd_fib_symmetric_destructive_defroute_ifconfig ${RT_NUMFIBS} 1646d3373029SBjoern A. Zeebfwd_fib_symmetric_destructive_defroute_ipfw ${RT_NUMFIBS} 1647d3373029SBjoern A. Zeeb 1648d3373029SBjoern A. Zeeb# Per host cleanup. 1649d3373029SBjoern A. Zeebcleanup_networking 1650d3373029SBjoern A. Zeeb 1651d3373029SBjoern A. Zeeb# end 1652