1e1fad951SJiri Pirko#!/bin/bash
2e1fad951SJiri Pirko# SPDX-License-Identifier: GPL-2.0
3e1fad951SJiri Pirko#
4e1fad951SJiri Pirko# In addition to the common variables, user might use:
5e1fad951SJiri Pirko# LC_SLOT - If not set, all probed line cards are going to be tested,
6e1fad951SJiri Pirko#	    with an exception of the "activation_16x100G_test".
7e1fad951SJiri Pirko#	    It set, only the selected line card is going to be used
8e1fad951SJiri Pirko#	    for tests, including "activation_16x100G_test".
9e1fad951SJiri Pirko
10e1fad951SJiri Pirkolib_dir=$(dirname $0)/../../../net/forwarding
11e1fad951SJiri Pirko
12e1fad951SJiri PirkoALL_TESTS="
13e1fad951SJiri Pirko	unprovision_test
14e1fad951SJiri Pirko	provision_test
15e1fad951SJiri Pirko	activation_16x100G_test
16e1fad951SJiri Pirko"
17e1fad951SJiri Pirko
18e1fad951SJiri PirkoNUM_NETIFS=0
19e1fad951SJiri Pirko
20e1fad951SJiri Pirkosource $lib_dir/lib.sh
21e1fad951SJiri Pirkosource $lib_dir/devlink_lib.sh
22e1fad951SJiri Pirko
23e1fad951SJiri Pirkountil_lc_state_is()
24e1fad951SJiri Pirko{
25e1fad951SJiri Pirko	local state=$1; shift
26e1fad951SJiri Pirko	local current=$("$@")
27e1fad951SJiri Pirko
28e1fad951SJiri Pirko	echo "$current"
29e1fad951SJiri Pirko	[ "$current" == "$state" ]
30e1fad951SJiri Pirko}
31e1fad951SJiri Pirko
32e1fad951SJiri Pirkountil_lc_state_is_not()
33e1fad951SJiri Pirko{
34e1fad951SJiri Pirko	! until_lc_state_is "$@"
35e1fad951SJiri Pirko}
36e1fad951SJiri Pirko
37e1fad951SJiri Pirkolc_state_get()
38e1fad951SJiri Pirko{
39e1fad951SJiri Pirko	local lc=$1
40e1fad951SJiri Pirko
41e1fad951SJiri Pirko	devlink lc show $DEVLINK_DEV lc $lc -j | jq -e -r ".[][][].state"
42e1fad951SJiri Pirko}
43e1fad951SJiri Pirko
44e1fad951SJiri Pirkolc_wait_until_state_changes()
45e1fad951SJiri Pirko{
46e1fad951SJiri Pirko	local lc=$1
47e1fad951SJiri Pirko	local state=$2
48e1fad951SJiri Pirko	local timeout=$3 # ms
49e1fad951SJiri Pirko
50e1fad951SJiri Pirko	busywait "$timeout" until_lc_state_is_not "$state" lc_state_get "$lc"
51e1fad951SJiri Pirko}
52e1fad951SJiri Pirko
53e1fad951SJiri Pirkolc_wait_until_state_becomes()
54e1fad951SJiri Pirko{
55e1fad951SJiri Pirko	local lc=$1
56e1fad951SJiri Pirko	local state=$2
57e1fad951SJiri Pirko	local timeout=$3 # ms
58e1fad951SJiri Pirko
59e1fad951SJiri Pirko	busywait "$timeout" until_lc_state_is "$state" lc_state_get "$lc"
60e1fad951SJiri Pirko}
61e1fad951SJiri Pirko
62e1fad951SJiri Pirkountil_lc_port_count_is()
63e1fad951SJiri Pirko{
64e1fad951SJiri Pirko	local port_count=$1; shift
65e1fad951SJiri Pirko	local current=$("$@")
66e1fad951SJiri Pirko
67e1fad951SJiri Pirko	echo "$current"
68e1fad951SJiri Pirko	[ $current == $port_count ]
69e1fad951SJiri Pirko}
70e1fad951SJiri Pirko
71e1fad951SJiri Pirkolc_port_count_get()
72e1fad951SJiri Pirko{
73e1fad951SJiri Pirko	local lc=$1
74e1fad951SJiri Pirko
75e1fad951SJiri Pirko	devlink port -j | jq -e -r ".[][] | select(.lc==$lc) | .port" | wc -l
76e1fad951SJiri Pirko}
77e1fad951SJiri Pirko
78e1fad951SJiri Pirkolc_wait_until_port_count_is()
79e1fad951SJiri Pirko{
80e1fad951SJiri Pirko	local lc=$1
81e1fad951SJiri Pirko	local port_count=$2
82e1fad951SJiri Pirko	local timeout=$3 # ms
83e1fad951SJiri Pirko
84e1fad951SJiri Pirko	busywait "$timeout" until_lc_port_count_is "$port_count" lc_port_count_get "$lc"
85e1fad951SJiri Pirko}
86e1fad951SJiri Pirko
87e96c8da3SJiri Pirkolc_nested_devlink_dev_get()
88e96c8da3SJiri Pirko{
89e96c8da3SJiri Pirko	local lc=$1
90e96c8da3SJiri Pirko
91e96c8da3SJiri Pirko	devlink lc show $DEVLINK_DEV lc $lc -j | jq -e -r ".[][][].nested_devlink"
92e96c8da3SJiri Pirko}
93e96c8da3SJiri Pirko
94e1fad951SJiri PirkoPROV_UNPROV_TIMEOUT=8000 # ms
95e1fad951SJiri PirkoPOST_PROV_ACT_TIMEOUT=2000 # ms
96e1fad951SJiri PirkoPROV_PORTS_INSTANTIATION_TIMEOUT=15000 # ms
97e1fad951SJiri Pirko
98e1fad951SJiri Pirkounprovision_one()
99e1fad951SJiri Pirko{
100e1fad951SJiri Pirko	local lc=$1
101e1fad951SJiri Pirko	local state
102e1fad951SJiri Pirko
103e1fad951SJiri Pirko	state=$(lc_state_get $lc)
104e1fad951SJiri Pirko	check_err $? "Failed to get state of linecard $lc"
105e1fad951SJiri Pirko	if [[ "$state" == "unprovisioned" ]]; then
106e1fad951SJiri Pirko		return
107e1fad951SJiri Pirko	fi
108e1fad951SJiri Pirko
109e1fad951SJiri Pirko	log_info "Unprovisioning linecard $lc"
110e1fad951SJiri Pirko
111e1fad951SJiri Pirko	devlink lc set $DEVLINK_DEV lc $lc notype
112e1fad951SJiri Pirko	check_err $? "Failed to trigger linecard $lc unprovisioning"
113e1fad951SJiri Pirko
114e1fad951SJiri Pirko	state=$(lc_wait_until_state_changes $lc "unprovisioning" \
115e1fad951SJiri Pirko		$PROV_UNPROV_TIMEOUT)
116e1fad951SJiri Pirko	check_err $? "Failed to unprovision linecard $lc (timeout)"
117e1fad951SJiri Pirko
118e1fad951SJiri Pirko	[ "$state" == "unprovisioned" ]
119e1fad951SJiri Pirko	check_err $? "Failed to unprovision linecard $lc (state=$state)"
120e1fad951SJiri Pirko}
121e1fad951SJiri Pirko
122e1fad951SJiri Pirkoprovision_one()
123e1fad951SJiri Pirko{
124e1fad951SJiri Pirko	local lc=$1
125e1fad951SJiri Pirko	local type=$2
126e1fad951SJiri Pirko	local state
127e1fad951SJiri Pirko
128e1fad951SJiri Pirko	log_info "Provisioning linecard $lc"
129e1fad951SJiri Pirko
130e1fad951SJiri Pirko	devlink lc set $DEVLINK_DEV lc $lc type $type
131e1fad951SJiri Pirko	check_err $? "Failed trigger linecard $lc provisioning"
132e1fad951SJiri Pirko
133e1fad951SJiri Pirko	state=$(lc_wait_until_state_changes $lc "provisioning" \
134e1fad951SJiri Pirko		$PROV_UNPROV_TIMEOUT)
135e1fad951SJiri Pirko	check_err $? "Failed to provision linecard $lc (timeout)"
136e1fad951SJiri Pirko
137e1fad951SJiri Pirko	[ "$state" == "provisioned" ] || [ "$state" == "active" ]
138e1fad951SJiri Pirko	check_err $? "Failed to provision linecard $lc (state=$state)"
139e1fad951SJiri Pirko
140e1fad951SJiri Pirko	provisioned_type=$(devlink lc show $DEVLINK_DEV lc $lc -j | jq -e -r ".[][][].type")
141e1fad951SJiri Pirko	[ "$provisioned_type" == "$type" ]
142e1fad951SJiri Pirko	check_err $? "Wrong provision type returned for linecard $lc (got \"$provisioned_type\", expected \"$type\")"
143e1fad951SJiri Pirko
144e1fad951SJiri Pirko	# Wait for possible activation to make sure the state
145e1fad951SJiri Pirko	# won't change after return from this function.
146e1fad951SJiri Pirko	state=$(lc_wait_until_state_becomes $lc "active" \
147e1fad951SJiri Pirko		$POST_PROV_ACT_TIMEOUT)
148e1fad951SJiri Pirko}
149e1fad951SJiri Pirko
150e1fad951SJiri Pirkounprovision_test()
151e1fad951SJiri Pirko{
152e1fad951SJiri Pirko	RET=0
153e1fad951SJiri Pirko	local lc
154e1fad951SJiri Pirko
155e1fad951SJiri Pirko	lc=$LC_SLOT
156e1fad951SJiri Pirko	unprovision_one $lc
157e1fad951SJiri Pirko	log_test "Unprovision"
158e1fad951SJiri Pirko}
159e1fad951SJiri Pirko
160e1fad951SJiri PirkoLC_16X100G_TYPE="16x100G"
161e1fad951SJiri PirkoLC_16X100G_PORT_COUNT=16
162e1fad951SJiri Pirko
163e1fad951SJiri Pirkosupported_types_check()
164e1fad951SJiri Pirko{
165e1fad951SJiri Pirko	local lc=$1
166e1fad951SJiri Pirko	local supported_types_count
167e1fad951SJiri Pirko	local type_index
168e1fad951SJiri Pirko	local lc_16x100_found=false
169e1fad951SJiri Pirko
170e1fad951SJiri Pirko	supported_types_count=$(devlink lc show $DEVLINK_DEV lc $lc -j | \
171e1fad951SJiri Pirko				jq -e -r ".[][][].supported_types | length")
172e1fad951SJiri Pirko	[ $supported_types_count != 0 ]
173e1fad951SJiri Pirko	check_err $? "No supported types found for linecard $lc"
174e1fad951SJiri Pirko	for (( type_index=0; type_index<$supported_types_count; type_index++ ))
175e1fad951SJiri Pirko	do
176e1fad951SJiri Pirko		type=$(devlink lc show $DEVLINK_DEV lc $lc -j | \
177e1fad951SJiri Pirko		       jq -e -r ".[][][].supported_types[$type_index]")
178e1fad951SJiri Pirko		if [[ "$type" == "$LC_16X100G_TYPE" ]]; then
179e1fad951SJiri Pirko			lc_16x100_found=true
180e1fad951SJiri Pirko			break
181e1fad951SJiri Pirko		fi
182e1fad951SJiri Pirko	done
183e1fad951SJiri Pirko	[ $lc_16x100_found = true ]
184e1fad951SJiri Pirko	check_err $? "16X100G not found between supported types of linecard $lc"
185e1fad951SJiri Pirko}
186e1fad951SJiri Pirko
187e1fad951SJiri Pirkoports_check()
188e1fad951SJiri Pirko{
189e1fad951SJiri Pirko	local lc=$1
190e1fad951SJiri Pirko	local expected_port_count=$2
191e1fad951SJiri Pirko	local port_count
192e1fad951SJiri Pirko
193e1fad951SJiri Pirko	port_count=$(lc_wait_until_port_count_is $lc $expected_port_count \
194e1fad951SJiri Pirko		$PROV_PORTS_INSTANTIATION_TIMEOUT)
195e1fad951SJiri Pirko	[ $port_count != 0 ]
196e1fad951SJiri Pirko	check_err $? "No port associated with linecard $lc"
197e1fad951SJiri Pirko	[ $port_count == $expected_port_count ]
198e1fad951SJiri Pirko	check_err $? "Unexpected port count linecard $lc (got $port_count, expected $expected_port_count)"
199e1fad951SJiri Pirko}
200e1fad951SJiri Pirko
201e96c8da3SJiri Pirkolc_dev_info_provisioned_check()
202e96c8da3SJiri Pirko{
203e96c8da3SJiri Pirko	local lc=$1
204e96c8da3SJiri Pirko	local nested_devlink_dev=$2
205e96c8da3SJiri Pirko	local fixed_hw_revision
206e96c8da3SJiri Pirko	local running_ini_version
207e96c8da3SJiri Pirko
208e96c8da3SJiri Pirko	fixed_hw_revision=$(devlink dev info $nested_devlink_dev -j | \
209e96c8da3SJiri Pirko			    jq -e -r '.[][].versions.fixed."hw.revision"')
210e96c8da3SJiri Pirko	check_err $? "Failed to get linecard $lc fixed.hw.revision"
211e96c8da3SJiri Pirko	log_info "Linecard $lc fixed.hw.revision: \"$fixed_hw_revision\""
212e96c8da3SJiri Pirko	running_ini_version=$(devlink dev info $nested_devlink_dev -j | \
213e96c8da3SJiri Pirko			      jq -e -r '.[][].versions.running."ini.version"')
214e96c8da3SJiri Pirko	check_err $? "Failed to get linecard $lc running.ini.version"
215e96c8da3SJiri Pirko	log_info "Linecard $lc running.ini.version: \"$running_ini_version\""
216e96c8da3SJiri Pirko}
217e96c8da3SJiri Pirko
218e1fad951SJiri Pirkoprovision_test()
219e1fad951SJiri Pirko{
220e1fad951SJiri Pirko	RET=0
221e1fad951SJiri Pirko	local lc
222e1fad951SJiri Pirko	local type
223e1fad951SJiri Pirko	local state
224e96c8da3SJiri Pirko	local nested_devlink_dev
225e1fad951SJiri Pirko
226e1fad951SJiri Pirko	lc=$LC_SLOT
227e1fad951SJiri Pirko	supported_types_check $lc
228e1fad951SJiri Pirko	state=$(lc_state_get $lc)
229e1fad951SJiri Pirko	check_err $? "Failed to get state of linecard $lc"
230e1fad951SJiri Pirko	if [[ "$state" != "unprovisioned" ]]; then
231e1fad951SJiri Pirko		unprovision_one $lc
232e1fad951SJiri Pirko	fi
233e1fad951SJiri Pirko	provision_one $lc $LC_16X100G_TYPE
234e1fad951SJiri Pirko	ports_check $lc $LC_16X100G_PORT_COUNT
235e96c8da3SJiri Pirko
236e96c8da3SJiri Pirko	nested_devlink_dev=$(lc_nested_devlink_dev_get $lc)
237e96c8da3SJiri Pirko	check_err $? "Failed to get nested devlink handle of linecard $lc"
238e96c8da3SJiri Pirko	lc_dev_info_provisioned_check $lc $nested_devlink_dev
239e96c8da3SJiri Pirko
240e1fad951SJiri Pirko	log_test "Provision"
241e1fad951SJiri Pirko}
242e1fad951SJiri Pirko
243e1fad951SJiri PirkoACTIVATION_TIMEOUT=20000 # ms
244e1fad951SJiri Pirko
245e1fad951SJiri Pirkointerface_check()
246e1fad951SJiri Pirko{
247e1fad951SJiri Pirko	ip link set $h1 up
248e1fad951SJiri Pirko	ip link set $h2 up
249e1fad951SJiri Pirko	ifaces_upped=true
250e1fad951SJiri Pirko	setup_wait
251e1fad951SJiri Pirko}
252e1fad951SJiri Pirko
253*949c84f0SJiri Pirkolc_dev_info_active_check()
254*949c84f0SJiri Pirko{
255*949c84f0SJiri Pirko	local lc=$1
256*949c84f0SJiri Pirko	local nested_devlink_dev=$2
257*949c84f0SJiri Pirko	local fixed_device_fw_psid
258*949c84f0SJiri Pirko	local running_device_fw
259*949c84f0SJiri Pirko
260*949c84f0SJiri Pirko	fixed_device_fw_psid=$(devlink dev info $nested_devlink_dev -j | \
261*949c84f0SJiri Pirko			       jq -e -r ".[][].versions.fixed" | \
262*949c84f0SJiri Pirko			       jq -e -r '."fw.psid"')
263*949c84f0SJiri Pirko	check_err $? "Failed to get linecard $lc fixed fw PSID"
264*949c84f0SJiri Pirko	log_info "Linecard $lc fixed.fw.psid: \"$fixed_device_fw_psid\""
265*949c84f0SJiri Pirko
266*949c84f0SJiri Pirko	running_device_fw=$(devlink dev info $nested_devlink_dev -j | \
267*949c84f0SJiri Pirko			    jq -e -r ".[][].versions.running.fw")
268*949c84f0SJiri Pirko	check_err $? "Failed to get linecard $lc running.fw.version"
269*949c84f0SJiri Pirko	log_info "Linecard $lc running.fw: \"$running_device_fw\""
270*949c84f0SJiri Pirko}
271*949c84f0SJiri Pirko
272e1fad951SJiri Pirkoactivation_16x100G_test()
273e1fad951SJiri Pirko{
274e1fad951SJiri Pirko	RET=0
275e1fad951SJiri Pirko	local lc
276e1fad951SJiri Pirko	local type
277e1fad951SJiri Pirko	local state
278*949c84f0SJiri Pirko	local nested_devlink_dev
279e1fad951SJiri Pirko
280e1fad951SJiri Pirko	lc=$LC_SLOT
281e1fad951SJiri Pirko	type=$LC_16X100G_TYPE
282e1fad951SJiri Pirko
283e1fad951SJiri Pirko	unprovision_one $lc
284e1fad951SJiri Pirko	provision_one $lc $type
285e1fad951SJiri Pirko	state=$(lc_wait_until_state_becomes $lc "active" \
286e1fad951SJiri Pirko		$ACTIVATION_TIMEOUT)
287e1fad951SJiri Pirko	check_err $? "Failed to get linecard $lc activated (timeout)"
288e1fad951SJiri Pirko
289e1fad951SJiri Pirko	interface_check
290e1fad951SJiri Pirko
291*949c84f0SJiri Pirko	nested_devlink_dev=$(lc_nested_devlink_dev_get $lc)
292*949c84f0SJiri Pirko	check_err $? "Failed to get nested devlink handle of linecard $lc"
293*949c84f0SJiri Pirko	lc_dev_info_active_check $lc $nested_devlink_dev
294*949c84f0SJiri Pirko
295e1fad951SJiri Pirko	log_test "Activation 16x100G"
296e1fad951SJiri Pirko}
297e1fad951SJiri Pirko
298e1fad951SJiri Pirkosetup_prepare()
299e1fad951SJiri Pirko{
300e1fad951SJiri Pirko	local lc_num=$(devlink lc show -j | jq -e -r ".[][\"$DEVLINK_DEV\"] |length")
301e1fad951SJiri Pirko	if [[ $? -ne 0 ]] || [[ $lc_num -eq 0 ]]; then
302e1fad951SJiri Pirko		echo "SKIP: No linecard support found"
303e1fad951SJiri Pirko		exit $ksft_skip
304e1fad951SJiri Pirko	fi
305e1fad951SJiri Pirko
306e1fad951SJiri Pirko	if [ -z "$LC_SLOT" ]; then
307e1fad951SJiri Pirko		echo "SKIP: \"LC_SLOT\" variable not provided"
308e1fad951SJiri Pirko		exit $ksft_skip
309e1fad951SJiri Pirko	fi
310e1fad951SJiri Pirko
311e1fad951SJiri Pirko	# Interfaces are not present during the script start,
312e1fad951SJiri Pirko	# that's why we define NUM_NETIFS here so dummy
313e1fad951SJiri Pirko	# implicit veth pairs are not created.
314e1fad951SJiri Pirko	NUM_NETIFS=2
315e1fad951SJiri Pirko	h1=${NETIFS[p1]}
316e1fad951SJiri Pirko	h2=${NETIFS[p2]}
317e1fad951SJiri Pirko	ifaces_upped=false
318e1fad951SJiri Pirko}
319e1fad951SJiri Pirko
320e1fad951SJiri Pirkocleanup()
321e1fad951SJiri Pirko{
322e1fad951SJiri Pirko	if [ "$ifaces_upped" = true ] ; then
323e1fad951SJiri Pirko		ip link set $h1 down
324e1fad951SJiri Pirko		ip link set $h2 down
325e1fad951SJiri Pirko	fi
326e1fad951SJiri Pirko}
327e1fad951SJiri Pirko
328e1fad951SJiri Pirkotrap cleanup EXIT
329e1fad951SJiri Pirko
330e1fad951SJiri Pirkosetup_prepare
331e1fad951SJiri Pirko
332e1fad951SJiri Pirkotests_run
333e1fad951SJiri Pirko
334e1fad951SJiri Pirkoexit $EXIT_STATUS
335