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