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