xref: /freebsd/tools/test/netfibs/forwarding.sh (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
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