1*c61a1653SRyan Zezeski#!/usr/bin/ksh
2*c61a1653SRyan Zezeski#
3*c61a1653SRyan Zezeski# This file and its contents are supplied under the terms of the
4*c61a1653SRyan Zezeski# Common Development and Distribution License ("CDDL"), version 1.0.
5*c61a1653SRyan Zezeski# You may only use this file in accordance with the terms of version
6*c61a1653SRyan Zezeski# 1.0 of the CDDL.
7*c61a1653SRyan Zezeski#
8*c61a1653SRyan Zezeski# A full copy of the text of the CDDL should have accompanied this
9*c61a1653SRyan Zezeski# source.  A copy of the CDDL is also available via the Internet at
10*c61a1653SRyan Zezeski# http://www.illumos.org/license/CDDL.
11*c61a1653SRyan Zezeski
12*c61a1653SRyan Zezeski#
13*c61a1653SRyan Zezeski# Copyright 2019 Joyent, Inc.
14*c61a1653SRyan Zezeski#
15*c61a1653SRyan Zezeski
16*c61a1653SRyan Zezeski#
17*c61a1653SRyan Zezeski# Usage:
18*c61a1653SRyan Zezeski#
19*c61a1653SRyan Zezeski#     ip_forwarding.ksh -bcflnpuv <client> <router> <server>
20*c61a1653SRyan Zezeski#
21*c61a1653SRyan Zezeski#     Where client, router, and server are the names of three native
22*c61a1653SRyan Zezeski#     zones. The user must create and start these zones; but other
23*c61a1653SRyan Zezeski#     than that there is no special configuration required for them.
24*c61a1653SRyan Zezeski#
25*c61a1653SRyan Zezeski#     -b	Place server and router on same underlying simnet, causing
26*c61a1653SRyan Zezeski#		them to talk via MAC-loopback.
27*c61a1653SRyan Zezeski#
28*c61a1653SRyan Zezeski#     -c	Run cleanup only.
29*c61a1653SRyan Zezeski#
30*c61a1653SRyan Zezeski#     -f	Enable Tx ULP hardware checksum.
31*c61a1653SRyan Zezeski#
32*c61a1653SRyan Zezeski#     -l	Enable TCP LSO.
33*c61a1653SRyan Zezeski#
34*c61a1653SRyan Zezeski#     -n	No cleanup: the various artifacts created by this script will
35*c61a1653SRyan Zezeski#               remain after execution.
36*c61a1653SRyan Zezeski#
37*c61a1653SRyan Zezeski#     -p	Enabled partial Tx ULP hardware checksum.
38*c61a1653SRyan Zezeski#
39*c61a1653SRyan Zezeski#     -r	Enable Rx IPv4 header checksum offload.
40*c61a1653SRyan Zezeski#
41*c61a1653SRyan Zezeski#     -u	Run UDP tests.
42*c61a1653SRyan Zezeski#
43*c61a1653SRyan Zezeski#     -v	Vebose mode.
44*c61a1653SRyan Zezeski#
45*c61a1653SRyan Zezeski
46*c61a1653SRyan Zezeskiif [[ -z $NET_TESTS ]]; then
47*c61a1653SRyan Zezeski	echo "NET_TESTS not set" >&2
48*c61a1653SRyan Zezeski	exit 1
49*c61a1653SRyan Zezeskifi
50*c61a1653SRyan Zezeski
51*c61a1653SRyan Zezeski. $NET_TESTS/tests/net_common
52*c61a1653SRyan Zezeski
53*c61a1653SRyan Zezeskifunction cleanup
54*c61a1653SRyan Zezeski{
55*c61a1653SRyan Zezeski	if ((nt_cleanup == 0)); then
56*c61a1653SRyan Zezeski		dbg "skipping cleanup"
57*c61a1653SRyan Zezeski		return 0
58*c61a1653SRyan Zezeski	fi
59*c61a1653SRyan Zezeski
60*c61a1653SRyan Zezeski	rm -rf ${nt_tdirprefix}*
61*c61a1653SRyan Zezeski	zlogin $nt_client rm -rf ${nt_tdirprefix}*
62*c61a1653SRyan Zezeski	zlogin $nt_server rm -rf ${nt_tdirprefix}*
63*c61a1653SRyan Zezeski
64*c61a1653SRyan Zezeski	rm_route $nt_client $nt_server_ip $nt_server_subnet $nt_client_router_ip
65*c61a1653SRyan Zezeski	rm_route $nt_server $nt_client_ip $nt_client_subnet $nt_server_router_ip
66*c61a1653SRyan Zezeski	rm_route6 $nt_client $nt_server_ip6 $nt_server_subnet6 \
67*c61a1653SRyan Zezeski		  $nt_client_router_ip6
68*c61a1653SRyan Zezeski	rm_route6 $nt_server $nt_client_ip6 $nt_client_subnet6 \
69*c61a1653SRyan Zezeski		  $nt_server_router_ip6
70*c61a1653SRyan Zezeski
71*c61a1653SRyan Zezeski	ip_fwd_disable $nt_router
72*c61a1653SRyan Zezeski
73*c61a1653SRyan Zezeski	delete_addr $nt_client ipft_client0 v4
74*c61a1653SRyan Zezeski	delete_addr $nt_router ipft_client_r0 v4
75*c61a1653SRyan Zezeski	delete_addr $nt_router ipft_server_r0 v4
76*c61a1653SRyan Zezeski	delete_addr $nt_server ipft_server0 v4
77*c61a1653SRyan Zezeski
78*c61a1653SRyan Zezeski	delete_addr $nt_client ipft_client0 v6
79*c61a1653SRyan Zezeski	delete_addr $nt_router ipft_client_r0 v6
80*c61a1653SRyan Zezeski	delete_addr $nt_router ipft_server_r0 v6
81*c61a1653SRyan Zezeski	delete_addr $nt_server ipft_server0 v6
82*c61a1653SRyan Zezeski
83*c61a1653SRyan Zezeski	delete_if $nt_client ipft_client0
84*c61a1653SRyan Zezeski	delete_if $nt_router ipft_client_r0
85*c61a1653SRyan Zezeski	delete_if $nt_router ipft_server_r0
86*c61a1653SRyan Zezeski	delete_if $nt_server ipft_server0
87*c61a1653SRyan Zezeski
88*c61a1653SRyan Zezeski	delete_vnic ipft_client0 0 $nt_client
89*c61a1653SRyan Zezeski	delete_vnic ipft_client_r0 0 $nt_router
90*c61a1653SRyan Zezeski	delete_vnic ipft_server_r0 5 $nt_router
91*c61a1653SRyan Zezeski	delete_vnic ipft_server0 5 $nt_server
92*c61a1653SRyan Zezeski
93*c61a1653SRyan Zezeski	for nt_name in ${nt_nics[@]}; do
94*c61a1653SRyan Zezeski		delete_simnet $nt_name
95*c61a1653SRyan Zezeski	done
96*c61a1653SRyan Zezeski}
97*c61a1653SRyan Zezeski
98*c61a1653SRyan Zezeskifunction usage
99*c61a1653SRyan Zezeski{
100*c61a1653SRyan Zezeski	echo "$nt_tname -bcflnpruv <client> <router> <server>" >&2
101*c61a1653SRyan Zezeski}
102*c61a1653SRyan Zezeski
103*c61a1653SRyan Zezeski#
104*c61a1653SRyan Zezeski# Set test defaults.
105*c61a1653SRyan Zezeski#
106*c61a1653SRyan Zezeskint_tname=${NT_TNAME:-$(basename $0)}
107*c61a1653SRyan Zezeskint_loopback=0
108*c61a1653SRyan Zezeskint_ulp_full=0
109*c61a1653SRyan Zezeskint_ulp_partial=0
110*c61a1653SRyan Zezeskint_tcp_lso=0
111*c61a1653SRyan Zezeskint_udp=0
112*c61a1653SRyan Zezeskint_rx_ip_cksum=0
113*c61a1653SRyan Zezeskint_cleanup=1
114*c61a1653SRyan Zezeskint_cleanup_only=0
115*c61a1653SRyan Zezeski
116*c61a1653SRyan Zezeskint_tdirprefix=/var/tmp/${nt_tname}
117*c61a1653SRyan Zezeskint_tdir=${nt_tdirprefix}.$$
118*c61a1653SRyan Zezeskint_dfile=${nt_tdir}/${nt_tname}.data
119*c61a1653SRyan Zezeskint_efile=${nt_tdir}/${nt_tname}-expected-sha1
120*c61a1653SRyan Zezeskint_rfile=${nt_tdir}/${nt_tname}-received-sha1
121*c61a1653SRyan Zezeskint_ofile=${nt_tdir}/${nt_tname}-received
122*c61a1653SRyan Zezeskint_client_subnet=192.168.77.0/24
123*c61a1653SRyan Zezeskint_client_ip=192.168.77.2
124*c61a1653SRyan Zezeskint_client_router_ip=192.168.77.1
125*c61a1653SRyan Zezeskint_server_subnet=192.168.88.0/24
126*c61a1653SRyan Zezeskint_server_ip=192.168.88.2
127*c61a1653SRyan Zezeskint_server_router_ip=192.168.88.1
128*c61a1653SRyan Zezeskint_port=7774
129*c61a1653SRyan Zezeskint_client_subnet6=fd00:0:1:4d::2/64
130*c61a1653SRyan Zezeskint_client_ip6=fd00:0:1:4d::2
131*c61a1653SRyan Zezeskint_client_router_ip6=fd00:0:1:4d::1
132*c61a1653SRyan Zezeskint_server_subnet6=fd00:0:1:58::/64
133*c61a1653SRyan Zezeskint_server_router_ip6=fd00:0:1:58::1
134*c61a1653SRyan Zezeskint_server_ip6=fd00:0:1:58::2
135*c61a1653SRyan Zezeskint_port6=7776
136*c61a1653SRyan Zezeskint_bridge=ipft_switch
137*c61a1653SRyan Zezeskitypeset -A nt_nics
138*c61a1653SRyan Zezeski
139*c61a1653SRyan Zezeskiwhile getopts "bcflnpruv" opt; do
140*c61a1653SRyan Zezeski	case $opt in
141*c61a1653SRyan Zezeski	b)
142*c61a1653SRyan Zezeski		nt_loopback=1
143*c61a1653SRyan Zezeski		;;
144*c61a1653SRyan Zezeski	c)
145*c61a1653SRyan Zezeski		nt_cleanup_only=1
146*c61a1653SRyan Zezeski		;;
147*c61a1653SRyan Zezeski	f)
148*c61a1653SRyan Zezeski		nt_ulp_full=1
149*c61a1653SRyan Zezeski		;;
150*c61a1653SRyan Zezeski	l)
151*c61a1653SRyan Zezeski		nt_tcp_lso=1
152*c61a1653SRyan Zezeski		;;
153*c61a1653SRyan Zezeski	n)
154*c61a1653SRyan Zezeski		nt_cleanup=0
155*c61a1653SRyan Zezeski		;;
156*c61a1653SRyan Zezeski	p)
157*c61a1653SRyan Zezeski		nt_ulp_partial=1
158*c61a1653SRyan Zezeski		;;
159*c61a1653SRyan Zezeski	r)
160*c61a1653SRyan Zezeski		nt_rx_ip_cksum=1
161*c61a1653SRyan Zezeski		;;
162*c61a1653SRyan Zezeski	u)
163*c61a1653SRyan Zezeski		nt_udp=1
164*c61a1653SRyan Zezeski		;;
165*c61a1653SRyan Zezeski	v)
166*c61a1653SRyan Zezeski		DEBUG=1
167*c61a1653SRyan Zezeski		;;
168*c61a1653SRyan Zezeski	esac
169*c61a1653SRyan Zezeskidone
170*c61a1653SRyan Zezeski
171*c61a1653SRyan Zezeskishift $((OPTIND - 1))
172*c61a1653SRyan Zezeski
173*c61a1653SRyan Zezeskiif ((nt_ulp_partial == 1)) && ((nt_ulp_full == 1)); then
174*c61a1653SRyan Zezeski	fail "both partial and full checksum enabled"
175*c61a1653SRyan Zezeskifi
176*c61a1653SRyan Zezeski
177*c61a1653SRyan Zezeskiif (( $# != 3 )); then
178*c61a1653SRyan Zezeski	usage
179*c61a1653SRyan Zezeski	fail "wrong number of arguments"
180*c61a1653SRyan Zezeskifi
181*c61a1653SRyan Zezeski
182*c61a1653SRyan Zezeskint_client=$1
183*c61a1653SRyan Zezeskint_router=$2
184*c61a1653SRyan Zezeskint_server=$3
185*c61a1653SRyan Zezeski
186*c61a1653SRyan Zezeskiif [[ "$nt_client" == "$nt_router" || "$nt_router" == "$nt_server" ||
187*c61a1653SRyan Zezeski	      "$nt_client" == "$nt_server" ]]; then
188*c61a1653SRyan Zezeski	fail "all zones must be unique"
189*c61a1653SRyan Zezeskifi
190*c61a1653SRyan Zezeski
191*c61a1653SRyan Zezeskidbg "client zone: $nt_client"
192*c61a1653SRyan Zezeskidbg "router zone: $nt_router"
193*c61a1653SRyan Zezeskidbg "server zone: $nt_server"
194*c61a1653SRyan Zezeski
195*c61a1653SRyan ZezeskiBAIL=1
196*c61a1653SRyan Zezeskizone_exists $nt_client || fail "zone $nt_client not found"
197*c61a1653SRyan Zezeskizone_exists $nt_router || fail "zone $nt_router not found"
198*c61a1653SRyan Zezeskizone_exists $nt_server || fail "zone $nt_server not found"
199*c61a1653SRyan Zezeski
200*c61a1653SRyan Zezeskizone_running $nt_client
201*c61a1653SRyan Zezeskizone_running $nt_router
202*c61a1653SRyan Zezeskizone_running $nt_server
203*c61a1653SRyan Zezeski
204*c61a1653SRyan Zezeskiif ! zlogin $nt_client ls /usr/bin/socat > /dev/null; then
205*c61a1653SRyan Zezeski	fail "zone $nt_client missing socat"
206*c61a1653SRyan Zezeskifi
207*c61a1653SRyan Zezeski
208*c61a1653SRyan Zezeskiif ! zlogin $nt_server ls /usr/bin/socat > /dev/null; then
209*c61a1653SRyan Zezeski	fail "zone $nt_client missing socat"
210*c61a1653SRyan Zezeskifi
211*c61a1653SRyan Zezeski
212*c61a1653SRyan Zezeskiif ((nt_loopback == 0)); then
213*c61a1653SRyan Zezeski	nt_nics[0]=ipft_client_nic0
214*c61a1653SRyan Zezeski	nt_nics[1]=ipft_router_nic0
215*c61a1653SRyan Zezeski	nt_nics[2]=ipft_router_nic1
216*c61a1653SRyan Zezeski	nt_nics[3]=ipft_server_nic0
217*c61a1653SRyan Zezeskielse
218*c61a1653SRyan Zezeski	nt_nics[0]=ipft_nic0
219*c61a1653SRyan Zezeski	nt_nics[1]=ipft_nic1
220*c61a1653SRyan Zezeskifi
221*c61a1653SRyan Zezeski
222*c61a1653SRyan Zezeski#
223*c61a1653SRyan Zezeski# Make a best effort to cleanup artifacts from a previous run.
224*c61a1653SRyan Zezeski#
225*c61a1653SRyan Zezeskiif ((nt_cleanup_only == 1)); then
226*c61a1653SRyan Zezeski	dbg "performing cleanup only"
227*c61a1653SRyan Zezeski	BAIL=0
228*c61a1653SRyan Zezeski	cleanup
229*c61a1653SRyan Zezeski	BAIL=1
230*c61a1653SRyan Zezeski	exit 0
231*c61a1653SRyan Zezeskifi
232*c61a1653SRyan Zezeski
233*c61a1653SRyan Zezeskiif ! mkdir $nt_tdir; then
234*c61a1653SRyan Zezeski	fail "failed to mkdir $nt_tdir in GZ"
235*c61a1653SRyan Zezeskifi
236*c61a1653SRyan Zezeskidbg "created dir $nt_tdir in GZ"
237*c61a1653SRyan Zezeskiif ! zlogin $nt_client mkdir $nt_tdir; then
238*c61a1653SRyan Zezeski	fail "failed to mkdir $nt_tdir in $nt_client"
239*c61a1653SRyan Zezeskifi
240*c61a1653SRyan Zezeskidbg "created dir $nt_tdir in $nt_client"
241*c61a1653SRyan Zezeskiif ! zlogin $nt_server mkdir $nt_tdir; then
242*c61a1653SRyan Zezeski	fail "failed to mkdir $nt_tdir in $nt_server"
243*c61a1653SRyan Zezeskifi
244*c61a1653SRyan Zezeskidbg "created dir $nt_tdir in $nt_server"
245*c61a1653SRyan Zezeski
246*c61a1653SRyan Zezeskitrap cleanup ERR
247*c61a1653SRyan Zezeski
248*c61a1653SRyan Zezeskifor nt_name in ${nt_nics[@]}; do
249*c61a1653SRyan Zezeski	create_simnet $nt_name
250*c61a1653SRyan Zezeskidone
251*c61a1653SRyan Zezeski
252*c61a1653SRyan Zezeskiif ((nt_loopback == 0)); then
253*c61a1653SRyan Zezeski	link_simnets ${nt_nics[0]} ${nt_nics[1]}
254*c61a1653SRyan Zezeski	link_simnets ${nt_nics[2]} ${nt_nics[3]}
255*c61a1653SRyan Zezeskielse
256*c61a1653SRyan Zezeski	link_simnets ${nt_nics[0]} ${nt_nics[1]}
257*c61a1653SRyan Zezeskifi
258*c61a1653SRyan Zezeski
259*c61a1653SRyan Zezeskifor nt_name in ${nt_nics[@]}; do
260*c61a1653SRyan Zezeski	if ((nt_ulp_partial == 1)); then
261*c61a1653SRyan Zezeski		set_linkprop $nt_name _tx_ulp_cksum partial
262*c61a1653SRyan Zezeski	fi
263*c61a1653SRyan Zezeski
264*c61a1653SRyan Zezeski	if ((nt_ulp_full == 1)); then
265*c61a1653SRyan Zezeski		set_linkprop $nt_name _tx_ulp_cksum fullv4
266*c61a1653SRyan Zezeski	fi
267*c61a1653SRyan Zezeski
268*c61a1653SRyan Zezeski	if ((nt_ulp_full == 1)) || ((nt_ulp_partial == 1)); then
269*c61a1653SRyan Zezeski		set_linkprop $nt_name _tx_ipv4_cksum on
270*c61a1653SRyan Zezeski	fi
271*c61a1653SRyan Zezeski
272*c61a1653SRyan Zezeski	if ((nt_tcp_lso == 1)); then
273*c61a1653SRyan Zezeski		set_linkprop $nt_name _lso on
274*c61a1653SRyan Zezeski	fi
275*c61a1653SRyan Zezeski
276*c61a1653SRyan Zezeski	if ((nt_rx_ip_cksum == 1)); then
277*c61a1653SRyan Zezeski		set_linkprop $nt_name _rx_ipv4_cksum on
278*c61a1653SRyan Zezeski	fi
279*c61a1653SRyan Zezeskidone
280*c61a1653SRyan Zezeski
281*c61a1653SRyan Zezeskiif ((nt_loopback == 0)); then
282*c61a1653SRyan Zezeski	create_vnic ipft_client0 ipft_client_nic0 0 $nt_client
283*c61a1653SRyan Zezeski	create_vnic ipft_client_r0 ipft_router_nic0 0 $nt_router
284*c61a1653SRyan Zezeski	create_vnic ipft_server_r0 ipft_router_nic1 5 $nt_router
285*c61a1653SRyan Zezeski	create_vnic ipft_server0 ipft_server_nic0 5 $nt_server
286*c61a1653SRyan Zezeskielse
287*c61a1653SRyan Zezeski	create_vnic ipft_client0 ipft_nic0 0 $nt_client
288*c61a1653SRyan Zezeski	create_vnic ipft_client_r0 ipft_nic1 0 $nt_router
289*c61a1653SRyan Zezeski	create_vnic ipft_server_r0 ipft_nic1 5 $nt_router
290*c61a1653SRyan Zezeski	create_vnic ipft_server0 ipft_nic1 5 $nt_server
291*c61a1653SRyan Zezeskifi
292*c61a1653SRyan Zezeski
293*c61a1653SRyan Zezeskiip_fwd_enable $nt_router
294*c61a1653SRyan Zezeski
295*c61a1653SRyan Zezeskicreate_addr $nt_client ipft_client0 $nt_client_ip/24
296*c61a1653SRyan Zezeskicreate_addr $nt_router ipft_client_r0 $nt_client_router_ip/24
297*c61a1653SRyan Zezeskicreate_addr $nt_router ipft_server_r0 $nt_server_router_ip/24
298*c61a1653SRyan Zezeskicreate_addr $nt_server ipft_server0 $nt_server_ip/24
299*c61a1653SRyan Zezeski
300*c61a1653SRyan Zezeskiadd_route $nt_client $nt_server_ip $nt_server_subnet $nt_client_router_ip
301*c61a1653SRyan Zezeskiadd_route $nt_server $nt_client_ip $nt_client_subnet $nt_server_router_ip
302*c61a1653SRyan Zezeski
303*c61a1653SRyan Zezeskicreate_addr6 $nt_client ipft_client0 $nt_client_ip6
304*c61a1653SRyan Zezeskicreate_addr6 $nt_router ipft_client_r0 $nt_client_router_ip6
305*c61a1653SRyan Zezeskicreate_addr6 $nt_router ipft_server_r0 $nt_server_router_ip6
306*c61a1653SRyan Zezeskicreate_addr6 $nt_server ipft_server0 $nt_server_ip6
307*c61a1653SRyan Zezeski
308*c61a1653SRyan Zezeskiadd_route6 $nt_client $nt_server_ip6 $nt_server_subnet6 $nt_client_router_ip6
309*c61a1653SRyan Zezeskiadd_route6 $nt_server $nt_client_ip6 $nt_client_subnet6 $nt_server_router_ip6
310*c61a1653SRyan Zezeski
311*c61a1653SRyan Zezeskidd if=/dev/urandom of=$nt_dfile bs=1024 count=1024 > /dev/null 2>&1
312*c61a1653SRyan Zezeskiif (($? != 0)); then
313*c61a1653SRyan Zezeski	fail "failed to create data file: $nt_dfile"
314*c61a1653SRyan Zezeskielse
315*c61a1653SRyan Zezeski	dbg "created data file: $nt_dfile"
316*c61a1653SRyan Zezeskifi
317*c61a1653SRyan Zezeski
318*c61a1653SRyan Zezeskidigest -a sha1 $nt_dfile > $nt_efile
319*c61a1653SRyan Zezeski
320*c61a1653SRyan Zezeski# ================================================================
321*c61a1653SRyan Zezeski# client -> server
322*c61a1653SRyan Zezeski# ================================================================
323*c61a1653SRyan Zezeskiping $nt_client $nt_client_ip $nt_server_ip
324*c61a1653SRyan Zezeskiping $nt_client $nt_client_ip6 $nt_server_ip6
325*c61a1653SRyan Zezeski
326*c61a1653SRyan Zezeskistart_server $nt_server TCP4 $nt_server_ip $nt_port $nt_ofile
327*c61a1653SRyan Zezeskint_listener_ppid=$!
328*c61a1653SRyan Zezeski
329*c61a1653SRyan Zezeski# Give the server time to start.
330*c61a1653SRyan Zezeskisleep 1
331*c61a1653SRyan Zezeski
332*c61a1653SRyan Zezeskidbg "sending 1M $nt_client ($nt_client_ip) -> $nt_server ($nt_server_ip)"
333*c61a1653SRyan Zezeskizlogin $nt_client /usr/bin/socat -b 8192 STDIN \
334*c61a1653SRyan Zezeski       TCP4:$nt_server_ip:$nt_port,connect-timeout=5 < $nt_dfile
335*c61a1653SRyan Zezeski
336*c61a1653SRyan Zezeskiif (($? != 0)); then
337*c61a1653SRyan Zezeski	pkill -TERM -P $nt_listener_ppid
338*c61a1653SRyan Zezeski	fail "failed to run socat client"
339*c61a1653SRyan Zezeskielse
340*c61a1653SRyan Zezeski	dbg "sent 1M $nt_client ($nt_client_ip) -> $nt_server ($nt_server_ip)"
341*c61a1653SRyan Zezeskifi
342*c61a1653SRyan Zezeski
343*c61a1653SRyan Zezeski#
344*c61a1653SRyan Zezeski# The client may have exited but make sure to give the server time to
345*c61a1653SRyan Zezeski# exit and finish computing the SHA1.
346*c61a1653SRyan Zezeski#
347*c61a1653SRyan Zezeskidbg "waiting for listener $nt_listener_ppid"
348*c61a1653SRyan Zezeskiwait_for_pid $nt_listener_ppid 5
349*c61a1653SRyan Zezeskidbg "listener $nt_listener_ppid exited"
350*c61a1653SRyan Zezeski
351*c61a1653SRyan Zezeskidigest -a sha1 /zones/$nt_server/root/$nt_ofile > $nt_rfile
352*c61a1653SRyan Zezeski
353*c61a1653SRyan Zezeskiif ! diff $nt_efile $nt_rfile; then
354*c61a1653SRyan Zezeski	fail "SHA1 comparison failed"
355*c61a1653SRyan Zezeskielse
356*c61a1653SRyan Zezeski	dbg "SHA1 comparison passed"
357*c61a1653SRyan Zezeskifi
358*c61a1653SRyan Zezeski
359*c61a1653SRyan Zezeskistart_server $nt_server TCP6 $nt_server_ip6 $nt_port6 $nt_rfile
360*c61a1653SRyan Zezeskilistener_ppid=$!
361*c61a1653SRyan Zezeski
362*c61a1653SRyan Zezeski# Give the server time to start.
363*c61a1653SRyan Zezeskisleep 1
364*c61a1653SRyan Zezeski
365*c61a1653SRyan Zezeskizlogin $nt_client /usr/bin/socat -b 8192 STDIN \
366*c61a1653SRyan Zezeski       TCP6:[${nt_server_ip6}]:$nt_port6,connect-timeout=5 < $nt_dfile
367*c61a1653SRyan Zezeski
368*c61a1653SRyan Zezeskiif (($? != 0)); then
369*c61a1653SRyan Zezeski	pkill -TERM -P $nt_listener_ppid
370*c61a1653SRyan Zezeski	fail "failed to run socat client IPv6"
371*c61a1653SRyan Zezeskielse
372*c61a1653SRyan Zezeski	dbg "sent 1M $nt_client ($nt_client_ip6)" \
373*c61a1653SRyan Zezeski	    "-> $nt_server ($nt_server_ip6) IPv6"
374*c61a1653SRyan Zezeskifi
375*c61a1653SRyan Zezeski
376*c61a1653SRyan Zezeski#
377*c61a1653SRyan Zezeski# The client may have exited but make sure to give the server time to
378*c61a1653SRyan Zezeski# exit and finish computing the SHA1.
379*c61a1653SRyan Zezeski#
380*c61a1653SRyan Zezeskidbg "waiting for listener $nt_listener_ppid"
381*c61a1653SRyan Zezeskiwait_for_pid $nt_listener_ppid 5
382*c61a1653SRyan Zezeskidbg "listener $nt_listener_ppid exited"
383*c61a1653SRyan Zezeski
384*c61a1653SRyan Zezeskidigest -a sha1 /zones/$nt_server/root/$nt_ofile > $nt_rfile
385*c61a1653SRyan Zezeski
386*c61a1653SRyan Zezeskiif ! diff $nt_efile $nt_rfile; then
387*c61a1653SRyan Zezeski	fail "SHA1 comparison failed"
388*c61a1653SRyan Zezeskielse
389*c61a1653SRyan Zezeski	dbg "SHA1 comparison passed"
390*c61a1653SRyan Zezeskifi
391*c61a1653SRyan Zezeski
392*c61a1653SRyan Zezeskiif ((nt_udp == 1)); then
393*c61a1653SRyan Zezeski	ping_udp $nt_client $nt_client_ip $nt_server_ip 256 3
394*c61a1653SRyan Zezeski	ping_udp $nt_client $nt_client_ip6 $nt_server_ip6 256 3
395*c61a1653SRyan Zezeski
396*c61a1653SRyan Zezeski	#
397*c61a1653SRyan Zezeski	# Test IP fragmentation by sending a larger-than-MTU datagram.
398*c61a1653SRyan Zezeski	# You can verify fragmentation is happening by dtracing the
399*c61a1653SRyan Zezeski	# various "Frag" and "Reasm" mibs.
400*c61a1653SRyan Zezeski	#
401*c61a1653SRyan Zezeski	dbg "test IP fragmentation $nt_client_ip -> $nt_server_ip"
402*c61a1653SRyan Zezeski	ping_udp $nt_client $nt_client_ip $nt_server_ip $((1024 * 16)) 3
403*c61a1653SRyan Zezeski
404*c61a1653SRyan Zezeski	dbg "test IPv6 fragmentation $nt_client_ip6 -> $nt_server_ip6"
405*c61a1653SRyan Zezeski	ping_udp $nt_client $nt_client_ip6 $nt_server_ip6 $((1024 * 16)) 3
406*c61a1653SRyan Zezeskifi
407*c61a1653SRyan Zezeski
408*c61a1653SRyan Zezeski# ================================================================
409*c61a1653SRyan Zezeski# server -> client
410*c61a1653SRyan Zezeski# ================================================================
411*c61a1653SRyan Zezeskiping $nt_server $nt_server_ip $nt_client_ip
412*c61a1653SRyan Zezeskiping $nt_server $nt_server_ip6 $nt_client_ip6
413*c61a1653SRyan Zezeski
414*c61a1653SRyan Zezeskistart_server $nt_client TCP4 $nt_client_ip $nt_port $nt_ofile
415*c61a1653SRyan Zezeskint_listener_ppid=$!
416*c61a1653SRyan Zezeski
417*c61a1653SRyan Zezeski# Give the listener time to start.
418*c61a1653SRyan Zezeskisleep 1
419*c61a1653SRyan Zezeski
420*c61a1653SRyan Zezeskizlogin $nt_server /usr/bin/socat -b 8192 STDIN \
421*c61a1653SRyan Zezeski       TCP4:$nt_client_ip:$nt_port,bind=$nt_server_ip,connect-timeout=5 \
422*c61a1653SRyan Zezeski       < $nt_dfile
423*c61a1653SRyan Zezeski
424*c61a1653SRyan Zezeskiif (($? != 0)); then
425*c61a1653SRyan Zezeski	pkill -TERM -P $nt_listener_ppid
426*c61a1653SRyan Zezeski	fail "failed to run socat client"
427*c61a1653SRyan Zezeskielse
428*c61a1653SRyan Zezeski	dbg "sent 1M $nt_server ($nt_server_ip) -> $nt_client ($nt_client_ip)"
429*c61a1653SRyan Zezeskifi
430*c61a1653SRyan Zezeski
431*c61a1653SRyan Zezeski#
432*c61a1653SRyan Zezeski# The client may have exited but make sure to give the server time to
433*c61a1653SRyan Zezeski# exit and finish computing the SHA1.
434*c61a1653SRyan Zezeski#
435*c61a1653SRyan Zezeskidbg "waiting for listener $nt_listener_ppid"
436*c61a1653SRyan Zezeskiwait_for_pid $nt_listener_ppid 5
437*c61a1653SRyan Zezeskidbg "listener $nt_listener_ppid exited"
438*c61a1653SRyan Zezeski
439*c61a1653SRyan Zezeskidigest -a sha1 /zones/$nt_client/root/$nt_ofile > $nt_rfile
440*c61a1653SRyan Zezeski
441*c61a1653SRyan Zezeskiif ! diff $nt_efile $nt_rfile; then
442*c61a1653SRyan Zezeski	fail "SHA1 comparison failed"
443*c61a1653SRyan Zezeskielse
444*c61a1653SRyan Zezeski	dbg "SHA1 comparison passed"
445*c61a1653SRyan Zezeskifi
446*c61a1653SRyan Zezeski
447*c61a1653SRyan Zezeskistart_server $nt_client TCP6 $nt_client_ip6 $nt_port6 $nt_ofile
448*c61a1653SRyan Zezeskint_listener_ppid=$!
449*c61a1653SRyan Zezeski
450*c61a1653SRyan Zezeski# Give the listener time to start.
451*c61a1653SRyan Zezeskisleep 1
452*c61a1653SRyan Zezeski
453*c61a1653SRyan Zezeskizlogin $nt_server /usr/bin/socat -b 8192 STDIN \
454*c61a1653SRyan Zezeski       TCP6:[$nt_client_ip6]:$nt_port6,connect-timeout=5 < $nt_dfile
455*c61a1653SRyan Zezeski
456*c61a1653SRyan Zezeskiif (($? != 0)); then
457*c61a1653SRyan Zezeski	pkill -TERM -P $nt_listener_ppid
458*c61a1653SRyan Zezeski	fail "failed to run socat client IPv6"
459*c61a1653SRyan Zezeskielse
460*c61a1653SRyan Zezeski	dbg "sent 1M $nt_server ($nt_server_ip6) -> $nt_client ($nt_client_ip6)"
461*c61a1653SRyan Zezeskifi
462*c61a1653SRyan Zezeski
463*c61a1653SRyan Zezeski#
464*c61a1653SRyan Zezeski# The client may have exited but make sure to give the server time to
465*c61a1653SRyan Zezeski# exit and finish computing the SHA1.
466*c61a1653SRyan Zezeski#
467*c61a1653SRyan Zezeskidbg "waiting for listener $nt_listener_ppid"
468*c61a1653SRyan Zezeskiwait_for_pid $nt_listener_ppid 5
469*c61a1653SRyan Zezeskidbg "server $nt_listener_ppid exited"
470*c61a1653SRyan Zezeski
471*c61a1653SRyan Zezeskidigest -a sha1 /zones/$nt_client/root/$nt_ofile > $nt_rfile
472*c61a1653SRyan Zezeski
473*c61a1653SRyan Zezeskiif ! diff $nt_efile $nt_rfile; then
474*c61a1653SRyan Zezeski	fail "SHA1 comparison failed"
475*c61a1653SRyan Zezeskielse
476*c61a1653SRyan Zezeski	dbg "SHA1 comparison passed"
477*c61a1653SRyan Zezeskifi
478*c61a1653SRyan Zezeski
479*c61a1653SRyan Zezeskiif ((nt_udp == 1)); then
480*c61a1653SRyan Zezeski	ping_udp $nt_server $nt_server_ip $nt_client_ip 256 3
481*c61a1653SRyan Zezeski	ping_udp $nt_server $nt_server_ip6 $nt_client_ip6 256 3
482*c61a1653SRyan Zezeski
483*c61a1653SRyan Zezeski	#
484*c61a1653SRyan Zezeski	# Test IP fragmentation by sending a larger-than-MTU datagram.
485*c61a1653SRyan Zezeski	# You can verify fragmentation is happening by dtracing the
486*c61a1653SRyan Zezeski	# various "Frag" and "Reasm" mibs.
487*c61a1653SRyan Zezeski	#
488*c61a1653SRyan Zezeski	dbg "test IP fragmentation $nt_server_ip -> $nt_client_ip"
489*c61a1653SRyan Zezeski	ping_udp $nt_server $nt_server_ip $nt_client_ip $((1024 * 16)) 3
490*c61a1653SRyan Zezeski
491*c61a1653SRyan Zezeski	dbg "test IPv6 fragmentation $nt_server_ip6 -> $nt_client_ip6"
492*c61a1653SRyan Zezeski	ping_udp $nt_server $nt_server_ip6 $nt_client_ip6 $((1024 * 16)) 3
493*c61a1653SRyan Zezeskifi
494*c61a1653SRyan Zezeski
495*c61a1653SRyan Zezeskicleanup
496*c61a1653SRyan Zezeskiecho "PASS [$nt_tname]"
497