~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/drivers/net/mlxsw/devlink_linecard.sh

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php