1231858Sbz#!/bin/sh
2231858Sbz#-
3231858Sbz# Copyright (c) 2012 Cisco Systems, Inc.
4231858Sbz# All rights reserved.
5231858Sbz#
6231858Sbz# This software was developed by Bjoern Zeeb under contract to
7231858Sbz# Cisco Systems, Inc..
8231858Sbz#
9231858Sbz# Redistribution and use in source and binary forms, with or without
10231858Sbz# modification, are permitted provided that the following conditions
11231858Sbz# are met:
12231858Sbz# 1. Redistributions of source code must retain the above copyright
13231858Sbz#    notice, this list of conditions and the following disclaimer.
14231858Sbz# 2. Redistributions in binary form must reproduce the above copyright
15231858Sbz#    notice, this list of conditions and the following disclaimer in the
16231858Sbz#    documentation and/or other materials provided with the distribution.
17231858Sbz#
18231858Sbz# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19231858Sbz# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20231858Sbz# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21231858Sbz# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22231858Sbz# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23231858Sbz# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24231858Sbz# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25231858Sbz# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26231858Sbz# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27231858Sbz# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28231858Sbz# SUCH DAMAGE.
29231858Sbz#
30231858Sbz# $FreeBSD$
31231858Sbz#
32231858Sbz
33231858Sbz# We will use the RFC5180 (and Errata) benchmarking working group prefix
34231858Sbz# 2001:0002::/48 for testing.
35231858SbzPREFIX="2001:2:"
36231858Sbz
37231858Sbz# Set IFACE to the real interface you want to run the test on.
38231858Sbz: ${IFACE:=lo0}
39231858Sbz
40231858Sbz# Control port we use to exchange messages between nodes to sync. tests, etc.
41231858Sbz: ${CTRLPORT:=6666}
42231858Sbz
43231858Sbz# Get the number of FIBs from the kernel.
44231858SbzRT_NUMFIBS=`sysctl -n net.fibs`
45231858Sbz
46231858SbzPEERADDR="2001:2:ff00::1"
47231858SbzOURADDR="2001:2:ff00::2"
48231858Sbz
49231858SbzOURLINKLOCAL=""
50231858SbzPEERLINKLOCAL=""
51231858Sbz
52231858Sbz# By default all commands must succeed.  Individual tests may disable this
53231858Sbz# temporary.
54231858Sbzset -e
55231858Sbz
56231858Sbz# Debug magic.
57231858Sbzcase "${DEBUG}" in
58231858Sbz42)	set -x ;;
59231858Sbzesac
60231858Sbz
61231858Sbz
62231858Sbz
63231858Sbz#
64231858Sbz# Helper functions.
65231858Sbz#
66231858Sbz
67231858Sbz# Function to avoid prelist races adding and deleting prefixes too quickly.
68231858Sbzdelay()
69231858Sbz{
70231858Sbz
71231858Sbz	# sleep 1 is too long.
72231858Sbz	touch /tmp/foo || true
73232114Sbz	stat /tmp/foo > /dev/null 2>&1 || true
74231858Sbz}
75231858Sbz
76231858Sbzcheck_rc()
77231858Sbz{
78231858Sbz	local _rc _exp _testno _testname _msg _r
79231858Sbz	_rc=$1
80231858Sbz	_exp=$2
81231858Sbz	_testno=$3
82231858Sbz	_testname="$4"
83231858Sbz	_msg="$5"
84231858Sbz
85231858Sbz	_r="not ok"
86231858Sbz	if test ${_rc} -eq ${_exp}; then
87231858Sbz		_r="ok"
88231858Sbz	fi
89231858Sbz	echo "${_r} ${_testno} ${_testname} # ${_msg} ${_rc}"
90231858Sbz}
91231858Sbz
92231858Sbzprint_debug()
93231858Sbz{
94231858Sbz	local _msg
95231858Sbz	_msg="$*"
96231858Sbz
97231858Sbz	case ${DEBUG} in
98231858Sbz	''|0)	;;
99231858Sbz	*)	echo "DEBUG: ${_msg}" >&2 ;;
100231858Sbz	esac
101231858Sbz}
102231858Sbz
103231858Sbzdie()
104231858Sbz{
105231858Sbz	local _msg
106231858Sbz	_msg="$*"
107231858Sbz
108231858Sbz	echo "ERROR: ${_msg}" >&2
109231858Sbz	exit 1
110231858Sbz}
111231858Sbz
112231858Sbz#
113231858Sbz# Test functions.
114231858Sbz#
115231858Sbz
116231858Sbz# Setup our side and wait for the peer to tell us that it is ready.
117231858Sbzwait_remote_ready()
118231858Sbz{
119231858Sbz	local _greeting _keyword _fibs _linklocal i
120231858Sbz
121231858Sbz	print_debug "Setting up interface ${IFACE}"
122231858Sbz	ifconfig ${IFACE} inet6 ${OURADDR}/64 -alias > /dev/null 2>&1 || true
123231858Sbz	delay
124231858Sbz	ifconfig ${IFACE} inet6 ${OURADDR}/64 alias up
125231858Sbz	i=0
126231858Sbz	while test ${i} -lt ${RT_NUMFIBS}; do
127231858Sbz		ifconfig ${IFACE} inet6 2001:2:${i}::2/64 -alias \
128231858Sbz		    > /dev/null 2>&1 || true
129231858Sbz		delay
130231858Sbz		i=$((i + 1))
131231858Sbz	done
132231858Sbz	OURLINKLOCAL=`ifconfig ${IFACE} | awk '/inet6 fe80:/ { print $2 }'`
133231858Sbz
134231858Sbz	# Let things settle.
135231858Sbz	print_debug "Waiting 4 seconds for things to settle"
136231858Sbz	sleep 4
137231858Sbz
138231858Sbz	# Wait for the remote to connect and start things.
139231858Sbz	# We tell it the magic keyword, our number of FIBs and our link-local.
140231858Sbz	# It already knows our global address.
141231858Sbz	_greeting=`echo "SETUP ${RT_NUMFIBS} ${OURLINKLOCAL}" | \
142231858Sbz	    nc -6 -l ${CTRLPORT}`
143231858Sbz
144231858Sbz	read _keyword _fibs _linklocal <<EOI
145231858Sbz${_greeting}
146231858SbzEOI
147231858Sbz	print_debug "_keyword=${_keyword}"
148231858Sbz	print_debug "_fibs=${_fibs}"
149231858Sbz	print_debug "_linklocal=${_linklocal}"
150231858Sbz	case ${_keyword} in
151231858Sbz	SETUP)	;;
152231858Sbz	*)	die "Got invalid keyword in greeting: ${_greeting}"
153231858Sbz		;;
154231858Sbz	esac
155231858Sbz	if test ${_fibs} -ne ${RT_NUMFIBS}; then
156231858Sbz		die "Number of FIBs not matching ours (${RT_NUMFIBS}) in" \
157231858Sbz		    "greeting: ${_greeting}"
158231858Sbz	fi
159231858Sbz	PEERLINKLOCAL=${_linklocal}
160231858Sbz
161231858Sbz	print_debug "Successfully received greeting. Peer at ${PEERLINKLOCAL}"
162231858Sbz}
163231858Sbz
164231858Sbzcleanup()
165231858Sbz{
166231858Sbz
167231858Sbz	print_debug "Removing address from interface ${IFACE}"
168231858Sbz	ifconfig ${IFACE} inet6 ${OURADDR}/64 -alias
169231858Sbz	delay
170231858Sbz}
171231858Sbz
172231858Sbz################################################################################
173231858Sbz#
174231858Sbztesttx_icmp6_connected()
175231858Sbz{
176231858Sbz	local _opts
177231858Sbz
178231858Sbz	_opts=""
179231858Sbz	case ${DEBUG} in
180231858Sbz	''|0)	;;
181231858Sbz	42)	_opts="-d -d" ;;
182231858Sbz	*)	_opts="-d" ;;
183231858Sbz	esac
184231858Sbz	print_debug "./reflect -p ${CTRLPORT} -T TCP6 " \
185231858Sbz	    "-t testtx_icmp6_connected ${_opts}"
186231858Sbz	./reflect -p ${CTRLPORT} -T TCP6 -t testtx_icmp6_connected ${_opts}
187231858Sbz	print_debug "reflect terminated without error."
188231858Sbz}
189231858Sbz
190231858Sbztesttx_tcp6_connected()
191231858Sbz{
192231858Sbz	local _opts
193231858Sbz
194231858Sbz	_opts=""
195231858Sbz	case ${DEBUG} in
196231858Sbz	''|0)	;;
197231858Sbz	42)	_opts="-d -d" ;;
198231858Sbz	*)	_opts="-d" ;;
199231858Sbz	esac
200231858Sbz	print_debug "./reflect -p ${CTRLPORT} -T TCP6 " \
201231858Sbz	    "-t testtx_tcp6_connected ${_opts}"
202231858Sbz	./reflect -p ${CTRLPORT} -T TCP6 -t testtx_tcp6_connected ${_opts}
203231858Sbz	print_debug "reflect terminated without error."
204231858Sbz}
205231858Sbz
206231858Sbztesttx_udp6_connected()
207231858Sbz{
208231858Sbz	local _opts
209231858Sbz
210231858Sbz	_opts=""
211231858Sbz	case ${DEBUG} in
212231858Sbz	''|0)	;;
213231858Sbz	42)	_opts="-d -d" ;;
214231858Sbz	*)	_opts="-d" ;;
215231858Sbz	esac
216231858Sbz	print_debug "./reflect -p ${CTRLPORT} -T UDP6 " \
217231858Sbz	    "-t testtx_udp6_connected ${_opts}"
218231858Sbz	./reflect -p ${CTRLPORT} -T UDP6 -t testtx_udp6_connected ${_opts}
219231858Sbz	print_debug "reflect terminated without error."
220231858Sbz}
221231858Sbz
222231858Sbz################################################################################
223231858Sbz#
224231858Sbztesttx_icmp6_connected_blackhole()
225231858Sbz{
226232114Sbz	local _opts fib
227231858Sbz
228231858Sbz	_opts=""
229231858Sbz	case ${DEBUG} in
230231858Sbz	''|0)	;;
231231858Sbz	42)	_opts="-d -d" ;;
232231858Sbz	*)	_opts="-d" ;;
233231858Sbz	esac
234231858Sbz
235232114Sbz	fib=0
236232114Sbz	while test ${fib} -lt ${RT_NUMFIBS}; do
237231858Sbz		print_debug "./reflect -p ${CTRLPORT} -T TCP6 " \
238232114Sbz		    "-t testtx_icmp6_connected_blackhole${fib} ${_opts}"
239231858Sbz		./reflect -p ${CTRLPORT} -T TCP6 \
240232114Sbz		    -t testtx_icmp6_connected_blackhole${fib} ${_opts}
241231858Sbz		print_debug "reflect terminated without error."
242232114Sbz		fib=$((fib + 1))
243231858Sbz	done
244231858Sbz}
245231858Sbz
246231858Sbztesttx_tcp6_connected_blackhole()
247231858Sbz{
248232114Sbz	local _opts fib
249231858Sbz
250231858Sbz	_opts=""
251231858Sbz	case ${DEBUG} in
252231858Sbz	''|0)	;;
253231858Sbz	42)	_opts="-d -d" ;;
254231858Sbz	*)	_opts="-d" ;;
255231858Sbz	esac
256231858Sbz
257232114Sbz	fib=0
258232114Sbz	while test ${fib} -lt ${RT_NUMFIBS}; do
259231858Sbz		print_debug "./reflect -p ${CTRLPORT} -T TCP6 " \
260232114Sbz		    "-t testtx_tcp6_connected_blackhole${fib} ${_opts}"
261231858Sbz		./reflect -p ${CTRLPORT} -T TCP6 \
262232114Sbz		    -t testtx_tcp6_connected_blackhole${fib} ${_opts}
263231858Sbz		print_debug "reflect terminated without error."
264232114Sbz		fib=$((fib + 1))
265231858Sbz	done
266231858Sbz}
267231858Sbz
268231858Sbztesttx_udp6_connected_blackhole()
269231858Sbz{
270232114Sbz	local _opts fib
271231858Sbz
272231858Sbz	_opts=""
273231858Sbz	case ${DEBUG} in
274231858Sbz	''|0)	;;
275231858Sbz	42)	_opts="-d -d" ;;
276231858Sbz	*)	_opts="-d" ;;
277231858Sbz	esac
278231858Sbz
279232114Sbz	fib=0
280232114Sbz	while test ${fib} -lt ${RT_NUMFIBS}; do
281231858Sbz		print_debug "./reflect -p ${CTRLPORT} -T UDP6 " \
282232114Sbz		    "-t testtx_udp6_connected_blackhole${fib} ${_opts}"
283231858Sbz		./reflect -p ${CTRLPORT} -T UDP6 \
284232114Sbz		    -t testtx_udp6_connected_blackhole${fib} ${_opts}
285231858Sbz		print_debug "reflect terminated without error."
286232114Sbz		fib=$((fib + 1))
287231858Sbz	done
288231858Sbz}
289231858Sbz
290231858Sbz################################################################################
291231858Sbz#
292231858Sbztesttx_ulp6_connected_transfernets()
293231858Sbz{
294232114Sbz	local _opts fib _n _o
295231858Sbz	_n="$1"
296231858Sbz	_o="$2"
297231858Sbz
298231858Sbz	_opts=""
299231858Sbz	case ${DEBUG} in
300231858Sbz	''|0)	;;
301231858Sbz	42)	_opts="-d -d" ;;
302231858Sbz	*)	_opts="-d" ;;
303231858Sbz	esac
304231858Sbz
305231858Sbz	# Setup transfer networks.
306232114Sbz	fib=0
307232114Sbz	while test ${fib} -lt ${RT_NUMFIBS}; do
308232114Sbz		setfib -F${fib} \
309232114Sbz		    ifconfig ${IFACE} inet6 2001:2:${fib}::2/64 alias
310232114Sbz		fib=$((fib + 1))
311231858Sbz	done
312231858Sbz
313232114Sbz	fib=0
314232114Sbz	while test ${fib} -lt ${RT_NUMFIBS}; do
315232114Sbz		print_debug "./reflect -p ${CTRLPORT} -T ${_o} -t ${_n}${fib} ${_opts}"
316232114Sbz		./reflect -p ${CTRLPORT} -T ${_o} -t ${_n}${fib} ${_opts}
317231858Sbz		print_debug "reflect terminated without error."
318232114Sbz		fib=$((fib + 1))
319231858Sbz	done
320231858Sbz
321231858Sbz	# Cleanup transfer networks.
322232114Sbz	fib=0
323232114Sbz	while test ${fib} -lt ${RT_NUMFIBS}; do
324232114Sbz		setfib -F${fib} \
325232114Sbz		    ifconfig ${IFACE} inet6 2001:2:${fib}::2/64 -alias
326231858Sbz		delay
327232114Sbz		fib=$((fib + 1))
328231858Sbz	done
329231858Sbz}
330231858Sbz
331231858Sbztesttx_icmp6_connected_transfernets()
332231858Sbz{
333231858Sbz
334231858Sbz	testtx_ulp6_connected_transfernets \
335231858Sbz	    "testtx_icmp6_connected_transfernets" "TCP6"
336231858Sbz}
337231858Sbz
338231858Sbztesttx_tcp6_connected_transfernets()
339231858Sbz{
340231858Sbz
341231858Sbz	testtx_ulp6_connected_transfernets \
342231858Sbz	    "testtx_tcp6_connected_transfernets" "TCP6"
343231858Sbz}
344231858Sbz
345231858Sbztesttx_udp6_connected_transfernets()
346231858Sbz{
347231858Sbz
348231858Sbz	testtx_ulp6_connected_transfernets \
349231858Sbz	    "testtx_udp6_connected_transfernets" "UDP6"
350231858Sbz}
351231858Sbz
352231858Sbztesttx_icmp6_connected_ifconfig_transfernets()
353231858Sbz{
354231858Sbz
355231858Sbz	testtx_ulp6_connected_transfernets \
356231858Sbz	    "testtx_icmp6_connected_ifconfig_transfernets" "TCP6"
357231858Sbz}
358231858Sbz
359231858Sbztesttx_tcp6_connected_ifconfig_transfernets()
360231858Sbz{
361231858Sbz
362231858Sbz	testtx_ulp6_connected_transfernets \
363231858Sbz	    "testtx_tcp6_connected_ifconfig_transfernets" "TCP6"
364231858Sbz}
365231858Sbz
366231858Sbztesttx_udp6_connected_ifconfig_transfernets()
367231858Sbz{
368231858Sbz
369231858Sbz	testtx_ulp6_connected_transfernets \
370231858Sbz	    "testtx_udp6_connected_ifconfig_transfernets" "UDP6"
371231858Sbz}
372231858Sbz
373231858Sbz################################################################################
374231858Sbz#
375231858Sbztesttx_ulp6_gateway()
376231858Sbz{
377231858Sbz	local _opts _n _o
378231858Sbz	_n="$1"
379231858Sbz	_o="$2"
380231858Sbz
381231858Sbz	ifconfig lo0 inet6 2001:2:ff01::2 -alias > /dev/null 2>&1 || true
382231858Sbz	delay
383231858Sbz	ifconfig lo0 inet6 2001:2:ff01::2 alias
384231858Sbz
385231858Sbz	_opts=""
386231858Sbz	case ${DEBUG} in
387231858Sbz	''|0)	;;
388231858Sbz	42)	_opts="-d -d" ;;
389231858Sbz	*)	_opts="-d" ;;
390231858Sbz	esac
391231858Sbz
392231858Sbz	print_debug "./reflect -p ${CTRLPORT} -T ${_o} " \
393231858Sbz	    "-t ${_n} ${_opts} -A 2001:2:ff01::2"
394231858Sbz	./reflect -p ${CTRLPORT} -T ${_o} \
395231858Sbz	    -t ${_n} ${_opts} -A 2001:2:ff01::2
396231858Sbz	print_debug "reflect terminated without error."
397231858Sbz
398231858Sbz	ifconfig lo0 inet6 2001:2:ff01::2 -alias
399231858Sbz	delay
400231858Sbz}
401231858Sbz
402231858Sbztesttx_icmp6_gateway()
403231858Sbz{
404231858Sbz
405231858Sbz	testtx_ulp6_gateway "testtx_icmp6_gateway" "TCP6"
406231858Sbz}
407231858Sbz
408231858Sbztesttx_tcp6_gateway()
409231858Sbz{
410231858Sbz
411231858Sbz	testtx_ulp6_gateway "testtx_tcp6_gateway" "TCP6"
412231858Sbz}
413231858Sbz
414231858Sbztesttx_udp6_gateway()
415231858Sbz{
416231858Sbz
417231858Sbz	testtx_ulp6_gateway "testtx_udp6_gateway" "UDP6"
418231858Sbz}
419231858Sbz
420231858Sbz################################################################################
421231858Sbz#
422231858Sbztesttx_ulp6_transfernets_gateways()
423231858Sbz{
424232114Sbz	local _opts fib _n _o
425231858Sbz	_n="$1"
426231858Sbz	_o="$2"
427231858Sbz
428231858Sbz	_opts=""
429231858Sbz	case ${DEBUG} in
430231858Sbz	''|0)	;;
431231858Sbz	42)	_opts="-d -d" ;;
432231858Sbz	*)	_opts="-d" ;;
433231858Sbz	esac
434231858Sbz
435231858Sbz	# Setup transfer networks.
436232114Sbz	fib=0
437232114Sbz	while test ${fib} -lt ${RT_NUMFIBS}; do
438232114Sbz		setfib -F${fib} \
439232114Sbz		    ifconfig ${IFACE} inet6 2001:2:${fib}::2/64 alias
440232114Sbz		fib=$((fib + 1))
441231858Sbz	done
442231858Sbz
443231858Sbz	# Setup out listener IP.
444231858Sbz	ifconfig lo0 inet6 2001:2:ff01::2 -alias > /dev/null 2>&1 || true
445231858Sbz	delay
446231858Sbz	ifconfig lo0 inet6 2001:2:ff01::2 alias
447231858Sbz
448231858Sbz	# Reflect requests.
449231858Sbz	print_debug "./reflect -p ${CTRLPORT} -T ${_o} " \
450231858Sbz	    "-t ${_n} ${_opts} -A 2001:2:ff01::2"
451231858Sbz	./reflect -p ${CTRLPORT} -T ${_o} \
452231858Sbz	    -t ${_n} ${_opts} -A 2001:2:ff01::2
453231858Sbz	print_debug "reflect terminated without error."
454231858Sbz
455231858Sbz	# Cleanup transfer networks and listener IP.
456232114Sbz	fib=0
457232114Sbz	while test ${fib} -lt ${RT_NUMFIBS}; do
458232114Sbz		setfib -F${fib} \
459232114Sbz		    ifconfig ${IFACE} inet6 2001:2:${fib}::2/64 -alias
460231858Sbz		delay
461232114Sbz		fib=$((fib + 1))
462231858Sbz	done
463231858Sbz	ifconfig lo0 inet6 2001:2:ff01::2 -alias
464231858Sbz}
465231858Sbz
466231858Sbztesttx_icmp6_transfernets_gateways()
467231858Sbz{
468231858Sbz
469231858Sbz	testtx_ulp6_transfernets_gateways \
470231858Sbz	    "testtx_icmp6_transfernets_gateways" "TCP6"
471231858Sbz}
472231858Sbz
473231858Sbztesttx_tcp6_transfernets_gateways()
474231858Sbz{
475231858Sbz
476231858Sbz	testtx_ulp6_transfernets_gateways \
477231858Sbz	    "testtx_tcp6_transfernets_gateways" "TCP6"
478231858Sbz}
479231858Sbz
480231858Sbztesttx_udp6_transfernets_gateways()
481231858Sbz{
482231858Sbz
483231858Sbz	testtx_ulp6_transfernets_gateways \
484231858Sbz	    "testtx_udp6_transfernets_gateways" "UDP6"
485231858Sbz}
486231858Sbz
487231858Sbz
488231858Sbz################################################################################
489231858Sbz#
490231858Sbztesttx_ulp6_transfernets_gateway()
491231858Sbz{
492232114Sbz	local _opts fib _n _o
493231858Sbz	_n="$1"
494231858Sbz	_o="$2"
495231858Sbz
496231858Sbz	_opts=""
497231858Sbz	case ${DEBUG} in
498231858Sbz	''|0)	;;
499231858Sbz	42)	_opts="-d -d" ;;
500231858Sbz	*)	_opts="-d" ;;
501231858Sbz	esac
502231858Sbz
503231858Sbz	# Setup transfer networks.
504232114Sbz	fib=0
505232114Sbz	while test ${fib} -lt ${RT_NUMFIBS}; do
506232114Sbz		setfib -F${fib} \
507232114Sbz		    ifconfig ${IFACE} inet6 2001:2:${fib}::2/64 alias
508232114Sbz		fib=$((fib + 1))
509231858Sbz	done
510231858Sbz
511231858Sbz	# Setup out listener IP.
512231858Sbz	ifconfig lo0 inet6 2001:2:ff01::2 -alias > /dev/null 2>&1 || true
513231858Sbz	delay
514231858Sbz	ifconfig lo0 inet6 2001:2:ff01::2 alias
515231858Sbz
516231858Sbz	# Reflect requests.
517232114Sbz	fib=0
518232114Sbz	while test ${fib} -lt ${RT_NUMFIBS}; do
519231858Sbz		print_debug "./reflect -p ${CTRLPORT} -T ${_o} " \
520232114Sbz		    "-t ${_n}${fib} ${_opts} -A 2001:2:ff01::2"
521231858Sbz		./reflect -p ${CTRLPORT} -T ${_o} \
522232114Sbz		    -t ${_n}${fib} ${_opts} -A 2001:2:ff01::2
523231858Sbz		print_debug "reflect terminated without error."
524232114Sbz		fib=$((fib + 1))
525231858Sbz	done
526231858Sbz
527231858Sbz	# Cleanup transfer networks and listener IP.
528232114Sbz	fib=0
529232114Sbz	while test ${fib} -lt ${RT_NUMFIBS}; do
530232114Sbz		setfib -F${fib} \
531232114Sbz		    ifconfig ${IFACE} inet6 2001:2:${fib}::2/64 -alias
532231858Sbz		delay
533232114Sbz		fib=$((fib + 1))
534231858Sbz	done
535231858Sbz	ifconfig lo0 inet6 2001:2:ff01::2 -alias
536231858Sbz}
537231858Sbz
538231858Sbztesttx_icmp6_transfernets_gateway()
539231858Sbz{
540231858Sbz
541231858Sbz	testtx_ulp6_transfernets_gateway \
542231858Sbz	    "testtx_icmp6_transfernets_gateway" "TCP6"
543231858Sbz}
544231858Sbz
545231858Sbztesttx_tcp6_transfernets_gateway()
546231858Sbz{
547231858Sbz
548231858Sbz	testtx_ulp6_transfernets_gateway \
549231858Sbz	    "testtx_tcp6_transfernets_gateway" "TCP6"
550231858Sbz}
551231858Sbz
552231858Sbztesttx_udp6_transfernets_gateway()
553231858Sbz{
554231858Sbz
555231858Sbz	testtx_ulp6_transfernets_gateway \
556231858Sbz	    "testtx_udp6_transfernets_gateway" "UDP6"
557231858Sbz}
558231858Sbz
559231858Sbz################################################################################
560231858Sbz#
561231858Sbz# We are receiver, but the FIBs are with us this time.
562231858Sbz#
563231858Sbz#
564231858Sbz
565231858Sbz#       # For IPFW, IFCONFIG
566231858Sbz#       #   For each FIB
567231858Sbz#       #     Send OOB well known to work START, wait for reflect
568231858Sbz#       #     Send probe, wait for reply with FIB# or RST/ICMP6 unreach
569231858Sbz#       #       (in case of ICMP6 use magic like ipfw count and OOB reply)
570231858Sbz#       #     Send OOB well known to work DONE, wait for reflect   
571231858Sbz#       #     Compare real with expected results.
572231858Sbz#
573231858Sbz
574231858Sbztextrx_ipfw_setup()
575231858Sbz{
576231858Sbz	local _fib _transfer i _p _o
577231858Sbz	_fib=$1
578231858Sbz	_transfer=$2
579231858Sbz
580231858Sbz	# ICMP6 would need content inspection to distinguish FIB, we can
581231858Sbz	# only differentiate by address.
582231858Sbz	# For the default single-address cases always set to current FIB.
583231858Sbz	ipfw add 100 setfib ${_fib} ipv6-icmp \
584231858Sbz	    from ${PEERADDR} to ${OURADDR} \
585231858Sbz	    via ${IFACE} in > /dev/null 2>&1
586231858Sbz	ipfw add 100 setfib ${_fib} ipv6-icmp \
587231858Sbz	    from ${PEERLINKLOCAL%\%*} to ${OURLINKLOCAL%\%*} \
588231858Sbz	    via ${IFACE} in > /dev/null 2>&1
589231858Sbz
590231858Sbz	# Always also do a setfib for the control port so that OOB
591231858Sbz	# signaling workes even if we remove connected subnets.
592231858Sbz	ipfw add 200 setfib ${_fib} ip6 from ${PEERADDR} to ${OURADDR} \
593231858Sbz	    dst-port ${CTRLPORT} via ${IFACE} in > /dev/null 2>&1
594231858Sbz
595231858Sbz	# Save addresses
596231858Sbz	_p="${PEERADDR}"
597231858Sbz	_o="${OURADDR}"
598231858Sbz
599231858Sbz	i=0
600231858Sbz	while test ${i} -lt ${RT_NUMFIBS}; do
601231858Sbz
602231858Sbz		# If doing multiple transfer networks, replace PEERADDR.
603231858Sbz		case ${_transfer} in
604231858Sbz		1)	PEERADDR=2001:2:${i}::1
605231858Sbz			OURADDR=2001:2:${i}::2
606231858Sbz			;;
607231858Sbz		esac
608231858Sbz
609231858Sbz		if test ${_instances} -gt 1 -o ${_transfer} -eq 1; then
610231858Sbz			ipfw add 400 setfib ${_fib} ipv6-icmp \
611231858Sbz			    from ${PEERADDR} to ${OURADDR} \
612231858Sbz			    icmp6types 128 \
613231858Sbz			    via ${IFACE} in > /dev/null 2>&1
614231858Sbz		fi
615231858Sbz		
616231858Sbz		case ${i} in
617231858Sbz		${_fib})
618231858Sbz			ipfw add 400 setfib ${_fib} ip6 \
619231858Sbz			    from ${PEERADDR} to ${OURADDR} \
620231858Sbz			    dst-port $((CTRLPORT + 1000 + i)) \
621231858Sbz			    via ${IFACE} in > /dev/null 2>&1
622231858Sbz			ipfw add 400 setfib ${_fib} ip6 \
623231858Sbz			    from ${PEERLINKLOCAL%\%*} to ${OURLINKLOCAL%\%*} \
624231858Sbz			    dst-port $((CTRLPORT + 1000 + i)) \
625231858Sbz			    via ${IFACE} in > /dev/null 2>&1
626231858Sbz			if test ${_instances} -le 1 -o ${_transfer} -ne 1; then
627231858Sbz				ipfw add 400 setfib ${_fib} ipv6-icmp \
628231858Sbz				    from ${PEERADDR} to ${OURADDR} \
629231858Sbz				    icmp6types 128 \
630231858Sbz				    via ${IFACE} in > /dev/null 2>&1
631231858Sbz			fi
632231858Sbz			;;
633231858Sbz		esac
634231858Sbz
635231858Sbz		i=$((i + 1))
636231858Sbz	done
637231858Sbz
638231858Sbz	# Restore addresses.
639231858Sbz	PEERADDR="${_p}"
640231858Sbz	OURADDR="${_o}"
641231858Sbz
642231858Sbz	case ${DEBUG} in
643231858Sbz	''|0)	;;
644231858Sbz	*)	ipfw show ;;
645231858Sbz	esac
646231858Sbz}
647231858Sbz
648231858Sbztextrx_ifconfig_setup()
649231858Sbz{
650231858Sbz	local _fib
651231858Sbz	_fib=$1
652231858Sbz
653231858Sbz	ifconfig ${IFACE} fib ${_fib} > /dev/null 2>&1
654231858Sbz}
655231858Sbz
656231858Sbztextrx_ipfw_cleanup()
657231858Sbz{
658231858Sbz	local i
659231858Sbz
660231858Sbz	case ${DEBUG} in
661231858Sbz	''|0)	;;
662231858Sbz	*)	ipfw show ;;
663231858Sbz	esac
664231858Sbz
665231858Sbz	ipfw delete 100 > /dev/null 2>&1 || true
666231858Sbz	ipfw delete 200 > /dev/null 2>&1 || true
667231858Sbz	ipfw delete 400 > /dev/null 2>&1 || true
668231858Sbz
669231858Sbz	i=0
670231858Sbz	while test ${i} -lt ${RT_NUMFIBS}; do
671231858Sbz
672231858Sbz		ipfw delete $((1000 + i)) > /dev/null 2>&1 || true
673231858Sbz		i=$((i + 1))
674231858Sbz	done
675231858Sbz}
676231858Sbz
677231858Sbztextrx_ifconfig_cleanup()
678231858Sbz{
679231858Sbz
680231858Sbz	ifconfig ${IFACE} fib 0 > /dev/null 2>&1
681231858Sbz}
682231858Sbz
683231858Sbztextrx_count_setup()
684231858Sbz{
685231858Sbz	local i
686231858Sbz
687231858Sbz	i=0
688231858Sbz	while test ${i} -lt ${RT_NUMFIBS}; do
689231858Sbz
690231858Sbz		# Count ICMP6 echo replies.
691231858Sbz		ipfw add $((500 + i)) count ipv6-icmp from any to any \
692231858Sbz		    icmp6types 129 fib ${i} via ${IFACE} out > /dev/null 2>&1
693231858Sbz		ipfw add $((500 + i)) count tcp from any to any \
694231858Sbz		    fib ${i} via ${IFACE} out > /dev/null 2>&1
695231858Sbz		ipfw add $((500 + i)) count udp from any to any \
696231858Sbz		    fib ${i} via ${IFACE} out > /dev/null 2>&1
697231858Sbz		i=$((i + 1))
698231858Sbz	done
699231858Sbz}
700231858Sbz
701231858Sbztextrx_count_results()
702231858Sbz{
703231858Sbz	local _fib _o i _rstr _c _req _p _opts
704231858Sbz	_fib=$1
705231858Sbz	_o="$2"
706231858Sbz
707231858Sbz	case ${DEBUG} in
708231858Sbz	''|0)	;;
709231858Sbz	*)	ipfw show ;;
710231858Sbz	esac
711231858Sbz
712231858Sbz	_rstr=""
713231858Sbz	i=0
714231858Sbz	while test ${i} -lt ${RT_NUMFIBS}; do
715231858Sbz
716231858Sbz		case "${_o}" in
717231858Sbz		"-i")	_c=`ipfw show $((500 + i)) | awk '/ ipv6-icmp / { print $2 }'` ;;
718231858Sbz		"-u")	_c=`ipfw show $((500 + i)) | awk '/ udp / { print $2 }'` ;;
719231858Sbz		*)	_c=`ipfw show $((500 + i)) | awk '/ tcp / { print $2 }'` ;;
720231858Sbz		esac
721231858Sbz		_rstr="${_rstr}${i} ${_c},"
722231858Sbz
723231858Sbz		ipfw delete $((500 + i)) > /dev/null 2>&1 || true
724231858Sbz		i=$((i + 1))
725231858Sbz	done
726231858Sbz
727231858Sbz	# We do not care about the request.
728231858Sbz	_req=`echo "RESULT ${_rstr}" | nc -V ${_fib} -6 -l ${CTRLPORT}`
729231858Sbz	print_debug "$? -- ${_req} -- RESULT ${_rstr}"
730231858Sbz}
731231858Sbz
732231858Sbztestrx_remove_connected()
733231858Sbz{
734231858Sbz	local _fib _transfer i j _prefix
735231858Sbz	_fib=$1
736231858Sbz	_transfer=$2
737231858Sbz
738231858Sbz	if test ${_transfer} -eq 1; then
739231858Sbz		i=0
740231858Sbz		while test ${i} -lt ${RT_NUMFIBS}; do
741231858Sbz			j=0
742231858Sbz			while test ${j} -lt ${RT_NUMFIBS}; do
743231858Sbz				_prefix="2001:2:${j}::"
744231858Sbz
745231858Sbz				case ${j} in
746231858Sbz				${_fib});;
747231858Sbz				*)	print_debug "setfib -F${i} route delete" \
748231858Sbz					    "-inet6 -net ${_prefix}"
749231858Sbz					setfib -F${i} route delete -inet6 -net \
750231858Sbz					    ${_prefix} > /dev/null 2>&1
751231858Sbz					;;
752231858Sbz				esac
753231858Sbz				j=$((j + 1))
754231858Sbz			done
755231858Sbz			i=$((i + 1))
756231858Sbz		done
757231858Sbz
758231858Sbz	else
759232114Sbz		_prefix=${OURADDR%2}	# Luckily we know the details.
760231858Sbz		i=0
761231858Sbz		while test ${i} -lt ${RT_NUMFIBS}; do
762231858Sbz
763231858Sbz			case ${i} in
764231858Sbz			${_fib});;
765231858Sbz			*)	print_debug "setfib -F${i} route delete" \
766231858Sbz				    "-inet6 -net ${_prefix}"
767231858Sbz				setfib -F${i} route delete -inet6 -net \
768231858Sbz				    ${_prefix} > /dev/null 2>&1
769231858Sbz				;;
770231858Sbz			esac
771231858Sbz
772231858Sbz			i=$((i + 1))
773231858Sbz		done
774231858Sbz	fi
775231858Sbz}
776231858Sbz
777231858Sbztestrx_cleanup_connected()
778231858Sbz{
779231858Sbz	local _fib _transfer i _prefix
780231858Sbz	_fib=$1
781231858Sbz	_transfer=$2
782231858Sbz
783231858Sbz	if test ${_transfer} -eq 1; then
784231858Sbz
785231858Sbz		i=0
786231858Sbz		while test ${i} -lt ${RT_NUMFIBS}; do
787231858Sbz			setfib -F${i} \
788231858Sbz			   ifconfig ${IFACE} inet6 2001:2:${i}::2/64 -alias \
789231858Sbz			    > /dev/null 2>&1
790231858Sbz			delay
791231858Sbz			i=$((i + 1))
792231858Sbz		done
793231858Sbz
794231858Sbz	else
795231858Sbz		# Use the hammer removing the address and adding it again to get
796231858Sbz		# the connected subnet back to all FIBs.  Hard to do otherwise.
797231858Sbz		ifconfig ${IFACE} inet6 ${OURADDR}/64 -alias || true
798231858Sbz		delay
799231858Sbz		ifconfig ${IFACE} inet6 ${OURADDR}/64 alias up
800231858Sbz	fi
801231858Sbz}
802231858Sbz
803231858Sbztestrx_setup_transfer_networks()
804231858Sbz{
805231858Sbz	local i
806231858Sbz
807231858Sbz	i=0
808231858Sbz	while test ${i} -lt ${RT_NUMFIBS}; do
809231858Sbz		ifconfig ${IFACE} inet6 2001:2:${i}::2/64 -alias \
810231858Sbz		    > /dev/null 2>&1 || true
811231858Sbz		delay
812231858Sbz		ifconfig ${IFACE} inet6 2001:2:${i}::2/64 alias
813231858Sbz		i=$((i + 1))
814231858Sbz	done
815231858Sbz}
816231858Sbz
817231858Sbztestrx_run_one()
818231858Sbz{
819231858Sbz	local _fib _txt _opts
820231858Sbz	_fib=$1
821231858Sbz	_txt="$2"
822231858Sbz	_opts="$3"
823231858Sbz
824231858Sbz	case ${USE_SOSETFIB} in
825231858Sbz	0)	print_debug "setfib -F${_fib} ./reflect -p ${CTRLPORT}" \
826231858Sbz		    "-t ${_txt} ${_opts}"
827231858Sbz		setfib -F${_fib} ./reflect -p ${CTRLPORT} -t ${_txt} ${_opts}
828231858Sbz		;;
829231858Sbz	1)	print_debug "./reflect -F${_fib} -p ${CTRLPORT} -t ${_txt}" \
830231858Sbz		    "${_opts}"
831231858Sbz		./reflect -F${_fib} -p ${CTRLPORT} -t ${_txt} ${_opts}
832231858Sbz		;;
833231858Sbz	*)	die "Invalid value for USE_SOSETFIB: ${USE_SOSETFIB}" ;;
834231858Sbz	esac
835231858Sbz	print_debug "reflect '${_txt}' terminated without error."
836231858Sbz}
837231858Sbz
838231858Sbztestrx_run_multiple()
839231858Sbz{
840231858Sbz	local _fib _txt _opts i _jobs _p _w
841231858Sbz	_fib=$1
842231858Sbz	_txt="$2"
843231858Sbz	_opts="$3"
844231858Sbz
845231858Sbz	i=0
846231858Sbz	_jobs=""
847231858Sbz	while test ${i} -lt ${RT_NUMFIBS}; do
848231858Sbz		case ${USE_SOSETFIB} in
849231858Sbz		0)	print_debug "setfib -F${i} ./reflect" \
850231858Sbz			    "-p $((CTRLPORT + 1000 + i))" \
851231858Sbz			    "-t ${_txt} ${_opts} -N -f ${i} &"
852231858Sbz			setfib -F${i} ./reflect -p $((CTRLPORT + 1000 + i)) \
853231858Sbz			    -t ${_txt} ${_opts} -N -f ${i} &
854231858Sbz			;;
855231858Sbz		1)	print_debug "./reflect -F ${i}" \
856231858Sbz			    "-p $((CTRLPORT + 1000 + i))" \
857231858Sbz			    "-t ${_txt} ${_opts} -N -f ${i} &"
858231858Sbz			./reflect -F ${i} -p $((CTRLPORT + 1000 + i)) \
859231858Sbz			    -t ${_txt} ${_opts} -N -f ${i} &
860231858Sbz			;;
861231858Sbz		*)	die "Invalid value for USE_SOSETFIB: ${USE_SOSETFIB}" ;;
862231858Sbz		esac
863231858Sbz		_p=$!
864231858Sbz		_jobs="${_jobs}${_p} "
865231858Sbz		case ${i} in
866231858Sbz		${_fib}) _w=${_p} ;;
867231858Sbz		esac
868231858Sbz		i=$((i + 1))
869231858Sbz	done
870231858Sbz
871231858Sbz	# Start OOB control connection for START/DONE.
872231858Sbz	testrx_run_one ${_fib} "${_txt}" "${_opts}"
873231858Sbz	print_debug "KILL ${_jobs}"
874231858Sbz	for i in ${_jobs}; do
875231858Sbz		kill ${i} || true
876231858Sbz	done
877231858Sbz	#killall reflect || true
878231858Sbz	print_debug "reflects for '${_txt}' terminated without error."
879231858Sbz}
880231858Sbz
881231858Sbztestrx_run_test()
882231858Sbz{
883231858Sbz	local _n _t _fib _o _txt i _f _instance _destructive _transfer
884231858Sbz	_n="$1"
885231858Sbz	_t="$2"
886231858Sbz	_fib=$3
887231858Sbz	_o="$4"
888231858Sbz	_instances=$5
889231858Sbz	_destructive=$6
890231858Sbz	_transfer=$7
891231858Sbz
892231858Sbz	: ${_destructive:=0}
893231858Sbz
894231858Sbz	_opts=""
895231858Sbz	case ${DEBUG} in
896231858Sbz	''|0)	;;
897231858Sbz	42)	_opts="-d -d" ;;
898231858Sbz	*)	_opts="-d" ;;
899231858Sbz	esac
900231858Sbz
901231858Sbz	# Convert netcat options to reflect aguments.
902231858Sbz	case "${_o}" in
903231858Sbz	-i)	_opts="${_opts} -T TCP6" ;;	# Use TCP for START/DONE.
904231858Sbz	-u)	_opts="${_opts} -T UDP6" ;;
905231858Sbz	*)	_opts="${_opts} -T TCP6" ;;
906231858Sbz	esac
907231858Sbz
908231858Sbz	# Combined test case base name.
909231858Sbz	case ${USE_SOSETFIB} in
910231858Sbz	0)	_f="setfib" ;;
911231858Sbz	1)	_f="so_setfib" ;;
912231858Sbz	*)	die "Unexpected value for SO_SETFIB: ${SO_SETFIB}" ;;
913231858Sbz	esac
914231858Sbz
915231858Sbz        _txt="${_n}_${_f}_${_t}_${_fib}_${_instances}_${_destructive}_${_transfer}"
916231858Sbz
917231858Sbz	case ${_transfer} in
918231858Sbz	1)	testrx_setup_transfer_networks ;;
919231858Sbz	esac
920231858Sbz
921231858Sbz	case "${_t}" in
922231858Sbz	ipfw)		textrx_ipfw_setup ${_fib} ${_transfer} ${_instances} ;;
923231858Sbz	ifconfig)	textrx_ifconfig_setup ${_fib} ;;
924231858Sbz	*)		die "Invalid type in ${_txt}" ;;
925231858Sbz	esac
926231858Sbz
927231858Sbz	# Setup unresponsive FIBs.
928231858Sbz	case ${_destructive} in
929231858Sbz	1)	testrx_remove_connected ${_fib} ${_transfer} ;;
930231858Sbz	esac
931231858Sbz
932231858Sbz	# Setup to get result counts.
933231858Sbz	textrx_count_setup
934231858Sbz
935231858Sbz	# Run just one / one per FIB (with incremental ports).
936231858Sbz	#case ${_instances} in
937231858Sbz	#1)	testrx_run_one ${_fib} "${_txt}" "${_opts}" ;;
938231858Sbz	#*)	testrx_run_multiple ${_fib} "${_txt}" "${_opts}" ;;
939231858Sbz	#esac
940231858Sbz	testrx_run_multiple ${_fib} "${_txt}" "${_opts}" ${_transfer}
941231858Sbz
942231858Sbz	# Export result counts.
943231858Sbz	textrx_count_results ${_fib} "${_o}"
944231858Sbz
945231858Sbz	# Cleanup unresponsive  FIBs or multiple prefixes.
946231858Sbz	if test ${_destructive} -eq 1 -o ${_transfer} -eq 1; then
947231858Sbz		testrx_cleanup_connected ${_fib} ${_transfer}
948231858Sbz	fi
949231858Sbz
950231858Sbz	case "${_t}" in
951231858Sbz	ipfw)		textrx_ipfw_cleanup ;;
952231858Sbz	ifconfig)	textrx_ifconfig_cleanup ;;
953231858Sbz	*)		die "Invalid type in ${_txt}" ;;
954231858Sbz	esac
955231858Sbz}
956231858Sbz
957231858Sbztestrx_main()
958231858Sbz{
959232114Sbz	local _n _o s t fib _instances _destructive
960231858Sbz	_n="$1"
961231858Sbz	_o="$2"
962231858Sbz	_instances=$3
963231858Sbz
964231858Sbz	: ${_instances:=1}
965231858Sbz
966231858Sbz	print_debug "${_n}"
967231858Sbz	for _transfer in 1 0; do
968231858Sbz		for _destructive in 0 1; do
969231858Sbz			for t in ipfw ifconfig; do
970231858Sbz
971231858Sbz				print_debug "${_n}_${t}"
972232114Sbz				fib=0
973232114Sbz				while test ${fib} -lt ${RT_NUMFIBS}; do
974231858Sbz
975232114Sbz					print_debug "${_n}_${t}_${fib}" \
976231858Sbz					    "${_instances} ${_destructive}" \
977231858Sbz					    "${_transfer}"
978232114Sbz					testrx_run_test "${_n}" "${t}" ${fib} \
979231858Sbz					   "${_o}" ${_instances} \
980231858Sbz					   ${_destructive} ${_transfer}
981231858Sbz
982232114Sbz					fib=$((fib + 1))
983231858Sbz				done
984231858Sbz			done
985231858Sbz		done
986231858Sbz	done
987231858Sbz}
988231858Sbz
989231858Sbz################################################################################
990231858Sbz#
991231858Sbz# Probe all FIBs with one "active" one a time.
992231858Sbz#
993231858Sbztestrx_icmp6_same_addr_one_fib_a_time()
994231858Sbz{
995231858Sbz
996231858Sbz	testrx_main "testrx_icmp6_same_addr_one_fib_a_time" "-i"
997231858Sbz}
998231858Sbz
999231858Sbztestrx_tcp6_same_addr_one_fib_a_time()
1000231858Sbz{
1001231858Sbz
1002231858Sbz	testrx_main "testrx_tcp6_same_addr_one_fib_a_time" ""
1003231858Sbz}
1004231858Sbz
1005231858Sbztestrx_udp6_same_addr_one_fib_a_time()
1006231858Sbz{
1007231858Sbz
1008231858Sbz	testrx_main "testrx_udp6_same_addr_one_fib_a_time" "-u"
1009231858Sbz}
1010231858Sbz
1011231858Sbz################################################################################
1012231858Sbz#
1013231858Sbz# Probe all FIBs with all "active" all time.
1014231858Sbz#
1015231858Sbztestrx_tcp6_same_addr_all_fibs_a_time()
1016231858Sbz{
1017231858Sbz
1018231858Sbz	testrx_main "testrx_tcp6_same_addr_all_fibs_a_time" "" ${RT_NUMFIBS}
1019231858Sbz}
1020231858Sbz
1021231858Sbztestrx_udp6_same_addr_all_fibs_a_time()
1022231858Sbz{
1023231858Sbz
1024231858Sbz	testrx_main "testrx_udp6_same_addr_all_fibs_a_time" "-u" ${RT_NUMFIBS}
1025231858Sbz}
1026231858Sbz
1027231858Sbz
1028231858Sbz################################################################################
1029231858Sbz#
1030231858Sbz# Prereqs.
1031231858Sbz#
1032232114Sbzif test `sysctl -n security.jail.jailed` -eq 0; then
1033232114Sbz	kldload ipfw > /dev/null 2>&1 || kldstat -v | grep -q ipfw 
1034232114Sbzfi
1035232114Sbzipfw -f flush > /dev/null 2>&1 || die "please load ipfw in base system"
1036232114Sbzipfw add 65000 permit ip from any to any > /dev/null 2>&1
1037231858Sbzkillall reflect || true
1038231858Sbz
1039231858Sbz################################################################################
1040231858Sbz#
1041231858Sbz# Run tests.
1042231858Sbz#
1043231858Sbzwait_remote_ready
1044231858Sbz
1045231858Sbz# We are receiver reflecting the input back.
1046231858Sbzfor uso in 0 1; do
1047232114Sbz
1048231858Sbz	# Only run ICMP6 tests for the first loop.
1049231858Sbz	test ${uso} -ne 0 || testtx_icmp6_connected
1050231858Sbz	testtx_tcp6_connected
1051231858Sbz	testtx_udp6_connected
1052231858Sbz
1053231858Sbz	test ${uso} -ne 0 || testtx_icmp6_connected_blackhole
1054231858Sbz	testtx_tcp6_connected_blackhole
1055231858Sbz	testtx_udp6_connected_blackhole
1056231858Sbz
1057231858Sbz	test ${uso} -ne 0 || testtx_icmp6_connected_transfernets
1058231858Sbz	testtx_tcp6_connected_transfernets
1059231858Sbz	testtx_udp6_connected_transfernets
1060231858Sbz
1061231858Sbz	test ${uso} -ne 0 || testtx_icmp6_connected_ifconfig_transfernets
1062231858Sbz	testtx_tcp6_connected_ifconfig_transfernets
1063231858Sbz	testtx_udp6_connected_ifconfig_transfernets
1064231858Sbz
1065231858Sbz	test ${uso} -ne 0 || testtx_icmp6_gateway
1066231858Sbz	testtx_tcp6_gateway
1067231858Sbz	testtx_udp6_gateway
1068231858Sbz
1069231858Sbz	test ${uso} -ne 0 || testtx_icmp6_transfernets_gateways
1070231858Sbz	testtx_tcp6_transfernets_gateways
1071231858Sbz	testtx_udp6_transfernets_gateways
1072231858Sbz
1073231858Sbz	test ${uso} -ne 0 || testtx_icmp6_transfernets_gateway
1074231858Sbz	testtx_tcp6_transfernets_gateway
1075231858Sbz	testtx_udp6_transfernets_gateway
1076231858Sbzdone
1077231858Sbz
1078231858Sbzipfw -f flush > /dev/null 2>&1
1079232114Sbzipfw add 65000 permit ip from any to any > /dev/null 2>&1
1080231858Sbz
1081231858Sbz# We are receiver, but the FIBs are with us this time.
1082231858Sbzfor uso in 0 1; do
1083231858Sbz
1084231858Sbz	USE_SOSETFIB=${uso}
1085231858Sbz	
1086231858Sbz	# Only expect ICMP6 tests for the first loop.
1087231858Sbz	test ${uso} -ne 0 || testrx_icmp6_same_addr_one_fib_a_time
1088231858Sbz	testrx_tcp6_same_addr_one_fib_a_time
1089231858Sbz	testrx_udp6_same_addr_one_fib_a_time
1090231858Sbz
1091231858Sbz	testrx_tcp6_same_addr_all_fibs_a_time
1092231858Sbz	testrx_udp6_same_addr_all_fibs_a_time
1093231858Sbz
1094231858Sbzdone
1095231858Sbz
1096231858Sbzcleanup
1097231858Sbz
1098231858Sbz# end
1099