1bc7cbb1eSPetr Machata#!/bin/bash 2bc7cbb1eSPetr Machata# SPDX-License-Identifier: GPL-2.0 3bc7cbb1eSPetr Machata 47844ec21SPo-Hsu Lin# Kselftest framework requirement - SKIP code is 4. 57844ec21SPo-Hsu Linksft_skip=4 67844ec21SPo-Hsu Lin 7bc7cbb1eSPetr Machata############################################################################## 8bc7cbb1eSPetr Machata# Defines 9bc7cbb1eSPetr Machata 10bc030d9cSIdo Schimmelif [[ ! -v DEVLINK_DEV ]]; then 115b3a53c9SPetr Machata DEVLINK_DEV=$(devlink port show "${NETIFS[p1]:-$NETIF_NO_CABLE}" -j \ 128e46aee6SPetr Machata | jq -r '.port | keys[]' | cut -d/ -f-2) 13bc7cbb1eSPetr Machata if [ -z "$DEVLINK_DEV" ]; then 14bc7cbb1eSPetr Machata echo "SKIP: ${NETIFS[p1]} has no devlink device registered for it" 157844ec21SPo-Hsu Lin exit $ksft_skip 16bc7cbb1eSPetr Machata fi 17bc7cbb1eSPetr Machata if [[ "$(echo $DEVLINK_DEV | grep -c pci)" -eq 0 ]]; then 18bc7cbb1eSPetr Machata echo "SKIP: devlink device's bus is not PCI" 197844ec21SPo-Hsu Lin exit $ksft_skip 20bc7cbb1eSPetr Machata fi 21bc7cbb1eSPetr Machata 22bc7cbb1eSPetr Machata DEVLINK_VIDDID=$(lspci -s $(echo $DEVLINK_DEV | cut -d"/" -f2) \ 23bc7cbb1eSPetr Machata -n | cut -d" " -f3) 240521a262SPetr Machataelif [[ ! -z "$DEVLINK_DEV" ]]; then 25557c4d2fSJiri Pirko devlink dev show $DEVLINK_DEV &> /dev/null 26557c4d2fSJiri Pirko if [ $? -ne 0 ]; then 27557c4d2fSJiri Pirko echo "SKIP: devlink device \"$DEVLINK_DEV\" not found" 287844ec21SPo-Hsu Lin exit $ksft_skip 29557c4d2fSJiri Pirko fi 30bc030d9cSIdo Schimmelfi 31bc7cbb1eSPetr Machata 32bc7cbb1eSPetr Machata############################################################################## 33bc7cbb1eSPetr Machata# Sanity checks 34bc7cbb1eSPetr Machata 356f64bcb6SJiri Pirkodevlink help 2>&1 | grep resource &> /dev/null 36bc7cbb1eSPetr Machataif [ $? -ne 0 ]; then 37bc7cbb1eSPetr Machata echo "SKIP: iproute2 too old, missing devlink resource support" 387844ec21SPo-Hsu Lin exit $ksft_skip 39bc7cbb1eSPetr Machatafi 40bc7cbb1eSPetr Machata 41a054c8d9SIdo Schimmeldevlink help 2>&1 | grep trap &> /dev/null 42a054c8d9SIdo Schimmelif [ $? -ne 0 ]; then 43a054c8d9SIdo Schimmel echo "SKIP: iproute2 too old, missing devlink trap support" 447844ec21SPo-Hsu Lin exit $ksft_skip 45a054c8d9SIdo Schimmelfi 46a054c8d9SIdo Schimmel 47552ec3d9SShalom Toledodevlink dev help 2>&1 | grep info &> /dev/null 48552ec3d9SShalom Toledoif [ $? -ne 0 ]; then 49552ec3d9SShalom Toledo echo "SKIP: iproute2 too old, missing devlink dev info support" 507844ec21SPo-Hsu Lin exit $ksft_skip 51552ec3d9SShalom Toledofi 52552ec3d9SShalom Toledo 53bc7cbb1eSPetr Machata############################################################################## 54bc7cbb1eSPetr Machata# Devlink helpers 55bc7cbb1eSPetr Machata 56bc7cbb1eSPetr Machatadevlink_resource_names_to_path() 57bc7cbb1eSPetr Machata{ 58bc7cbb1eSPetr Machata local resource 59bc7cbb1eSPetr Machata local path="" 60bc7cbb1eSPetr Machata 61bc7cbb1eSPetr Machata for resource in "${@}"; do 62bc7cbb1eSPetr Machata if [ "$path" == "" ]; then 63bc7cbb1eSPetr Machata path="$resource" 64bc7cbb1eSPetr Machata else 65bc7cbb1eSPetr Machata path="${path}/$resource" 66bc7cbb1eSPetr Machata fi 67bc7cbb1eSPetr Machata done 68bc7cbb1eSPetr Machata 69bc7cbb1eSPetr Machata echo "$path" 70bc7cbb1eSPetr Machata} 71bc7cbb1eSPetr Machata 72bc7cbb1eSPetr Machatadevlink_resource_get() 73bc7cbb1eSPetr Machata{ 74bc7cbb1eSPetr Machata local name=$1 75bc7cbb1eSPetr Machata local resource_name=.[][\"$DEVLINK_DEV\"] 76bc7cbb1eSPetr Machata 77bc7cbb1eSPetr Machata resource_name="$resource_name | .[] | select (.name == \"$name\")" 78bc7cbb1eSPetr Machata 79bc7cbb1eSPetr Machata shift 80bc7cbb1eSPetr Machata for resource in "${@}"; do 81bc7cbb1eSPetr Machata resource_name="${resource_name} | .[\"resources\"][] | \ 82bc7cbb1eSPetr Machata select (.name == \"$resource\")" 83bc7cbb1eSPetr Machata done 84bc7cbb1eSPetr Machata 85bc7cbb1eSPetr Machata devlink -j resource show "$DEVLINK_DEV" | jq "$resource_name" 86bc7cbb1eSPetr Machata} 87bc7cbb1eSPetr Machata 88bc7cbb1eSPetr Machatadevlink_resource_size_get() 89bc7cbb1eSPetr Machata{ 90bc7cbb1eSPetr Machata local size=$(devlink_resource_get "$@" | jq '.["size_new"]') 91bc7cbb1eSPetr Machata 92bc7cbb1eSPetr Machata if [ "$size" == "null" ]; then 93bc7cbb1eSPetr Machata devlink_resource_get "$@" | jq '.["size"]' 94bc7cbb1eSPetr Machata else 95bc7cbb1eSPetr Machata echo "$size" 96bc7cbb1eSPetr Machata fi 97bc7cbb1eSPetr Machata} 98bc7cbb1eSPetr Machata 99bc7cbb1eSPetr Machatadevlink_resource_size_set() 100bc7cbb1eSPetr Machata{ 101bc7cbb1eSPetr Machata local new_size=$1 102bc7cbb1eSPetr Machata local path 103bc7cbb1eSPetr Machata 104bc7cbb1eSPetr Machata shift 105bc7cbb1eSPetr Machata path=$(devlink_resource_names_to_path "$@") 106bc7cbb1eSPetr Machata devlink resource set "$DEVLINK_DEV" path "$path" size "$new_size" 107bc7cbb1eSPetr Machata check_err $? "Failed setting path $path to size $size" 108bc7cbb1eSPetr Machata} 109bc7cbb1eSPetr Machata 11046b171d7SIdo Schimmeldevlink_resource_occ_get() 11146b171d7SIdo Schimmel{ 11246b171d7SIdo Schimmel devlink_resource_get "$@" | jq '.["occ"]' 11346b171d7SIdo Schimmel} 11446b171d7SIdo Schimmel 115bc7cbb1eSPetr Machatadevlink_reload() 116bc7cbb1eSPetr Machata{ 117bc7cbb1eSPetr Machata local still_pending 118bc7cbb1eSPetr Machata 119bc7cbb1eSPetr Machata devlink dev reload "$DEVLINK_DEV" &> /dev/null 120bc7cbb1eSPetr Machata check_err $? "Failed reload" 121bc7cbb1eSPetr Machata 122bc7cbb1eSPetr Machata still_pending=$(devlink resource show "$DEVLINK_DEV" | \ 123bc7cbb1eSPetr Machata grep -c "size_new") 124bc7cbb1eSPetr Machata check_err $still_pending "Failed reload - There are still unset sizes" 125f67a90a0SAmit Cohen 126f67a90a0SAmit Cohen udevadm settle 127bc7cbb1eSPetr Machata} 128d04cc726SPetr Machata 129d04cc726SPetr Machatadeclare -A DEVLINK_ORIG 130d04cc726SPetr Machata 1316e0972e0SPetr Machata# Changing pool type from static to dynamic causes reinterpretation of threshold 1326e0972e0SPetr Machata# values. They therefore need to be saved before pool type is changed, then the 1336e0972e0SPetr Machata# pool type can be changed, and then the new values need to be set up. Therefore 1346e0972e0SPetr Machata# instead of saving the current state implicitly in the _set call, provide 1356e0972e0SPetr Machata# functions for all three primitives: save, set, and restore. 1366e0972e0SPetr Machata 137d04cc726SPetr Machatadevlink_port_pool_threshold() 138d04cc726SPetr Machata{ 139d04cc726SPetr Machata local port=$1; shift 140d04cc726SPetr Machata local pool=$1; shift 141d04cc726SPetr Machata 142d04cc726SPetr Machata devlink sb port pool show $port pool $pool -j \ 143d04cc726SPetr Machata | jq '.port_pool."'"$port"'"[].threshold' 144d04cc726SPetr Machata} 145d04cc726SPetr Machata 1466e0972e0SPetr Machatadevlink_port_pool_th_save() 1476e0972e0SPetr Machata{ 1486e0972e0SPetr Machata local port=$1; shift 1496e0972e0SPetr Machata local pool=$1; shift 1506e0972e0SPetr Machata local key="port_pool($port,$pool).threshold" 1516e0972e0SPetr Machata 1526e0972e0SPetr Machata DEVLINK_ORIG[$key]=$(devlink_port_pool_threshold $port $pool) 1536e0972e0SPetr Machata} 1546e0972e0SPetr Machata 155d04cc726SPetr Machatadevlink_port_pool_th_set() 156d04cc726SPetr Machata{ 157d04cc726SPetr Machata local port=$1; shift 158d04cc726SPetr Machata local pool=$1; shift 159d04cc726SPetr Machata local th=$1; shift 160d04cc726SPetr Machata 161d04cc726SPetr Machata devlink sb port pool set $port pool $pool th $th 162d04cc726SPetr Machata} 163d04cc726SPetr Machata 164d04cc726SPetr Machatadevlink_port_pool_th_restore() 165d04cc726SPetr Machata{ 166d04cc726SPetr Machata local port=$1; shift 167d04cc726SPetr Machata local pool=$1; shift 168d04cc726SPetr Machata local key="port_pool($port,$pool).threshold" 1696e0972e0SPetr Machata local -a orig=(${DEVLINK_ORIG[$key]}) 170d04cc726SPetr Machata 1716e0972e0SPetr Machata if [[ -z $orig ]]; then 1726e0972e0SPetr Machata echo "WARNING: Mismatched devlink_port_pool_th_restore" 1736e0972e0SPetr Machata else 1746e0972e0SPetr Machata devlink sb port pool set $port pool $pool th $orig 1756e0972e0SPetr Machata fi 176d04cc726SPetr Machata} 177d04cc726SPetr Machata 178d04cc726SPetr Machatadevlink_pool_size_thtype() 179d04cc726SPetr Machata{ 180d04cc726SPetr Machata local pool=$1; shift 181d04cc726SPetr Machata 182d04cc726SPetr Machata devlink sb pool show "$DEVLINK_DEV" pool $pool -j \ 183d04cc726SPetr Machata | jq -r '.pool[][] | (.size, .thtype)' 184d04cc726SPetr Machata} 185d04cc726SPetr Machata 1866e0972e0SPetr Machatadevlink_pool_size_thtype_save() 1876e0972e0SPetr Machata{ 1886e0972e0SPetr Machata local pool=$1; shift 1896e0972e0SPetr Machata local key="pool($pool).size_thtype" 1906e0972e0SPetr Machata 1916e0972e0SPetr Machata DEVLINK_ORIG[$key]=$(devlink_pool_size_thtype $pool) 1926e0972e0SPetr Machata} 1936e0972e0SPetr Machata 194d04cc726SPetr Machatadevlink_pool_size_thtype_set() 195d04cc726SPetr Machata{ 196d04cc726SPetr Machata local pool=$1; shift 197d04cc726SPetr Machata local thtype=$1; shift 198d04cc726SPetr Machata local size=$1; shift 199d04cc726SPetr Machata 200d04cc726SPetr Machata devlink sb pool set "$DEVLINK_DEV" pool $pool size $size thtype $thtype 201d04cc726SPetr Machata} 202d04cc726SPetr Machata 203d04cc726SPetr Machatadevlink_pool_size_thtype_restore() 204d04cc726SPetr Machata{ 205d04cc726SPetr Machata local pool=$1; shift 206d04cc726SPetr Machata local key="pool($pool).size_thtype" 207d04cc726SPetr Machata local -a orig=(${DEVLINK_ORIG[$key]}) 208d04cc726SPetr Machata 2096e0972e0SPetr Machata if [[ -z ${orig[0]} ]]; then 2106e0972e0SPetr Machata echo "WARNING: Mismatched devlink_pool_size_thtype_restore" 2116e0972e0SPetr Machata else 212d04cc726SPetr Machata devlink sb pool set "$DEVLINK_DEV" pool $pool \ 213d04cc726SPetr Machata size ${orig[0]} thtype ${orig[1]} 2146e0972e0SPetr Machata fi 215d04cc726SPetr Machata} 216d04cc726SPetr Machata 217d04cc726SPetr Machatadevlink_tc_bind_pool_th() 218d04cc726SPetr Machata{ 219d04cc726SPetr Machata local port=$1; shift 220d04cc726SPetr Machata local tc=$1; shift 221d04cc726SPetr Machata local dir=$1; shift 222d04cc726SPetr Machata 223d04cc726SPetr Machata devlink sb tc bind show $port tc $tc type $dir -j \ 224d04cc726SPetr Machata | jq -r '.tc_bind[][] | (.pool, .threshold)' 225d04cc726SPetr Machata} 226d04cc726SPetr Machata 2276e0972e0SPetr Machatadevlink_tc_bind_pool_th_save() 2286e0972e0SPetr Machata{ 2296e0972e0SPetr Machata local port=$1; shift 2306e0972e0SPetr Machata local tc=$1; shift 2316e0972e0SPetr Machata local dir=$1; shift 2326e0972e0SPetr Machata local key="tc_bind($port,$dir,$tc).pool_th" 2336e0972e0SPetr Machata 2346e0972e0SPetr Machata DEVLINK_ORIG[$key]=$(devlink_tc_bind_pool_th $port $tc $dir) 2356e0972e0SPetr Machata} 2366e0972e0SPetr Machata 237d04cc726SPetr Machatadevlink_tc_bind_pool_th_set() 238d04cc726SPetr Machata{ 239d04cc726SPetr Machata local port=$1; shift 240d04cc726SPetr Machata local tc=$1; shift 241d04cc726SPetr Machata local dir=$1; shift 242d04cc726SPetr Machata local pool=$1; shift 243d04cc726SPetr Machata local th=$1; shift 244d04cc726SPetr Machata 245d04cc726SPetr Machata devlink sb tc bind set $port tc $tc type $dir pool $pool th $th 246d04cc726SPetr Machata} 247d04cc726SPetr Machata 248d04cc726SPetr Machatadevlink_tc_bind_pool_th_restore() 249d04cc726SPetr Machata{ 250d04cc726SPetr Machata local port=$1; shift 251d04cc726SPetr Machata local tc=$1; shift 252d04cc726SPetr Machata local dir=$1; shift 253d04cc726SPetr Machata local key="tc_bind($port,$dir,$tc).pool_th" 254d04cc726SPetr Machata local -a orig=(${DEVLINK_ORIG[$key]}) 255d04cc726SPetr Machata 2566e0972e0SPetr Machata if [[ -z ${orig[0]} ]]; then 2576e0972e0SPetr Machata echo "WARNING: Mismatched devlink_tc_bind_pool_th_restore" 2586e0972e0SPetr Machata else 259d04cc726SPetr Machata devlink sb tc bind set $port tc $tc type $dir \ 260d04cc726SPetr Machata pool ${orig[0]} th ${orig[1]} 2616e0972e0SPetr Machata fi 262d04cc726SPetr Machata} 263a054c8d9SIdo Schimmel 264a054c8d9SIdo Schimmeldevlink_traps_num_get() 265a054c8d9SIdo Schimmel{ 266a054c8d9SIdo Schimmel devlink -j trap | jq '.[]["'$DEVLINK_DEV'"] | length' 267a054c8d9SIdo Schimmel} 268a054c8d9SIdo Schimmel 269a054c8d9SIdo Schimmeldevlink_traps_get() 270a054c8d9SIdo Schimmel{ 271a054c8d9SIdo Schimmel devlink -j trap | jq -r '.[]["'$DEVLINK_DEV'"][].name' 272a054c8d9SIdo Schimmel} 273a054c8d9SIdo Schimmel 274a054c8d9SIdo Schimmeldevlink_trap_type_get() 275a054c8d9SIdo Schimmel{ 276a054c8d9SIdo Schimmel local trap_name=$1; shift 277a054c8d9SIdo Schimmel 278a054c8d9SIdo Schimmel devlink -j trap show $DEVLINK_DEV trap $trap_name \ 279a054c8d9SIdo Schimmel | jq -r '.[][][].type' 280a054c8d9SIdo Schimmel} 281a054c8d9SIdo Schimmel 282a054c8d9SIdo Schimmeldevlink_trap_action_set() 283a054c8d9SIdo Schimmel{ 284a054c8d9SIdo Schimmel local trap_name=$1; shift 285a054c8d9SIdo Schimmel local action=$1; shift 286a054c8d9SIdo Schimmel 287a054c8d9SIdo Schimmel # Pipe output to /dev/null to avoid expected warnings. 288a054c8d9SIdo Schimmel devlink trap set $DEVLINK_DEV trap $trap_name \ 289a054c8d9SIdo Schimmel action $action &> /dev/null 290a054c8d9SIdo Schimmel} 291a054c8d9SIdo Schimmel 292a054c8d9SIdo Schimmeldevlink_trap_action_get() 293a054c8d9SIdo Schimmel{ 294a054c8d9SIdo Schimmel local trap_name=$1; shift 295a054c8d9SIdo Schimmel 296a054c8d9SIdo Schimmel devlink -j trap show $DEVLINK_DEV trap $trap_name \ 297a054c8d9SIdo Schimmel | jq -r '.[][][].action' 298a054c8d9SIdo Schimmel} 299a054c8d9SIdo Schimmel 300a054c8d9SIdo Schimmeldevlink_trap_group_get() 301a054c8d9SIdo Schimmel{ 302a054c8d9SIdo Schimmel devlink -j trap show $DEVLINK_DEV trap $trap_name \ 303a054c8d9SIdo Schimmel | jq -r '.[][][].group' 304a054c8d9SIdo Schimmel} 305a054c8d9SIdo Schimmel 306a054c8d9SIdo Schimmeldevlink_trap_metadata_test() 307a054c8d9SIdo Schimmel{ 308a054c8d9SIdo Schimmel local trap_name=$1; shift 309a054c8d9SIdo Schimmel local metadata=$1; shift 310a054c8d9SIdo Schimmel 311a054c8d9SIdo Schimmel devlink -jv trap show $DEVLINK_DEV trap $trap_name \ 312a054c8d9SIdo Schimmel | jq -e '.[][][].metadata | contains(["'$metadata'"])' \ 313a054c8d9SIdo Schimmel &> /dev/null 314a054c8d9SIdo Schimmel} 315a054c8d9SIdo Schimmel 316a054c8d9SIdo Schimmeldevlink_trap_rx_packets_get() 317a054c8d9SIdo Schimmel{ 318a054c8d9SIdo Schimmel local trap_name=$1; shift 319a054c8d9SIdo Schimmel 320a054c8d9SIdo Schimmel devlink -js trap show $DEVLINK_DEV trap $trap_name \ 321a054c8d9SIdo Schimmel | jq '.[][][]["stats"]["rx"]["packets"]' 322a054c8d9SIdo Schimmel} 323a054c8d9SIdo Schimmel 324a054c8d9SIdo Schimmeldevlink_trap_rx_bytes_get() 325a054c8d9SIdo Schimmel{ 326a054c8d9SIdo Schimmel local trap_name=$1; shift 327a054c8d9SIdo Schimmel 328a054c8d9SIdo Schimmel devlink -js trap show $DEVLINK_DEV trap $trap_name \ 329a054c8d9SIdo Schimmel | jq '.[][][]["stats"]["rx"]["bytes"]' 330a054c8d9SIdo Schimmel} 331a054c8d9SIdo Schimmel 33253f1bd6bSOleksandr Mazurdevlink_trap_drop_packets_get() 33353f1bd6bSOleksandr Mazur{ 33453f1bd6bSOleksandr Mazur local trap_name=$1; shift 33553f1bd6bSOleksandr Mazur 33653f1bd6bSOleksandr Mazur devlink -js trap show $DEVLINK_DEV trap $trap_name \ 33753f1bd6bSOleksandr Mazur | jq '.[][][]["stats"]["rx"]["dropped"]' 33853f1bd6bSOleksandr Mazur} 33953f1bd6bSOleksandr Mazur 340a054c8d9SIdo Schimmeldevlink_trap_stats_idle_test() 341a054c8d9SIdo Schimmel{ 342a054c8d9SIdo Schimmel local trap_name=$1; shift 343a054c8d9SIdo Schimmel local t0_packets t0_bytes 344a054c8d9SIdo Schimmel local t1_packets t1_bytes 345a054c8d9SIdo Schimmel 346a054c8d9SIdo Schimmel t0_packets=$(devlink_trap_rx_packets_get $trap_name) 347a054c8d9SIdo Schimmel t0_bytes=$(devlink_trap_rx_bytes_get $trap_name) 348a054c8d9SIdo Schimmel 349a054c8d9SIdo Schimmel sleep 1 350a054c8d9SIdo Schimmel 351a054c8d9SIdo Schimmel t1_packets=$(devlink_trap_rx_packets_get $trap_name) 352a054c8d9SIdo Schimmel t1_bytes=$(devlink_trap_rx_bytes_get $trap_name) 353a054c8d9SIdo Schimmel 354a054c8d9SIdo Schimmel if [[ $t0_packets -eq $t1_packets && $t0_bytes -eq $t1_bytes ]]; then 355a054c8d9SIdo Schimmel return 0 356a054c8d9SIdo Schimmel else 357a054c8d9SIdo Schimmel return 1 358a054c8d9SIdo Schimmel fi 359a054c8d9SIdo Schimmel} 360a054c8d9SIdo Schimmel 36153f1bd6bSOleksandr Mazurdevlink_trap_drop_stats_idle_test() 36253f1bd6bSOleksandr Mazur{ 36353f1bd6bSOleksandr Mazur local trap_name=$1; shift 36453f1bd6bSOleksandr Mazur local t0_packets t0_bytes 36553f1bd6bSOleksandr Mazur 36653f1bd6bSOleksandr Mazur t0_packets=$(devlink_trap_drop_packets_get $trap_name) 36753f1bd6bSOleksandr Mazur 36853f1bd6bSOleksandr Mazur sleep 1 36953f1bd6bSOleksandr Mazur 37053f1bd6bSOleksandr Mazur t1_packets=$(devlink_trap_drop_packets_get $trap_name) 37153f1bd6bSOleksandr Mazur 37253f1bd6bSOleksandr Mazur if [[ $t0_packets -eq $t1_packets ]]; then 37353f1bd6bSOleksandr Mazur return 0 37453f1bd6bSOleksandr Mazur else 37553f1bd6bSOleksandr Mazur return 1 37653f1bd6bSOleksandr Mazur fi 37753f1bd6bSOleksandr Mazur} 37853f1bd6bSOleksandr Mazur 379a054c8d9SIdo Schimmeldevlink_traps_enable_all() 380a054c8d9SIdo Schimmel{ 381a054c8d9SIdo Schimmel local trap_name 382a054c8d9SIdo Schimmel 383a054c8d9SIdo Schimmel for trap_name in $(devlink_traps_get); do 384a054c8d9SIdo Schimmel devlink_trap_action_set $trap_name "trap" 385a054c8d9SIdo Schimmel done 386a054c8d9SIdo Schimmel} 387a054c8d9SIdo Schimmel 388a054c8d9SIdo Schimmeldevlink_traps_disable_all() 389a054c8d9SIdo Schimmel{ 390a054c8d9SIdo Schimmel for trap_name in $(devlink_traps_get); do 391a054c8d9SIdo Schimmel devlink_trap_action_set $trap_name "drop" 392a054c8d9SIdo Schimmel done 393a054c8d9SIdo Schimmel} 394a054c8d9SIdo Schimmel 395a054c8d9SIdo Schimmeldevlink_trap_groups_get() 396a054c8d9SIdo Schimmel{ 397a054c8d9SIdo Schimmel devlink -j trap group | jq -r '.[]["'$DEVLINK_DEV'"][].name' 398a054c8d9SIdo Schimmel} 399a054c8d9SIdo Schimmel 400a054c8d9SIdo Schimmeldevlink_trap_group_action_set() 401a054c8d9SIdo Schimmel{ 402a054c8d9SIdo Schimmel local group_name=$1; shift 403a054c8d9SIdo Schimmel local action=$1; shift 404a054c8d9SIdo Schimmel 405a054c8d9SIdo Schimmel # Pipe output to /dev/null to avoid expected warnings. 406a054c8d9SIdo Schimmel devlink trap group set $DEVLINK_DEV group $group_name action $action \ 407a054c8d9SIdo Schimmel &> /dev/null 408a054c8d9SIdo Schimmel} 409a054c8d9SIdo Schimmel 410a054c8d9SIdo Schimmeldevlink_trap_group_rx_packets_get() 411a054c8d9SIdo Schimmel{ 412a054c8d9SIdo Schimmel local group_name=$1; shift 413a054c8d9SIdo Schimmel 414a054c8d9SIdo Schimmel devlink -js trap group show $DEVLINK_DEV group $group_name \ 415a054c8d9SIdo Schimmel | jq '.[][][]["stats"]["rx"]["packets"]' 416a054c8d9SIdo Schimmel} 417a054c8d9SIdo Schimmel 418a054c8d9SIdo Schimmeldevlink_trap_group_rx_bytes_get() 419a054c8d9SIdo Schimmel{ 420a054c8d9SIdo Schimmel local group_name=$1; shift 421a054c8d9SIdo Schimmel 422a054c8d9SIdo Schimmel devlink -js trap group show $DEVLINK_DEV group $group_name \ 423a054c8d9SIdo Schimmel | jq '.[][][]["stats"]["rx"]["bytes"]' 424a054c8d9SIdo Schimmel} 425a054c8d9SIdo Schimmel 426a054c8d9SIdo Schimmeldevlink_trap_group_stats_idle_test() 427a054c8d9SIdo Schimmel{ 428a054c8d9SIdo Schimmel local group_name=$1; shift 429a054c8d9SIdo Schimmel local t0_packets t0_bytes 430a054c8d9SIdo Schimmel local t1_packets t1_bytes 431a054c8d9SIdo Schimmel 432a054c8d9SIdo Schimmel t0_packets=$(devlink_trap_group_rx_packets_get $group_name) 433a054c8d9SIdo Schimmel t0_bytes=$(devlink_trap_group_rx_bytes_get $group_name) 434a054c8d9SIdo Schimmel 435a054c8d9SIdo Schimmel sleep 1 436a054c8d9SIdo Schimmel 437a054c8d9SIdo Schimmel t1_packets=$(devlink_trap_group_rx_packets_get $group_name) 438a054c8d9SIdo Schimmel t1_bytes=$(devlink_trap_group_rx_bytes_get $group_name) 439a054c8d9SIdo Schimmel 440a054c8d9SIdo Schimmel if [[ $t0_packets -eq $t1_packets && $t0_bytes -eq $t1_bytes ]]; then 441a054c8d9SIdo Schimmel return 0 442a054c8d9SIdo Schimmel else 443a054c8d9SIdo Schimmel return 1 444a054c8d9SIdo Schimmel fi 445a054c8d9SIdo Schimmel} 4466b45fe95SAmit Cohen 4477ce4e760SAmit Cohendevlink_trap_exception_test() 4487ce4e760SAmit Cohen{ 4497ce4e760SAmit Cohen local trap_name=$1; shift 45004cc99d9SIdo Schimmel local group_name 45104cc99d9SIdo Schimmel 45204cc99d9SIdo Schimmel group_name=$(devlink_trap_group_get $trap_name) 4537ce4e760SAmit Cohen 4547ce4e760SAmit Cohen devlink_trap_stats_idle_test $trap_name 4557ce4e760SAmit Cohen check_fail $? "Trap stats idle when packets should have been trapped" 4567ce4e760SAmit Cohen 4577ce4e760SAmit Cohen devlink_trap_group_stats_idle_test $group_name 4587ce4e760SAmit Cohen check_fail $? "Trap group idle when packets should have been trapped" 4597ce4e760SAmit Cohen} 4607ce4e760SAmit Cohen 4616b45fe95SAmit Cohendevlink_trap_drop_test() 4626b45fe95SAmit Cohen{ 4636b45fe95SAmit Cohen local trap_name=$1; shift 4646b45fe95SAmit Cohen local dev=$1; shift 465c902a52cSJiri Pirko local handle=$1; shift 46604cc99d9SIdo Schimmel local group_name 46704cc99d9SIdo Schimmel 46804cc99d9SIdo Schimmel group_name=$(devlink_trap_group_get $trap_name) 4696b45fe95SAmit Cohen 4706b45fe95SAmit Cohen # This is the common part of all the tests. It checks that stats are 4716b45fe95SAmit Cohen # initially idle, then non-idle after changing the trap action and 4726b45fe95SAmit Cohen # finally idle again. It also makes sure the packets are dropped and 4736b45fe95SAmit Cohen # never forwarded. 4746b45fe95SAmit Cohen devlink_trap_stats_idle_test $trap_name 4756b45fe95SAmit Cohen check_err $? "Trap stats not idle with initial drop action" 4766b45fe95SAmit Cohen devlink_trap_group_stats_idle_test $group_name 4776b45fe95SAmit Cohen check_err $? "Trap group stats not idle with initial drop action" 4786b45fe95SAmit Cohen 4796b45fe95SAmit Cohen devlink_trap_action_set $trap_name "trap" 4806b45fe95SAmit Cohen devlink_trap_stats_idle_test $trap_name 4816b45fe95SAmit Cohen check_fail $? "Trap stats idle after setting action to trap" 4826b45fe95SAmit Cohen devlink_trap_group_stats_idle_test $group_name 4836b45fe95SAmit Cohen check_fail $? "Trap group stats idle after setting action to trap" 4846b45fe95SAmit Cohen 4856b45fe95SAmit Cohen devlink_trap_action_set $trap_name "drop" 4866b45fe95SAmit Cohen 4876b45fe95SAmit Cohen devlink_trap_stats_idle_test $trap_name 4886b45fe95SAmit Cohen check_err $? "Trap stats not idle after setting action to drop" 4896b45fe95SAmit Cohen devlink_trap_group_stats_idle_test $group_name 4906b45fe95SAmit Cohen check_err $? "Trap group stats not idle after setting action to drop" 4916b45fe95SAmit Cohen 492c902a52cSJiri Pirko tc_check_packets "dev $dev egress" $handle 0 4936b45fe95SAmit Cohen check_err $? "Packets were not dropped" 4946b45fe95SAmit Cohen} 4956b45fe95SAmit Cohen 4966b45fe95SAmit Cohendevlink_trap_drop_cleanup() 4976b45fe95SAmit Cohen{ 4986b45fe95SAmit Cohen local mz_pid=$1; shift 4996b45fe95SAmit Cohen local dev=$1; shift 500ef7f6b16SAmit Cohen local proto=$1; shift 501c902a52cSJiri Pirko local pref=$1; shift 502c902a52cSJiri Pirko local handle=$1; shift 5036b45fe95SAmit Cohen 504*46f6569cSPetr Machata kill_process $mz_pid 505c902a52cSJiri Pirko tc filter del dev $dev egress protocol $proto pref $pref handle $handle flower 5066b45fe95SAmit Cohen} 5079fb74734SShalom Toledo 508da23a713SIdo Schimmeldevlink_trap_stats_check() 5099959b389SIdo Schimmel{ 5109959b389SIdo Schimmel local trap_name=$1; shift 5119959b389SIdo Schimmel local send_one="$@" 5129959b389SIdo Schimmel local t0_packets 5139959b389SIdo Schimmel local t1_packets 5149959b389SIdo Schimmel 5159959b389SIdo Schimmel t0_packets=$(devlink_trap_rx_packets_get $trap_name) 5169959b389SIdo Schimmel 5179959b389SIdo Schimmel $send_one && sleep 1 5189959b389SIdo Schimmel 5199959b389SIdo Schimmel t1_packets=$(devlink_trap_rx_packets_get $trap_name) 5209959b389SIdo Schimmel 521da23a713SIdo Schimmel [[ $t1_packets -ne $t0_packets ]] 522da23a713SIdo Schimmel} 523da23a713SIdo Schimmel 524da23a713SIdo Schimmeldevlink_trap_stats_test() 525da23a713SIdo Schimmel{ 526da23a713SIdo Schimmel local test_name=$1; shift 527da23a713SIdo Schimmel 528da23a713SIdo Schimmel RET=0 529da23a713SIdo Schimmel 530da23a713SIdo Schimmel devlink_trap_stats_check "$@" 531da23a713SIdo Schimmel check_err $? "Trap stats did not increase" 5329959b389SIdo Schimmel 5339959b389SIdo Schimmel log_test "$test_name" 5349959b389SIdo Schimmel} 5359959b389SIdo Schimmel 5365fbff58eSIdo Schimmeldevlink_trap_policers_num_get() 5375fbff58eSIdo Schimmel{ 5385fbff58eSIdo Schimmel devlink -j -p trap policer show | jq '.[]["'$DEVLINK_DEV'"] | length' 5395fbff58eSIdo Schimmel} 5405fbff58eSIdo Schimmel 5415fbff58eSIdo Schimmeldevlink_trap_policer_rate_get() 5425fbff58eSIdo Schimmel{ 5435fbff58eSIdo Schimmel local policer_id=$1; shift 5445fbff58eSIdo Schimmel 5455fbff58eSIdo Schimmel devlink -j -p trap policer show $DEVLINK_DEV policer $policer_id \ 5465fbff58eSIdo Schimmel | jq '.[][][]["rate"]' 5475fbff58eSIdo Schimmel} 5485fbff58eSIdo Schimmel 5495fbff58eSIdo Schimmeldevlink_trap_policer_burst_get() 5505fbff58eSIdo Schimmel{ 5515fbff58eSIdo Schimmel local policer_id=$1; shift 5525fbff58eSIdo Schimmel 5535fbff58eSIdo Schimmel devlink -j -p trap policer show $DEVLINK_DEV policer $policer_id \ 5545fbff58eSIdo Schimmel | jq '.[][][]["burst"]' 5555fbff58eSIdo Schimmel} 5565fbff58eSIdo Schimmel 5575fbff58eSIdo Schimmeldevlink_trap_policer_rx_dropped_get() 5585fbff58eSIdo Schimmel{ 5595fbff58eSIdo Schimmel local policer_id=$1; shift 5605fbff58eSIdo Schimmel 5615fbff58eSIdo Schimmel devlink -j -p -s trap policer show $DEVLINK_DEV policer $policer_id \ 5625fbff58eSIdo Schimmel | jq '.[][][]["stats"]["rx"]["dropped"]' 5635fbff58eSIdo Schimmel} 5645fbff58eSIdo Schimmel 5655fbff58eSIdo Schimmeldevlink_trap_group_policer_get() 5665fbff58eSIdo Schimmel{ 5675fbff58eSIdo Schimmel local group_name=$1; shift 5685fbff58eSIdo Schimmel 5695fbff58eSIdo Schimmel devlink -j -p trap group show $DEVLINK_DEV group $group_name \ 5705fbff58eSIdo Schimmel | jq '.[][][]["policer"]' 5715fbff58eSIdo Schimmel} 5725fbff58eSIdo Schimmel 5739fb74734SShalom Toledodevlink_port_by_netdev() 5749fb74734SShalom Toledo{ 5759fb74734SShalom Toledo local if_name=$1 5769fb74734SShalom Toledo 5779fb74734SShalom Toledo devlink -j port show $if_name | jq -e '.[] | keys' | jq -r '.[]' 5789fb74734SShalom Toledo} 5799fb74734SShalom Toledo 5809fb74734SShalom Toledodevlink_cpu_port_get() 5819fb74734SShalom Toledo{ 5829fb74734SShalom Toledo local cpu_dl_port_num=$(devlink port list | grep "$DEVLINK_DEV" | 5839fb74734SShalom Toledo grep cpu | cut -d/ -f3 | cut -d: -f1 | 5849fb74734SShalom Toledo sed -n '1p') 5859fb74734SShalom Toledo 5869fb74734SShalom Toledo echo "$DEVLINK_DEV/$cpu_dl_port_num" 5879fb74734SShalom Toledo} 588294f44c1SPetr Machata 589294f44c1SPetr Machatadevlink_cell_size_get() 590294f44c1SPetr Machata{ 591294f44c1SPetr Machata devlink sb pool show "$DEVLINK_DEV" pool 0 -j \ 592294f44c1SPetr Machata | jq '.pool[][].cell_size' 593294f44c1SPetr Machata} 594bd3f7850SAmit Cohen 595bd3f7850SAmit Cohendevlink_pool_size_get() 596bd3f7850SAmit Cohen{ 597bd3f7850SAmit Cohen devlink sb show "$DEVLINK_DEV" -j | jq '.[][][]["size"]' 598bd3f7850SAmit Cohen} 599