1c61a1653SRyan Zezeski#!/usr/bin/ksh
2c61a1653SRyan Zezeski#
3c61a1653SRyan Zezeski# This file and its contents are supplied under the terms of the
4c61a1653SRyan Zezeski# Common Development and Distribution License ("CDDL"), version 1.0.
5c61a1653SRyan Zezeski# You may only use this file in accordance with the terms of version
6c61a1653SRyan Zezeski# 1.0 of the CDDL.
7c61a1653SRyan Zezeski#
8c61a1653SRyan Zezeski# A full copy of the text of the CDDL should have accompanied this
9c61a1653SRyan Zezeski# source.  A copy of the CDDL is also available via the Internet at
10c61a1653SRyan Zezeski# http://www.illumos.org/license/CDDL.
11c61a1653SRyan Zezeski
12c61a1653SRyan Zezeski#
13c61a1653SRyan Zezeski# Copyright 2019 Joyent, Inc.
14*c3e16711SDominik Hassler# Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
15c61a1653SRyan Zezeski#
16c61a1653SRyan Zezeski
17c61a1653SRyan Zezeski#
18c61a1653SRyan Zezeski# Functions shared across the network tests.
19c61a1653SRyan Zezeski#
20c61a1653SRyan Zezeski
21c61a1653SRyan ZezeskiDEBUG=0
22c61a1653SRyan Zezeski
23c61a1653SRyan Zezeskifunction dbg
24c61a1653SRyan Zezeski{
25c61a1653SRyan Zezeski	typeset msg="$*"
26c61a1653SRyan Zezeski	if (($DEBUG == 1)); then
27c61a1653SRyan Zezeski		echo "DBG [$nt_tname]: $msg"
28c61a1653SRyan Zezeski	fi
29c61a1653SRyan Zezeski}
30c61a1653SRyan Zezeski
31c61a1653SRyan Zezeskifunction fail
32c61a1653SRyan Zezeski{
33c61a1653SRyan Zezeski	typeset msg="$*"
34c61a1653SRyan Zezeski	echo "FAIL [$nt_tname]: $msg" >&2
35c61a1653SRyan Zezeski	exit 1
36c61a1653SRyan Zezeski}
37c61a1653SRyan Zezeski
38c61a1653SRyan Zezeskifunction maybe_fail
39c61a1653SRyan Zezeski{
40c61a1653SRyan Zezeski	typeset msg=$1
41c61a1653SRyan Zezeski
42c61a1653SRyan Zezeski	if ((BAIL == 1)); then
43c61a1653SRyan Zezeski		fail "$msg"
44c61a1653SRyan Zezeski	else
45c61a1653SRyan Zezeski		dbg "$msg"
46c61a1653SRyan Zezeski		return 1
47c61a1653SRyan Zezeski	fi
48c61a1653SRyan Zezeski}
49c61a1653SRyan Zezeski
50c61a1653SRyan Zezeskifunction zone_exists
51c61a1653SRyan Zezeski{
52c61a1653SRyan Zezeski	typeset name=$1
53c61a1653SRyan Zezeski
54c61a1653SRyan Zezeski	if (($# != 1)); then
55c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
56c61a1653SRyan Zezeski	fi
57c61a1653SRyan Zezeski
58c61a1653SRyan Zezeski	dbg "checking for existence of zone: $name"
59c61a1653SRyan Zezeski	if zoneadm -z $name list > /dev/null 2>&1; then
60c61a1653SRyan Zezeski		dbg "found zone: $name"
61c61a1653SRyan Zezeski		return 0
62c61a1653SRyan Zezeski	else
63c61a1653SRyan Zezeski		dbg "zone not found: $name"
64c61a1653SRyan Zezeski		return 1
65c61a1653SRyan Zezeski	fi
66c61a1653SRyan Zezeski}
67c61a1653SRyan Zezeski
68c61a1653SRyan Zezeskifunction zone_running
69c61a1653SRyan Zezeski{
70c61a1653SRyan Zezeski	typeset name=$1
71c61a1653SRyan Zezeski	typeset state=$(zoneadm -z $name list -p | awk -F: '{ print $3 }')
72c61a1653SRyan Zezeski	typeset err="zone $name is not running"
73c61a1653SRyan Zezeski
74c61a1653SRyan Zezeski	if (($# != 1)); then
75c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
76c61a1653SRyan Zezeski	fi
77c61a1653SRyan Zezeski
78c61a1653SRyan Zezeski	dbg "check if zone $name is running"
79c61a1653SRyan Zezeski	dbg "state of zone $name: $state"
80c61a1653SRyan Zezeski	if [[ "$state" == "running" ]]; then
81c61a1653SRyan Zezeski		dbg "zone $name is running"
82c61a1653SRyan Zezeski		return 0
83c61a1653SRyan Zezeski	fi
84c61a1653SRyan Zezeski
85c61a1653SRyan Zezeski	maybe_fail "$err"
86c61a1653SRyan Zezeski}
87c61a1653SRyan Zezeski
88c61a1653SRyan Zezeskifunction simnet_exists
89c61a1653SRyan Zezeski{
90c61a1653SRyan Zezeski	typeset name=$1
91c61a1653SRyan Zezeski
92c61a1653SRyan Zezeski	if (($# != 1)); then
93c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
94c61a1653SRyan Zezeski	fi
95c61a1653SRyan Zezeski
96c61a1653SRyan Zezeski	if dladm show-simnet $name > /dev/null 2>&1; then
97c61a1653SRyan Zezeski		dbg "simnet $name found"
98c61a1653SRyan Zezeski		return 0
99c61a1653SRyan Zezeski	else
100c61a1653SRyan Zezeski		dbg "simnet $name not found"
101c61a1653SRyan Zezeski		return 1
102c61a1653SRyan Zezeski	fi
103c61a1653SRyan Zezeski}
104c61a1653SRyan Zezeski
105c61a1653SRyan Zezeskifunction create_simnet
106c61a1653SRyan Zezeski{
107c61a1653SRyan Zezeski	typeset name=$1
108c61a1653SRyan Zezeski	typeset err="failed to create simnet $name"
109c61a1653SRyan Zezeski
110c61a1653SRyan Zezeski	if (($# != 1)); then
111c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
112c61a1653SRyan Zezeski	fi
113c61a1653SRyan Zezeski
114c61a1653SRyan Zezeski	dbg "creating simnet $name"
115c61a1653SRyan Zezeski	if simnet_exists $name; then
116c61a1653SRyan Zezeski		dbg "simnet $name already exists"
117c61a1653SRyan Zezeski		maybe_fail "$err"
118c61a1653SRyan Zezeski		return 1
119c61a1653SRyan Zezeski	fi
120c61a1653SRyan Zezeski
121c61a1653SRyan Zezeski	if dladm create-simnet > /dev/null $name; then
122c61a1653SRyan Zezeski		dbg "created simnet $name"
123c61a1653SRyan Zezeski		return 0
124c61a1653SRyan Zezeski	fi
125c61a1653SRyan Zezeski
126c61a1653SRyan Zezeski	maybe_fail "$err"
127c61a1653SRyan Zezeski}
128c61a1653SRyan Zezeski
129c61a1653SRyan Zezeskifunction delete_simnet
130c61a1653SRyan Zezeski{
131c61a1653SRyan Zezeski	typeset name=$1
132c61a1653SRyan Zezeski	typeset err="failed to delete simnet $name"
133c61a1653SRyan Zezeski
134c61a1653SRyan Zezeski	if (($# != 1)); then
135c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
136c61a1653SRyan Zezeski	fi
137c61a1653SRyan Zezeski
138c61a1653SRyan Zezeski	dbg "deleting simnet $name"
139c61a1653SRyan Zezeski	if ! simnet_exists $name; then
140c61a1653SRyan Zezeski		dbg "simnet $name doesn't exist"
141c61a1653SRyan Zezeski		return 1
142c61a1653SRyan Zezeski	fi
143c61a1653SRyan Zezeski
144c61a1653SRyan Zezeski	if dladm delete-simnet $name; then
145c61a1653SRyan Zezeski		dbg "simnet $name deleted"
146c61a1653SRyan Zezeski		return 0
147c61a1653SRyan Zezeski	fi
148c61a1653SRyan Zezeski
149c61a1653SRyan Zezeski	maybe_fail "$err"
150c61a1653SRyan Zezeski}
151c61a1653SRyan Zezeski
152c61a1653SRyan Zezeskifunction link_simnets
153c61a1653SRyan Zezeski{
154c61a1653SRyan Zezeski	typeset sim1=$1
155c61a1653SRyan Zezeski	typeset sim2=$2
156c61a1653SRyan Zezeski	typeset err="failed to link simnet $sim1 to $sim2"
157c61a1653SRyan Zezeski
158c61a1653SRyan Zezeski	if (($# != 2)); then
159c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
160c61a1653SRyan Zezeski	fi
161c61a1653SRyan Zezeski
162c61a1653SRyan Zezeski	dbg "linking simnet $sim1 to $sim2"
163c61a1653SRyan Zezeski	if dladm modify-simnet -p $sim2 $sim1 > /dev/null; then
164c61a1653SRyan Zezeski		dbg "linked simnet $sim1 to $sim2"
165c61a1653SRyan Zezeski		return 0
166c61a1653SRyan Zezeski	fi
167c61a1653SRyan Zezeski
168c61a1653SRyan Zezeski	maybe_fail "$err"
169c61a1653SRyan Zezeski}
170c61a1653SRyan Zezeski
171c61a1653SRyan Zezeskifunction vnic_exists
172c61a1653SRyan Zezeski{
173c61a1653SRyan Zezeski	typeset name=$1
174c61a1653SRyan Zezeski	typeset vid=$2
175c61a1653SRyan Zezeski	typeset over=$3
176c61a1653SRyan Zezeski	typeset zone=$4
177c61a1653SRyan Zezeski
178c61a1653SRyan Zezeski	if (($# != 4)); then
179c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
180c61a1653SRyan Zezeski	fi
181c61a1653SRyan Zezeski
182c61a1653SRyan Zezeski	if dladm show-vnic $name > /dev/null 2>&1; then
183c61a1653SRyan Zezeski		typeset avid=$(dladm show-vnic -p -o vid $name)
184c61a1653SRyan Zezeski		typeset aover=$(dladm show-vnic -p -o over $name)
185c61a1653SRyan Zezeski		typeset azone=$(dladm show-linkprop -cp zone -o value $name)
186c61a1653SRyan Zezeski		if (($avid == $vid)) && [ $aover == $over ] && \
187c61a1653SRyan Zezeski			   [ $azone == $zone ]
188c61a1653SRyan Zezeski		then
189c61a1653SRyan Zezeski			return 0
190c61a1653SRyan Zezeski		else
191c61a1653SRyan Zezeski			return 1
192c61a1653SRyan Zezeski		fi
193c61a1653SRyan Zezeski	else
194c61a1653SRyan Zezeski		return 1
195c61a1653SRyan Zezeski	fi
196c61a1653SRyan Zezeski}
197c61a1653SRyan Zezeski
198c61a1653SRyan Zezeskifunction create_vnic
199c61a1653SRyan Zezeski{
200c61a1653SRyan Zezeski	typeset name=$1
201c61a1653SRyan Zezeski	typeset over=$2
202c61a1653SRyan Zezeski	typeset vid=$3
203c61a1653SRyan Zezeski	typeset zone=$4
204c61a1653SRyan Zezeski	typeset r=1
205c61a1653SRyan Zezeski	typeset vid_opt=""
206c61a1653SRyan Zezeski	typeset vnic_info="$name, vid: $vid, over: $over, zone: $zone"
207c61a1653SRyan Zezeski	typeset err="failed to create VNIC: $vnic_info"
208c61a1653SRyan Zezeski
209c61a1653SRyan Zezeski	if (($# != 4)); then
210c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
211c61a1653SRyan Zezeski	fi
212c61a1653SRyan Zezeski
213c61a1653SRyan Zezeski	if ((vid != 0)); then
214c61a1653SRyan Zezeski		vid_opt="-v $vid"
215c61a1653SRyan Zezeski	fi
216c61a1653SRyan Zezeski
217c61a1653SRyan Zezeski	dbg "creating VNIC: $vnic_info"
218*c3e16711SDominik Hassler	if dladm create-vnic -l $over $vid_opt $name > /dev/null 2>&1 && \
219*c3e16711SDominik Hassler	    dladm set-linkprop -t -p zone=$zone $name > /dev/null 2>&1
220c61a1653SRyan Zezeski	then
221*c3e16711SDominik Hassler		dbg "created VNIC: $vnic_info"
222c61a1653SRyan Zezeski		return 0
223c61a1653SRyan Zezeski	fi
224c61a1653SRyan Zezeski
225*c3e16711SDominik Hassler	maybe_fail "$err"
226c61a1653SRyan Zezeski}
227c61a1653SRyan Zezeski
228c61a1653SRyan Zezeskifunction delete_vnic
229c61a1653SRyan Zezeski{
230c61a1653SRyan Zezeski	typeset name=$1
231c61a1653SRyan Zezeski	typeset vid=$2
232c61a1653SRyan Zezeski	typeset zone=$3
233c61a1653SRyan Zezeski	typeset vnic_info="$name, vid: $vid, zone: $zone"
234c61a1653SRyan Zezeski	typeset err1="failed to assign VNIC $name from $zone to GZ"
235c61a1653SRyan Zezeski	typeset err2="failed to delete VNIC: $vnic_info"
236c61a1653SRyan Zezeski
237c61a1653SRyan Zezeski	if (($# != 3)); then
238c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
239c61a1653SRyan Zezeski	fi
240c61a1653SRyan Zezeski
241c61a1653SRyan Zezeski	dbg "assigning VNIC $name from $zone to GZ"
242*c3e16711SDominik Hassler	if ! dladm set-linkprop -t -p zone=global $name; then
243*c3e16711SDominik Hassler		maybe_fail "$err1"
244c61a1653SRyan Zezeski		return 1
245c61a1653SRyan Zezeski	fi
246c61a1653SRyan Zezeski
247c61a1653SRyan Zezeski	dbg "deleting VNIC: $vnic_info"
248c61a1653SRyan Zezeski	if dladm delete-vnic $name > /dev/null; then
249c61a1653SRyan Zezeski		dbg "deleted VNIC: $vnic_info"
250c61a1653SRyan Zezeski		return 0
251c61a1653SRyan Zezeski	fi
252c61a1653SRyan Zezeski
253c61a1653SRyan Zezeski	maybe_fail "$err2"
254c61a1653SRyan Zezeski}
255c61a1653SRyan Zezeski
256c61a1653SRyan Zezeskifunction create_addr
257c61a1653SRyan Zezeski{
258c61a1653SRyan Zezeski	typeset zone=$1
259c61a1653SRyan Zezeski	typeset vnic=$2
260c61a1653SRyan Zezeski	typeset ip=$3
261c61a1653SRyan Zezeski	typeset ipname=${vnic}/v4
262c61a1653SRyan Zezeski
263c61a1653SRyan Zezeski	if (($# != 3)); then
264c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
265c61a1653SRyan Zezeski	fi
266c61a1653SRyan Zezeski
267c61a1653SRyan Zezeski	if zlogin $zone ipadm create-addr -t -T static -a $ip \
268c61a1653SRyan Zezeski		  $ipname > /dev/null
269c61a1653SRyan Zezeski	then
270c61a1653SRyan Zezeski		dbg "created addr $ipname ($ip) in zone $zone"
271c61a1653SRyan Zezeski		return 0
272c61a1653SRyan Zezeski	fi
273c61a1653SRyan Zezeski
274c61a1653SRyan Zezeski	maybe_fail "failed to create addr $ipname ($ip) in zone $zone"
275c61a1653SRyan Zezeski}
276c61a1653SRyan Zezeski
277c61a1653SRyan Zezeskifunction create_addr6
278c61a1653SRyan Zezeski{
279c61a1653SRyan Zezeski	typeset zone=$1
280c61a1653SRyan Zezeski	typeset vnic=$2
281c61a1653SRyan Zezeski	typeset ip=$3
282c61a1653SRyan Zezeski	typeset ll_name=${vnic}/v6
283c61a1653SRyan Zezeski	typeset uni_name=${vnic}/v6add
284c61a1653SRyan Zezeski	typeset err1="failed to create link-local addr $ll_name in zone $zone"
285c61a1653SRyan Zezeski	typeset err2="failed to create unicast addr $uni_name in zone $zone"
286c61a1653SRyan Zezeski
287c61a1653SRyan Zezeski	if (($# != 3)); then
288c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
289c61a1653SRyan Zezeski	fi
290c61a1653SRyan Zezeski
291c61a1653SRyan Zezeski	if zlogin $zone ipadm create-addr -t -T addrconf $ll_name; then
292c61a1653SRyan Zezeski		dbg "created link-local addr $ll_name in zone $zone"
293c61a1653SRyan Zezeski	else
294c61a1653SRyan Zezeski		maybe_fail "$err1"
295c61a1653SRyan Zezeski		return 1
296c61a1653SRyan Zezeski	fi
297c61a1653SRyan Zezeski
298c61a1653SRyan Zezeski	if zlogin $zone ipadm create-addr -t -T static -a $ip/64 $uni_name; then
299c61a1653SRyan Zezeski		dbg "created unicast addr $uni_name in zone $zone"
300c61a1653SRyan Zezeski	else
301c61a1653SRyan Zezeski		maybe_fail "$err2"
302c61a1653SRyan Zezeski	fi
303c61a1653SRyan Zezeski}
304c61a1653SRyan Zezeski
305c61a1653SRyan Zezeskifunction delete_addr
306c61a1653SRyan Zezeski{
307c61a1653SRyan Zezeski	typeset zone=$1
308c61a1653SRyan Zezeski	typeset ifname=$2
309c61a1653SRyan Zezeski	typeset version=$3
310c61a1653SRyan Zezeski	typeset ipname=$ifname/$version
311c61a1653SRyan Zezeski
312c61a1653SRyan Zezeski	if (($# != 3)); then
313c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
314c61a1653SRyan Zezeski	fi
315c61a1653SRyan Zezeski
316c61a1653SRyan Zezeski	if zlogin $zone ipadm show-addr $ipname > /dev/null 2>&1; then
317c61a1653SRyan Zezeski		if zlogin $zone ipadm delete-addr $ipname > /dev/null; then
318c61a1653SRyan Zezeski			dbg "deleted addr $ipname in zone $zone"
319c61a1653SRyan Zezeski		else
320c61a1653SRyan Zezeski			maybe_fail "failed to delete addr $ipname in zone $zone"
321c61a1653SRyan Zezeski			return 1
322c61a1653SRyan Zezeski		fi
323c61a1653SRyan Zezeski	else
324c61a1653SRyan Zezeski		dbg "addr $ipname doesn't exist in zone $zone"
325c61a1653SRyan Zezeski	fi
326c61a1653SRyan Zezeski
327c61a1653SRyan Zezeski	if [[ "v6" == "$version" ]]; then
328c61a1653SRyan Zezeski		typeset ipname=$ifname/v6add
329c61a1653SRyan Zezeski		typeset err="failed to delete addr $ipname in zone $zone"
330c61a1653SRyan Zezeski
331c61a1653SRyan Zezeski		if zlogin $zone ipadm show-addr $ipname > /dev/null 2>&1; then
332c61a1653SRyan Zezeski			if zlogin $zone ipadm delete-addr $ipname > /dev/null
333c61a1653SRyan Zezeski			then
334c61a1653SRyan Zezeski				dbg "deleted addr $ipname in zone $zone"
335c61a1653SRyan Zezeski			else
336c61a1653SRyan Zezeski				maybe_fail "$err"
337c61a1653SRyan Zezeski			fi
338c61a1653SRyan Zezeski		else
339c61a1653SRyan Zezeski			dbg "addr $ipname doesn't exist in zone $zone"
340c61a1653SRyan Zezeski		fi
341c61a1653SRyan Zezeski	fi
342c61a1653SRyan Zezeski}
343c61a1653SRyan Zezeski
344c61a1653SRyan Zezeskifunction delete_if
345c61a1653SRyan Zezeski{
346c61a1653SRyan Zezeski	typeset zone=$1
347c61a1653SRyan Zezeski	typeset ifname=$2
348c61a1653SRyan Zezeski	typeset err="failed to delete interface $ifname in zone $zone"
349c61a1653SRyan Zezeski
350c61a1653SRyan Zezeski	if (($# != 2)); then
351c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
352c61a1653SRyan Zezeski	fi
353c61a1653SRyan Zezeski
354c61a1653SRyan Zezeski	if zlogin $zone ipadm show-if $ifname > /dev/null 2>&1; then
355c61a1653SRyan Zezeski		if zlogin $zone ipadm delete-if $ifname > /dev/null; then
356c61a1653SRyan Zezeski			dbg "deleted interface $ifname in zone $zone"
357c61a1653SRyan Zezeski		else
358c61a1653SRyan Zezeski			maybe_fail "$err"
359c61a1653SRyan Zezeski		fi
360c61a1653SRyan Zezeski	else
361c61a1653SRyan Zezeski		dbg "interface $ifname doesn't exist in zone $zone"
362c61a1653SRyan Zezeski	fi
363c61a1653SRyan Zezeski}
364c61a1653SRyan Zezeski
365c61a1653SRyan Zezeskifunction ip_fwd_enable
366c61a1653SRyan Zezeski{
367c61a1653SRyan Zezeski	typeset zone=$1
368c61a1653SRyan Zezeski
369c61a1653SRyan Zezeski	if (($# != 1)); then
370c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
371c61a1653SRyan Zezeski	fi
372c61a1653SRyan Zezeski
373c61a1653SRyan Zezeski	if zlogin $zone routeadm -p ipv4-forwarding | \
374c61a1653SRyan Zezeski			egrep 'current=enabled' > /dev/null
375c61a1653SRyan Zezeski	then
376c61a1653SRyan Zezeski		dbg "IPv4 forwarding already enabled for $zone"
377c61a1653SRyan Zezeski	else
378c61a1653SRyan Zezeski		if zlogin $zone routeadm -ue ipv4-forwarding; then
379c61a1653SRyan Zezeski			dbg "enabled IPv4 forwarding for $zone"
380c61a1653SRyan Zezeski		else
381c61a1653SRyan Zezeski			maybe_fail "failed to enable IPv4 forwarding for $zone"
382c61a1653SRyan Zezeski			return 1
383c61a1653SRyan Zezeski		fi
384c61a1653SRyan Zezeski	fi
385c61a1653SRyan Zezeski
386c61a1653SRyan Zezeski	if zlogin $zone routeadm -p ipv6-forwarding | \
387c61a1653SRyan Zezeski			egrep 'current=enabled' > /dev/null
388c61a1653SRyan Zezeski	then
389c61a1653SRyan Zezeski		dbg "IPv6 forwarding already enabled for $zone"
390c61a1653SRyan Zezeski	else
391c61a1653SRyan Zezeski		if zlogin $zone routeadm -ue ipv6-forwarding; then
392c61a1653SRyan Zezeski			dbg "enabled IPv6 forwarding for $zone"
393c61a1653SRyan Zezeski		else
394c61a1653SRyan Zezeski			maybe_fail "failed to enable IPv6 forwarding for $zone"
395c61a1653SRyan Zezeski		fi
396c61a1653SRyan Zezeski	fi
397c61a1653SRyan Zezeski}
398c61a1653SRyan Zezeski
399c61a1653SRyan Zezeskifunction ip_fwd_disable
400c61a1653SRyan Zezeski{
401c61a1653SRyan Zezeski	typeset zone=$1
402c61a1653SRyan Zezeski
403c61a1653SRyan Zezeski	if (($# != 1)); then
404c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
405c61a1653SRyan Zezeski	fi
406c61a1653SRyan Zezeski
407c61a1653SRyan Zezeski	if zlogin $zone routeadm -p ipv4-forwarding | \
408c61a1653SRyan Zezeski			egrep 'current=disabled' > /dev/null
409c61a1653SRyan Zezeski	then
410c61a1653SRyan Zezeski		dbg "IPv4 forwarding already disabled for $zone"
411c61a1653SRyan Zezeski	else
412c61a1653SRyan Zezeski		if zlogin $zone routeadm -ud ipv4-forwarding; then
413c61a1653SRyan Zezeski			dbg "disabled IPv4 forwarding in $zone"
414c61a1653SRyan Zezeski		else
415c61a1653SRyan Zezeski			maybe_fail "failed to disable IPv4 forwarding in $zone"
416c61a1653SRyan Zezeski			return 1
417c61a1653SRyan Zezeski		fi
418c61a1653SRyan Zezeski	fi
419c61a1653SRyan Zezeski
420c61a1653SRyan Zezeski	if zlogin $zone routeadm -p ipv6-forwarding | \
421c61a1653SRyan Zezeski			egrep 'current=disabled' > /dev/null
422c61a1653SRyan Zezeski	then
423c61a1653SRyan Zezeski		dbg "IPv6 forwarding already disabled for $zone"
424c61a1653SRyan Zezeski	else
425c61a1653SRyan Zezeski		if zlogin $zone routeadm -ud ipv6-forwarding; then
426c61a1653SRyan Zezeski			dbg "disabled IPv6 forwarding in $zone"
427c61a1653SRyan Zezeski		else
428c61a1653SRyan Zezeski			maybe_fail "failed to disable IPv6 forwarding in $zone"
429c61a1653SRyan Zezeski		fi
430c61a1653SRyan Zezeski	fi
431c61a1653SRyan Zezeski}
432c61a1653SRyan Zezeski
433c61a1653SRyan Zezeskifunction add_route
434c61a1653SRyan Zezeski{
435c61a1653SRyan Zezeski	typeset zone=$1
436c61a1653SRyan Zezeski	typeset dest=$2
437c61a1653SRyan Zezeski	typeset net=$3
438c61a1653SRyan Zezeski	typeset gateway=$4
439c61a1653SRyan Zezeski
440c61a1653SRyan Zezeski	if (($# != 4)); then
441c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
442c61a1653SRyan Zezeski	fi
443c61a1653SRyan Zezeski
444c61a1653SRyan Zezeski	if zlogin $zone route -n add $net $gateway > /dev/null; then
445c61a1653SRyan Zezeski		dbg "added route $gateway => $net to $zone"
446c61a1653SRyan Zezeski		return 0
447c61a1653SRyan Zezeski	fi
448c61a1653SRyan Zezeski
449c61a1653SRyan Zezeski	maybe_fail "failed to add route $gateway => $net to $zone"
450c61a1653SRyan Zezeski}
451c61a1653SRyan Zezeski
452c61a1653SRyan Zezeskifunction add_route6
453c61a1653SRyan Zezeski{
454c61a1653SRyan Zezeski	typeset zone=$1
455c61a1653SRyan Zezeski	typeset dest=$2
456c61a1653SRyan Zezeski	typeset net=$3
457c61a1653SRyan Zezeski	typeset gateway=$4
458c61a1653SRyan Zezeski
459c61a1653SRyan Zezeski	if (($# != 4)); then
460c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
461c61a1653SRyan Zezeski	fi
462c61a1653SRyan Zezeski
463c61a1653SRyan Zezeski	if zlogin $zone route -n add -inet6 $net $gateway > /dev/null
464c61a1653SRyan Zezeski	then
465c61a1653SRyan Zezeski		dbg "added route $gateway => $net to $zone"
466c61a1653SRyan Zezeski		return 0
467c61a1653SRyan Zezeski	fi
468c61a1653SRyan Zezeski
469c61a1653SRyan Zezeski	maybe_fail "failed to add route $gateway => $net to $zone"
470c61a1653SRyan Zezeski}
471c61a1653SRyan Zezeski
472c61a1653SRyan Zezeskifunction rm_route
473c61a1653SRyan Zezeski{
474c61a1653SRyan Zezeski	typeset zone=$1
475c61a1653SRyan Zezeski	typeset dest=$2
476c61a1653SRyan Zezeski	typeset net=$3
477c61a1653SRyan Zezeski	typeset gateway=$4
478c61a1653SRyan Zezeski	typeset gw=$(zlogin $zone route -n get $dest | \
479c61a1653SRyan Zezeski			     grep gateway | awk '{ print $2 }')
480c61a1653SRyan Zezeski	typeset err="failed to remove route $gateway => $net from $zone"
481c61a1653SRyan Zezeski
482c61a1653SRyan Zezeski	if (($# != 4)); then
483c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
484c61a1653SRyan Zezeski	fi
485c61a1653SRyan Zezeski
486c61a1653SRyan Zezeski	if [[ "$gw" == "$gateway" ]]; then
487c61a1653SRyan Zezeski		if zlogin $zone route -n delete $net $gateway > /dev/null
488c61a1653SRyan Zezeski		then
489c61a1653SRyan Zezeski			dbg "removed route $gateway => $net from $zone"
490c61a1653SRyan Zezeski		else
491c61a1653SRyan Zezeski			maybe_fail "$err"
492c61a1653SRyan Zezeski		fi
493c61a1653SRyan Zezeski	else
494c61a1653SRyan Zezeski		dbg "$zone already lacked route $gateway => $net"
495c61a1653SRyan Zezeski	fi
496c61a1653SRyan Zezeski}
497c61a1653SRyan Zezeski
498c61a1653SRyan Zezeskifunction rm_route6
499c61a1653SRyan Zezeski{
500c61a1653SRyan Zezeski	typeset zone=$1
501c61a1653SRyan Zezeski	typeset dest=$2
502c61a1653SRyan Zezeski	typeset net=$3
503c61a1653SRyan Zezeski	typeset gateway=$4
504c61a1653SRyan Zezeski	typeset gw=$(zlogin $zone route -n get -inet6 $dest | \
505c61a1653SRyan Zezeski			     grep gateway | awk '{ print $2 }')
506c61a1653SRyan Zezeski	typeset err="failed to remove route $gateway => $net from $zone"
507c61a1653SRyan Zezeski
508c61a1653SRyan Zezeski	if (($# != 4)); then
509c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
510c61a1653SRyan Zezeski	fi
511c61a1653SRyan Zezeski
512c61a1653SRyan Zezeski	if [[ "$gw" == "$gateway" ]]; then
513c61a1653SRyan Zezeski		if zlogin $zone route -n delete -inet6 $net $gateway > /dev/null
514c61a1653SRyan Zezeski		then
515c61a1653SRyan Zezeski			dbg "removed route $gateway => $net from $zone"
516c61a1653SRyan Zezeski		else
517c61a1653SRyan Zezeski			maybe_fail "$err"
518c61a1653SRyan Zezeski		fi
519c61a1653SRyan Zezeski	else
520c61a1653SRyan Zezeski		dbg "$zone already lacked route $gateway => $net"
521c61a1653SRyan Zezeski	fi
522c61a1653SRyan Zezeski}
523c61a1653SRyan Zezeski
524c61a1653SRyan Zezeskifunction set_linkprop
525c61a1653SRyan Zezeski{
526c61a1653SRyan Zezeski	typeset link=$1
527c61a1653SRyan Zezeski	typeset prop=$2
528c61a1653SRyan Zezeski	typeset val=$3
529c61a1653SRyan Zezeski	typeset err="failed to set $link prop: $prop=$val"
530c61a1653SRyan Zezeski
531c61a1653SRyan Zezeski	if (($# != 3)); then
532c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
533c61a1653SRyan Zezeski	fi
534c61a1653SRyan Zezeski
535c61a1653SRyan Zezeski	dbg "attempt to set $link prop: $prop=$val"
536c61a1653SRyan Zezeski	if dladm set-linkprop -p $prop=$val $link; then
537c61a1653SRyan Zezeski		dbg "set $link prop: $prop=$val"
538c61a1653SRyan Zezeski		return 0
539c61a1653SRyan Zezeski	fi
540c61a1653SRyan Zezeski
541c61a1653SRyan Zezeski	maybe_fail "$err"
542c61a1653SRyan Zezeski}
543c61a1653SRyan Zezeski
544c61a1653SRyan Zezeskifunction ping
545c61a1653SRyan Zezeski{
546c61a1653SRyan Zezeski	typeset zone=$1
547c61a1653SRyan Zezeski	typeset src=$2
548c61a1653SRyan Zezeski	typeset dst=$3
549c61a1653SRyan Zezeski	typeset info="$src -> $dst"
550c61a1653SRyan Zezeski
551c61a1653SRyan Zezeski	if (($# != 3)); then
552c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
553c61a1653SRyan Zezeski	fi
554c61a1653SRyan Zezeski
555c61a1653SRyan Zezeski	dbg "ping: $info"
556c61a1653SRyan Zezeski	if zlogin $zone ping $dst > /dev/null 2>&1; then
557c61a1653SRyan Zezeski		dbg "successful ping: $info"
558c61a1653SRyan Zezeski		return 0
559c61a1653SRyan Zezeski	fi
560c61a1653SRyan Zezeski
561c61a1653SRyan Zezeski	maybe_fail "could not ping: $info"
562c61a1653SRyan Zezeski}
563c61a1653SRyan Zezeski
564c61a1653SRyan Zezeskifunction ping_udp
565c61a1653SRyan Zezeski{
566c61a1653SRyan Zezeski	typeset client=$1
567c61a1653SRyan Zezeski	typeset client_ip=$2
568c61a1653SRyan Zezeski	typeset server_ip=$3
569c61a1653SRyan Zezeski	typeset size=$4
570c61a1653SRyan Zezeski	typeset num=$5
571c61a1653SRyan Zezeski	typeset info="$client_ip -> $server_ip (size: $size)"
572c61a1653SRyan Zezeski
573c61a1653SRyan Zezeski	if (($# != 5)); then
574c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
575c61a1653SRyan Zezeski	fi
576c61a1653SRyan Zezeski
577c61a1653SRyan Zezeski	dbg "UDP ping: $info"
578c61a1653SRyan Zezeski	if zlogin $client ping -ns -U $server_ip $size $num > /dev/null; then
579c61a1653SRyan Zezeski		dbg "UDP ping passed: $info"
580c61a1653SRyan Zezeski		return 0
581c61a1653SRyan Zezeski	fi
582c61a1653SRyan Zezeski
583c61a1653SRyan Zezeski	maybe_fail "UDP ping failed: $info"
584c61a1653SRyan Zezeski}
585c61a1653SRyan Zezeski
586c61a1653SRyan Zezeskifunction start_server
587c61a1653SRyan Zezeski{
588c61a1653SRyan Zezeski	typeset zone=$1
589c61a1653SRyan Zezeski	typeset type=$2
590c61a1653SRyan Zezeski	typeset ip=$3
591c61a1653SRyan Zezeski	typeset port=$4
592c61a1653SRyan Zezeski	typeset ofile=$5
593c61a1653SRyan Zezeski
594c61a1653SRyan Zezeski	if (($# != 5)); then
595c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
596c61a1653SRyan Zezeski	fi
597c61a1653SRyan Zezeski
598c61a1653SRyan Zezeski	dbg "start server $rfile"
599c61a1653SRyan Zezeski	zlogin $zone \
600c61a1653SRyan Zezeski	       /usr/bin/socat -u ${type}-LISTEN:$port,bind=[$ip],reuseaddr \
601c61a1653SRyan Zezeski	       CREATE:$ofile &
602c61a1653SRyan Zezeski	listener_ppid=$!
603c61a1653SRyan Zezeski	dbg "listener PPID: $listener_ppid, zone $zone"
604c61a1653SRyan Zezeski}
605c61a1653SRyan Zezeski
606c61a1653SRyan Zezeskifunction wait_for_pid
607c61a1653SRyan Zezeski{
608c61a1653SRyan Zezeski	typeset pid=$1
609c61a1653SRyan Zezeski	typeset seconds=$2
610c61a1653SRyan Zezeski	typeset s=0
611c61a1653SRyan Zezeski
612c61a1653SRyan Zezeski	if (($# != 2)); then
613c61a1653SRyan Zezeski		fail "$0: incorrect number of args provided"
614c61a1653SRyan Zezeski	fi
615c61a1653SRyan Zezeski
616c61a1653SRyan Zezeski	while true; do
617c61a1653SRyan Zezeski		if kill -0 $pid > /dev/null 2>&1; then
618c61a1653SRyan Zezeski			if ((seconds == s)); then
619c61a1653SRyan Zezeski				maybe_fail "timed out waiting for pid $pid"
620c61a1653SRyan Zezeski				return 1
621c61a1653SRyan Zezeski			fi
622c61a1653SRyan Zezeski			dbg "waiting for pid $pid"
623c61a1653SRyan Zezeski			sleep 1
624c61a1653SRyan Zezeski			((s++))
625c61a1653SRyan Zezeski		else
626c61a1653SRyan Zezeski			return 0
627c61a1653SRyan Zezeski		fi
628c61a1653SRyan Zezeski	done
629c61a1653SRyan Zezeski}
630