cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

devlink_linecard.sh (5891B)


      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
     10lib_dir=$(dirname $0)/../../../net/forwarding
     11
     12ALL_TESTS="
     13	unprovision_test
     14	provision_test
     15	activation_16x100G_test
     16"
     17
     18NUM_NETIFS=0
     19
     20source $lib_dir/lib.sh
     21source $lib_dir/devlink_lib.sh
     22
     23until_lc_state_is()
     24{
     25	local state=$1; shift
     26	local current=$("$@")
     27
     28	echo "$current"
     29	[ "$current" == "$state" ]
     30}
     31
     32until_lc_state_is_not()
     33{
     34	! until_lc_state_is "$@"
     35}
     36
     37lc_state_get()
     38{
     39	local lc=$1
     40
     41	devlink lc show $DEVLINK_DEV lc $lc -j | jq -e -r ".[][][].state"
     42}
     43
     44lc_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
     53lc_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
     62until_lc_port_count_is()
     63{
     64	local port_count=$1; shift
     65	local current=$("$@")
     66
     67	echo "$current"
     68	[ $current == $port_count ]
     69}
     70
     71lc_port_count_get()
     72{
     73	local lc=$1
     74
     75	devlink port -j | jq -e -r ".[][] | select(.lc==$lc) | .port" | wc -l
     76}
     77
     78lc_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
     87PROV_UNPROV_TIMEOUT=8000 # ms
     88POST_PROV_ACT_TIMEOUT=2000 # ms
     89PROV_PORTS_INSTANTIATION_TIMEOUT=15000 # ms
     90
     91unprovision_one()
     92{
     93	local lc=$1
     94	local state
     95
     96	state=$(lc_state_get $lc)
     97	check_err $? "Failed to get state of linecard $lc"
     98	if [[ "$state" == "unprovisioned" ]]; then
     99		return
    100	fi
    101
    102	log_info "Unprovisioning linecard $lc"
    103
    104	devlink lc set $DEVLINK_DEV lc $lc notype
    105	check_err $? "Failed to trigger linecard $lc unprovisioning"
    106
    107	state=$(lc_wait_until_state_changes $lc "unprovisioning" \
    108		$PROV_UNPROV_TIMEOUT)
    109	check_err $? "Failed to unprovision linecard $lc (timeout)"
    110
    111	[ "$state" == "unprovisioned" ]
    112	check_err $? "Failed to unprovision linecard $lc (state=$state)"
    113}
    114
    115provision_one()
    116{
    117	local lc=$1
    118	local type=$2
    119	local state
    120
    121	log_info "Provisioning linecard $lc"
    122
    123	devlink lc set $DEVLINK_DEV lc $lc type $type
    124	check_err $? "Failed trigger linecard $lc provisioning"
    125
    126	state=$(lc_wait_until_state_changes $lc "provisioning" \
    127		$PROV_UNPROV_TIMEOUT)
    128	check_err $? "Failed to provision linecard $lc (timeout)"
    129
    130	[ "$state" == "provisioned" ] || [ "$state" == "active" ]
    131	check_err $? "Failed to provision linecard $lc (state=$state)"
    132
    133	provisioned_type=$(devlink lc show $DEVLINK_DEV lc $lc -j | jq -e -r ".[][][].type")
    134	[ "$provisioned_type" == "$type" ]
    135	check_err $? "Wrong provision type returned for linecard $lc (got \"$provisioned_type\", expected \"$type\")"
    136
    137	# Wait for possible activation to make sure the state
    138	# won't change after return from this function.
    139	state=$(lc_wait_until_state_becomes $lc "active" \
    140		$POST_PROV_ACT_TIMEOUT)
    141}
    142
    143unprovision_test()
    144{
    145	RET=0
    146	local lc
    147
    148	lc=$LC_SLOT
    149	unprovision_one $lc
    150	log_test "Unprovision"
    151}
    152
    153LC_16X100G_TYPE="16x100G"
    154LC_16X100G_PORT_COUNT=16
    155
    156supported_types_check()
    157{
    158	local lc=$1
    159	local supported_types_count
    160	local type_index
    161	local lc_16x100_found=false
    162
    163	supported_types_count=$(devlink lc show $DEVLINK_DEV lc $lc -j | \
    164				jq -e -r ".[][][].supported_types | length")
    165	[ $supported_types_count != 0 ]
    166	check_err $? "No supported types found for linecard $lc"
    167	for (( type_index=0; type_index<$supported_types_count; type_index++ ))
    168	do
    169		type=$(devlink lc show $DEVLINK_DEV lc $lc -j | \
    170		       jq -e -r ".[][][].supported_types[$type_index]")
    171		if [[ "$type" == "$LC_16X100G_TYPE" ]]; then
    172			lc_16x100_found=true
    173			break
    174		fi
    175	done
    176	[ $lc_16x100_found = true ]
    177	check_err $? "16X100G not found between supported types of linecard $lc"
    178}
    179
    180ports_check()
    181{
    182	local lc=$1
    183	local expected_port_count=$2
    184	local port_count
    185
    186	port_count=$(lc_wait_until_port_count_is $lc $expected_port_count \
    187		$PROV_PORTS_INSTANTIATION_TIMEOUT)
    188	[ $port_count != 0 ]
    189	check_err $? "No port associated with linecard $lc"
    190	[ $port_count == $expected_port_count ]
    191	check_err $? "Unexpected port count linecard $lc (got $port_count, expected $expected_port_count)"
    192}
    193
    194provision_test()
    195{
    196	RET=0
    197	local lc
    198	local type
    199	local state
    200
    201	lc=$LC_SLOT
    202	supported_types_check $lc
    203	state=$(lc_state_get $lc)
    204	check_err $? "Failed to get state of linecard $lc"
    205	if [[ "$state" != "unprovisioned" ]]; then
    206		unprovision_one $lc
    207	fi
    208	provision_one $lc $LC_16X100G_TYPE
    209	ports_check $lc $LC_16X100G_PORT_COUNT
    210	log_test "Provision"
    211}
    212
    213ACTIVATION_TIMEOUT=20000 # ms
    214
    215interface_check()
    216{
    217	ip link set $h1 up
    218	ip link set $h2 up
    219	ifaces_upped=true
    220	setup_wait
    221}
    222
    223activation_16x100G_test()
    224{
    225	RET=0
    226	local lc
    227	local type
    228	local state
    229
    230	lc=$LC_SLOT
    231	type=$LC_16X100G_TYPE
    232
    233	unprovision_one $lc
    234	provision_one $lc $type
    235	state=$(lc_wait_until_state_becomes $lc "active" \
    236		$ACTIVATION_TIMEOUT)
    237	check_err $? "Failed to get linecard $lc activated (timeout)"
    238
    239	interface_check
    240
    241	log_test "Activation 16x100G"
    242}
    243
    244setup_prepare()
    245{
    246	local lc_num=$(devlink lc show -j | jq -e -r ".[][\"$DEVLINK_DEV\"] |length")
    247	if [[ $? -ne 0 ]] || [[ $lc_num -eq 0 ]]; then
    248		echo "SKIP: No linecard support found"
    249		exit $ksft_skip
    250	fi
    251
    252	if [ -z "$LC_SLOT" ]; then
    253		echo "SKIP: \"LC_SLOT\" variable not provided"
    254		exit $ksft_skip
    255	fi
    256
    257	# Interfaces are not present during the script start,
    258	# that's why we define NUM_NETIFS here so dummy
    259	# implicit veth pairs are not created.
    260	NUM_NETIFS=2
    261	h1=${NETIFS[p1]}
    262	h2=${NETIFS[p2]}
    263	ifaces_upped=false
    264}
    265
    266cleanup()
    267{
    268	if [ "$ifaces_upped" = true ] ; then
    269		ip link set $h1 down
    270		ip link set $h2 down
    271	fi
    272}
    273
    274trap cleanup EXIT
    275
    276setup_prepare
    277
    278tests_run
    279
    280exit $EXIT_STATUS