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