1*638cab14SRyan Zezeski#!/bin/ksh
2*638cab14SRyan Zezeski#
3*638cab14SRyan Zezeski# This file and its contents are supplied under the terms of the
4*638cab14SRyan Zezeski# Common Development and Distribution License ("CDDL"), version 1.0.
5*638cab14SRyan Zezeski# You may only use this file in accordance with the terms of version
6*638cab14SRyan Zezeski# 1.0 of the CDDL.
7*638cab14SRyan Zezeski#
8*638cab14SRyan Zezeski# A full copy of the text of the CDDL should have accompanied this
9*638cab14SRyan Zezeski# source.  A copy of the CDDL is also available via the Internet at
10*638cab14SRyan Zezeski# http://www.illumos.org/license/CDDL.
11*638cab14SRyan Zezeski#
12*638cab14SRyan Zezeski
13*638cab14SRyan Zezeski#
14*638cab14SRyan Zezeski# Copyright 2017 Joyent, Inc.
15*638cab14SRyan Zezeski#
16*638cab14SRyan Zezeski
17*638cab14SRyan Zezeski#
18*638cab14SRyan Zezeski# The purpose of this test is to verify that set-linkprop performs as
19*638cab14SRyan Zezeski# it should -- both on persistent and temporary links.
20*638cab14SRyan Zezeski#
21*638cab14SRyan Zezeski
22*638cab14SRyan Zezeskivm_arg0="$(basename $0)"
23*638cab14SRyan Zezeskivm_stub="teststub$$"
24*638cab14SRyan Zezeskivm_pvnic="test_pvnic$$"
25*638cab14SRyan Zezeskivm_tvnic="test_tvnic$$"
26*638cab14SRyan Zezeski
27*638cab14SRyan ZezeskiDL_FILE=/etc/dladm/datalink.conf
28*638cab14SRyan Zezeski
29*638cab14SRyan Zezeskifatal()
30*638cab14SRyan Zezeski{
31*638cab14SRyan Zezeski	typeset msg="$*"
32*638cab14SRyan Zezeski	[[ -z "$msg" ]] && msg="failed"
33*638cab14SRyan Zezeski	echo "TEST_FAIL: $vm_arg0: $msg" >&2
34*638cab14SRyan Zezeski
35*638cab14SRyan Zezeski	# Try to clean up just in case
36*638cab14SRyan Zezeski	dladm delete-vnic $vm_pvnic 2>/dev/null
37*638cab14SRyan Zezeski	dladm delete-vnic $vm_tvnic 2>/dev/null
38*638cab14SRyan Zezeski	dladm delete-etherstub $vm_stub 2>/dev/null
39*638cab14SRyan Zezeski	exit 1
40*638cab14SRyan Zezeski}
41*638cab14SRyan Zezeski
42*638cab14SRyan Zezeskidelete_stub()
43*638cab14SRyan Zezeski{
44*638cab14SRyan Zezeski	dladm delete-etherstub $vm_stub || fatal \
45*638cab14SRyan Zezeski	    "failed to delete stub $vm_stub"
46*638cab14SRyan Zezeski}
47*638cab14SRyan Zezeski
48*638cab14SRyan Zezeskicreate_stub()
49*638cab14SRyan Zezeski{
50*638cab14SRyan Zezeski	dladm create-etherstub $vm_stub || fatal \
51*638cab14SRyan Zezeski	    "failed to create stub"
52*638cab14SRyan Zezeski}
53*638cab14SRyan Zezeski
54*638cab14SRyan Zezeskicreate_vnic()
55*638cab14SRyan Zezeski{
56*638cab14SRyan Zezeski	typeset dev=$1
57*638cab14SRyan Zezeski	typeset flags=$2
58*638cab14SRyan Zezeski
59*638cab14SRyan Zezeski	dladm create-vnic $flags -l $vm_stub $dev 2>/dev/null || fatal \
60*638cab14SRyan Zezeski	    "failed to create vnic: $dev"
61*638cab14SRyan Zezeski}
62*638cab14SRyan Zezeski
63*638cab14SRyan Zezeskidelete_vnic()
64*638cab14SRyan Zezeski{
65*638cab14SRyan Zezeski	typeset dev=$1
66*638cab14SRyan Zezeski
67*638cab14SRyan Zezeski	dladm delete-vnic $dev || fatal "failed to delete vnic: $dev"
68*638cab14SRyan Zezeski}
69*638cab14SRyan Zezeski
70*638cab14SRyan Zezeski#
71*638cab14SRyan Zezeski# Validate the property is reported by dladm.
72*638cab14SRyan Zezeski#
73*638cab14SRyan Zezeskivalidate_prop()
74*638cab14SRyan Zezeski{
75*638cab14SRyan Zezeski	typeset dev=$1
76*638cab14SRyan Zezeski	typeset prop=$2
77*638cab14SRyan Zezeski	typeset val=$3
78*638cab14SRyan Zezeski	typeset oval
79*638cab14SRyan Zezeski
80*638cab14SRyan Zezeski	[[ -z "$dev" ]] && fatal "missing required device"
81*638cab14SRyan Zezeski	[[ -z "$prop" ]] && fatal "missing required prop"
82*638cab14SRyan Zezeski	[[ -z "$val" ]] && fatal "missing required val"
83*638cab14SRyan Zezeski	oval=$(dladm show-linkprop -c -o value -p $prop $dev | tr -d ' ')
84*638cab14SRyan Zezeski	[[ $? -eq 0 ]] || fatal "failed to get $prop for $dev"
85*638cab14SRyan Zezeski	[[ "$val" == "$oval" ]] || fatal \
86*638cab14SRyan Zezeski	    "$prop mismatch on $dev: expected $val, got $oval"
87*638cab14SRyan Zezeski}
88*638cab14SRyan Zezeski
89*638cab14SRyan Zezeski#
90*638cab14SRyan Zezeski# Validate the property is persistent.
91*638cab14SRyan Zezeski#
92*638cab14SRyan Zezeskivalidate_pprop()
93*638cab14SRyan Zezeski{
94*638cab14SRyan Zezeski	typeset dev=$1
95*638cab14SRyan Zezeski	typeset prop=$2
96*638cab14SRyan Zezeski	typeset val=$3
97*638cab14SRyan Zezeski	typeset oval
98*638cab14SRyan Zezeski
99*638cab14SRyan Zezeski	[[ -z "$dev" ]] && fatal "missing required device"
100*638cab14SRyan Zezeski	[[ -z "$prop" ]] && fatal "missing required prop"
101*638cab14SRyan Zezeski	[[ -z "$val" ]] && fatal "missing required val"
102*638cab14SRyan Zezeski
103*638cab14SRyan Zezeski	oval=$(awk "/^$dev/ { print \$2 }" $DL_FILE | \
104*638cab14SRyan Zezeski	    awk -F, "BEGIN { RS=\";\"; } /^$prop/ { print \$2; }")
105*638cab14SRyan Zezeski
106*638cab14SRyan Zezeski	[[ $? -eq 0 ]] || fatal "failed to get persistent $prop for $dev"
107*638cab14SRyan Zezeski	[[ "$val" == "$oval" ]] || fatal \
108*638cab14SRyan Zezeski	    "persistent $prop mismatch on $dev: expected $val, got $oval"
109*638cab14SRyan Zezeski}
110*638cab14SRyan Zezeski
111*638cab14SRyan Zezeski#
112*638cab14SRyan Zezeski# Validate the the property is not persistent.
113*638cab14SRyan Zezeski#
114*638cab14SRyan Zezeskivalidate_not_pprop()
115*638cab14SRyan Zezeski{
116*638cab14SRyan Zezeski	typeset dev=$1
117*638cab14SRyan Zezeski	typeset prop=$2
118*638cab14SRyan Zezeski
119*638cab14SRyan Zezeski	[[ -z "$dev" ]] && fatal "missing required device"
120*638cab14SRyan Zezeski	[[ -z "$prop" ]] && fatal "missing required prop"
121*638cab14SRyan Zezeski
122*638cab14SRyan Zezeski	oval=$(awk "/^$dev/ { print \$2 }" $DL_FILE | \
123*638cab14SRyan Zezeski	    awk -F, "BEGIN { RS=\";\"; } /^$prop/ { print \$2; }")
124*638cab14SRyan Zezeski
125*638cab14SRyan Zezeski	[[ $? -eq 0 ]] || fatal "failed to search $DL_FILE"
126*638cab14SRyan Zezeski
127*638cab14SRyan Zezeski	[[ -z "$oval" ]] || fatal \
128*638cab14SRyan Zezeski	    "found persistent $prop for $dev but didn't expect to"
129*638cab14SRyan Zezeski
130*638cab14SRyan Zezeski}
131*638cab14SRyan Zezeski
132*638cab14SRyan Zezeskiset_prop_pass()
133*638cab14SRyan Zezeski{
134*638cab14SRyan Zezeski	typeset dev=$1
135*638cab14SRyan Zezeski	typeset flags=$2
136*638cab14SRyan Zezeski	typeset prop=$3
137*638cab14SRyan Zezeski	typeset val=$4
138*638cab14SRyan Zezeski	typeset msg="failed to set prop $prop on $dev"
139*638cab14SRyan Zezeski
140*638cab14SRyan Zezeski	[[ "$#" -ne 4 ]] && fatal "set_prop_pass() requires 4 args"
141*638cab14SRyan Zezeski	[[ -z "$dev" ]] && fatal "missing required device"
142*638cab14SRyan Zezeski	[[ -z "$prop" ]] && fatal "missing required prop"
143*638cab14SRyan Zezeski	[[ -z "$val" ]] && fatal "missing required val"
144*638cab14SRyan Zezeski
145*638cab14SRyan Zezeski	if [ -n "$flags" ]; then
146*638cab14SRyan Zezeski		typeset msg="failed to set temp prop $prop on $dev"
147*638cab14SRyan Zezeski	fi
148*638cab14SRyan Zezeski
149*638cab14SRyan Zezeski	dladm set-linkprop $flags -p $prop=$val $dev || fatal $msg
150*638cab14SRyan Zezeski}
151*638cab14SRyan Zezeski
152*638cab14SRyan Zezeskitest_pass()
153*638cab14SRyan Zezeski{
154*638cab14SRyan Zezeski	[[ -f $DL_FILE ]] || fatal "datalink file does not exist: $DL_FILE"
155*638cab14SRyan Zezeski
156*638cab14SRyan Zezeski	create_stub
157*638cab14SRyan Zezeski
158*638cab14SRyan Zezeski	#
159*638cab14SRyan Zezeski	# Test setting persistent and temp properties on a persistent
160*638cab14SRyan Zezeski	# link.
161*638cab14SRyan Zezeski	#
162*638cab14SRyan Zezeski	create_vnic $vm_pvnic
163*638cab14SRyan Zezeski
164*638cab14SRyan Zezeski	set_prop_pass $vm_pvnic "-t" maxbw 89
165*638cab14SRyan Zezeski	validate_prop $vm_pvnic maxbw 89
166*638cab14SRyan Zezeski	validate_not_pprop $vm_pvnic maxbw 89
167*638cab14SRyan Zezeski	set_prop_pass $vm_pvnic "-t" priority medium
168*638cab14SRyan Zezeski	validate_prop $vm_pvnic priority medium
169*638cab14SRyan Zezeski	validate_not_pprop $vm_pvnic priority medium
170*638cab14SRyan Zezeski
171*638cab14SRyan Zezeski	set_prop_pass $vm_pvnic "" maxbw 99
172*638cab14SRyan Zezeski	validate_prop $vm_pvnic maxbw 99
173*638cab14SRyan Zezeski	validate_pprop $vm_pvnic maxbw 99
174*638cab14SRyan Zezeski	set_prop_pass $vm_pvnic "" priority low
175*638cab14SRyan Zezeski	validate_prop $vm_pvnic priority low
176*638cab14SRyan Zezeski	validate_pprop $vm_pvnic priority low
177*638cab14SRyan Zezeski
178*638cab14SRyan Zezeski	delete_vnic $vm_pvnic
179*638cab14SRyan Zezeski
180*638cab14SRyan Zezeski	#
181*638cab14SRyan Zezeski	# Test setting persistent and temp properties on a temp link.
182*638cab14SRyan Zezeski	# A "persistent" property on a temp link is really just a temp
183*638cab14SRyan Zezeski	# property. But setting a property on a temp link, without
184*638cab14SRyan Zezeski	# passing -t, should still work and report success to the
185*638cab14SRyan Zezeski	# user.
186*638cab14SRyan Zezeski	#
187*638cab14SRyan Zezeski	create_vnic $vm_tvnic "-t"
188*638cab14SRyan Zezeski
189*638cab14SRyan Zezeski	set_prop_pass $vm_tvnic "-t" maxbw 89
190*638cab14SRyan Zezeski	validate_prop $vm_tvnic maxbw 89
191*638cab14SRyan Zezeski	validate_not_pprop $vm_tvnic maxbw 89
192*638cab14SRyan Zezeski	set_prop_pass $vm_tvnic "-t" priority medium
193*638cab14SRyan Zezeski	validate_prop $vm_tvnic priority medium
194*638cab14SRyan Zezeski	validate_not_pprop $vm_tvnic priority medium
195*638cab14SRyan Zezeski
196*638cab14SRyan Zezeski	set_prop_pass $vm_tvnic "" maxbw 99
197*638cab14SRyan Zezeski	validate_prop $vm_tvnic maxbw 99
198*638cab14SRyan Zezeski	validate_not_pprop $vm_tvnic maxbw 99
199*638cab14SRyan Zezeski	set_prop_pass $vm_tvnic "" priority low
200*638cab14SRyan Zezeski	validate_prop $vm_tvnic priority low
201*638cab14SRyan Zezeski	validate_not_pprop $vm_tvnic priority low
202*638cab14SRyan Zezeski
203*638cab14SRyan Zezeski	delete_vnic $vm_tvnic
204*638cab14SRyan Zezeski
205*638cab14SRyan Zezeski	delete_stub
206*638cab14SRyan Zezeski}
207*638cab14SRyan Zezeski
208*638cab14SRyan Zezeskitest_pass
209