1a65cc53aSPetr Machata#!/bin/bash 2a65cc53aSPetr Machata# SPDX-License-Identifier: GPL-2.0 3a65cc53aSPetr Machata 4a65cc53aSPetr MachataALL_TESTS=" 5a65cc53aSPetr Machata test_defaults 6a65cc53aSPetr Machata test_dcb_ets 7a65cc53aSPetr Machata test_mtu 8a65cc53aSPetr Machata test_pfc 9a65cc53aSPetr Machata test_int_buf 10a65cc53aSPetr Machata test_tc_priomap 11a65cc53aSPetr Machata test_tc_mtu 12a65cc53aSPetr Machata test_tc_sizes 13a65cc53aSPetr Machata test_tc_int_buf 14a65cc53aSPetr Machata" 15a65cc53aSPetr Machata 16a65cc53aSPetr Machatalib_dir=$(dirname $0)/../../../net/forwarding 17a65cc53aSPetr Machata 18a65cc53aSPetr MachataNUM_NETIFS=0 19a65cc53aSPetr Machatasource $lib_dir/lib.sh 20a65cc53aSPetr Machatasource $lib_dir/devlink_lib.sh 21a65cc53aSPetr Machata 22a65cc53aSPetr Machataswp=$NETIF_NO_CABLE 23a65cc53aSPetr Machata 24a65cc53aSPetr Machatacleanup() 25a65cc53aSPetr Machata{ 26a65cc53aSPetr Machata pre_cleanup 27a65cc53aSPetr Machata} 28a65cc53aSPetr Machata 29a65cc53aSPetr Machataget_prio_pg() 30a65cc53aSPetr Machata{ 319a1cac06SPetr Machata # Produces a string of numbers "<B0> <B1> ... <B7> ", where BX is number 329a1cac06SPetr Machata # of buffer that priority X is mapped to. 339a1cac06SPetr Machata dcb -j buffer show dev $swp | 349a1cac06SPetr Machata jq -r '[.prio_buffer | .[] | tostring + " "] | add' 35a65cc53aSPetr Machata} 36a65cc53aSPetr Machata 37a65cc53aSPetr Machataget_prio_pfc() 38a65cc53aSPetr Machata{ 399a1cac06SPetr Machata # Produces a string of numbers "<P0> <P1> ... <P7> ", where PX denotes 409a1cac06SPetr Machata # whether priority X has PFC enabled (the value is 1) or disabled (0). 419a1cac06SPetr Machata dcb -j pfc show dev $swp | 429a1cac06SPetr Machata jq -r '[.prio_pfc | .[] | if . then "1 " else "0 " end] | add' 43a65cc53aSPetr Machata} 44a65cc53aSPetr Machata 45a65cc53aSPetr Machataget_prio_tc() 46a65cc53aSPetr Machata{ 479a1cac06SPetr Machata # Produces a string of numbers "<T0> <T1> ... <T7> ", where TC is number 489a1cac06SPetr Machata # of TC that priority X is mapped to. 499a1cac06SPetr Machata dcb -j ets show dev $swp | 509a1cac06SPetr Machata jq -r '[.prio_tc | .[] | tostring + " "] | add' 51a65cc53aSPetr Machata} 52a65cc53aSPetr Machata 53a65cc53aSPetr Machataget_buf_size() 54a65cc53aSPetr Machata{ 55a65cc53aSPetr Machata local idx=$1; shift 56a65cc53aSPetr Machata 579a1cac06SPetr Machata dcb -j buffer show dev $swp | jq ".buffer_size[$idx]" 58a65cc53aSPetr Machata} 59a65cc53aSPetr Machata 60a65cc53aSPetr Machataget_tot_size() 61a65cc53aSPetr Machata{ 629a1cac06SPetr Machata dcb -j buffer show dev $swp | jq '.total_size' 63a65cc53aSPetr Machata} 64a65cc53aSPetr Machata 65a65cc53aSPetr Machatacheck_prio_pg() 66a65cc53aSPetr Machata{ 67a65cc53aSPetr Machata local expect=$1; shift 68a65cc53aSPetr Machata 69a65cc53aSPetr Machata local current=$(get_prio_pg) 70a65cc53aSPetr Machata test "$current" = "$expect" 71a65cc53aSPetr Machata check_err $? "prio2buffer is '$current', expected '$expect'" 72a65cc53aSPetr Machata} 73a65cc53aSPetr Machata 74a65cc53aSPetr Machatacheck_prio_pfc() 75a65cc53aSPetr Machata{ 76a65cc53aSPetr Machata local expect=$1; shift 77a65cc53aSPetr Machata 78a65cc53aSPetr Machata local current=$(get_prio_pfc) 79a65cc53aSPetr Machata test "$current" = "$expect" 80a65cc53aSPetr Machata check_err $? "prio PFC is '$current', expected '$expect'" 81a65cc53aSPetr Machata} 82a65cc53aSPetr Machata 83a65cc53aSPetr Machatacheck_prio_tc() 84a65cc53aSPetr Machata{ 85a65cc53aSPetr Machata local expect=$1; shift 86a65cc53aSPetr Machata 87a65cc53aSPetr Machata local current=$(get_prio_tc) 88a65cc53aSPetr Machata test "$current" = "$expect" 89a65cc53aSPetr Machata check_err $? "prio_tc is '$current', expected '$expect'" 90a65cc53aSPetr Machata} 91a65cc53aSPetr Machata 92a65cc53aSPetr Machata__check_buf_size() 93a65cc53aSPetr Machata{ 94a65cc53aSPetr Machata local idx=$1; shift 95a65cc53aSPetr Machata local expr=$1; shift 96a65cc53aSPetr Machata local what=$1; shift 97a65cc53aSPetr Machata 98a65cc53aSPetr Machata local current=$(get_buf_size $idx) 99a65cc53aSPetr Machata ((current $expr)) 100a65cc53aSPetr Machata check_err $? "${what}buffer $idx size is '$current', expected '$expr'" 101a65cc53aSPetr Machata echo $current 102a65cc53aSPetr Machata} 103a65cc53aSPetr Machata 104a65cc53aSPetr Machatacheck_buf_size() 105a65cc53aSPetr Machata{ 106a65cc53aSPetr Machata __check_buf_size "$@" > /dev/null 107a65cc53aSPetr Machata} 108a65cc53aSPetr Machata 109a65cc53aSPetr Machatatest_defaults() 110a65cc53aSPetr Machata{ 111a65cc53aSPetr Machata RET=0 112a65cc53aSPetr Machata 113a65cc53aSPetr Machata check_prio_pg "0 0 0 0 0 0 0 0 " 114a65cc53aSPetr Machata check_prio_tc "0 0 0 0 0 0 0 0 " 115a65cc53aSPetr Machata check_prio_pfc "0 0 0 0 0 0 0 0 " 116a65cc53aSPetr Machata 117a65cc53aSPetr Machata log_test "Default headroom configuration" 118a65cc53aSPetr Machata} 119a65cc53aSPetr Machata 120a65cc53aSPetr Machatatest_dcb_ets() 121a65cc53aSPetr Machata{ 122a65cc53aSPetr Machata RET=0 123a65cc53aSPetr Machata 1249a1cac06SPetr Machata dcb ets set dev $swp prio-tc 0:0 1:2 2:4 3:6 4:1 5:3 6:5 7:7 125a65cc53aSPetr Machata 126a65cc53aSPetr Machata check_prio_pg "0 2 4 6 1 3 5 7 " 127a65cc53aSPetr Machata check_prio_tc "0 2 4 6 1 3 5 7 " 128a65cc53aSPetr Machata check_prio_pfc "0 0 0 0 0 0 0 0 " 129a65cc53aSPetr Machata 1309a1cac06SPetr Machata dcb ets set dev $swp prio-tc all:0 131a65cc53aSPetr Machata 132a65cc53aSPetr Machata check_prio_pg "0 0 0 0 0 0 0 0 " 133a65cc53aSPetr Machata check_prio_tc "0 0 0 0 0 0 0 0 " 134a65cc53aSPetr Machata 1359a1cac06SPetr Machata dcb buffer set dev $swp prio-buffer 0:1 1:3 2:5 3:7 4:0 5:2 6:4 7:6 2>/dev/null 136a65cc53aSPetr Machata check_fail $? "prio2buffer accepted in DCB mode" 137a65cc53aSPetr Machata 138a65cc53aSPetr Machata log_test "Configuring headroom through ETS" 139a65cc53aSPetr Machata} 140a65cc53aSPetr Machata 141a65cc53aSPetr Machatatest_mtu() 142a65cc53aSPetr Machata{ 143a65cc53aSPetr Machata local what=$1; shift 144a65cc53aSPetr Machata local buf0size_2 145a65cc53aSPetr Machata local buf0size 146a65cc53aSPetr Machata 147a65cc53aSPetr Machata RET=0 148a65cc53aSPetr Machata buf0size=$(__check_buf_size 0 "> 0") 149a65cc53aSPetr Machata 150a65cc53aSPetr Machata mtu_set $swp 3000 151a65cc53aSPetr Machata buf0size_2=$(__check_buf_size 0 "> $buf0size" "MTU 3000: ") 152a65cc53aSPetr Machata mtu_restore $swp 153a65cc53aSPetr Machata 154a65cc53aSPetr Machata mtu_set $swp 6000 155a65cc53aSPetr Machata check_buf_size 0 "> $buf0size_2" "MTU 6000: " 156a65cc53aSPetr Machata mtu_restore $swp 157a65cc53aSPetr Machata 158a65cc53aSPetr Machata check_buf_size 0 "== $buf0size" 159a65cc53aSPetr Machata 160a65cc53aSPetr Machata log_test "${what}MTU impacts buffer size" 161a65cc53aSPetr Machata} 162a65cc53aSPetr Machata 163a65cc53aSPetr Machatatest_tc_mtu() 164a65cc53aSPetr Machata{ 165a65cc53aSPetr Machata # In TC mode, MTU still impacts the threshold below which a buffer is 166a65cc53aSPetr Machata # not permitted to go. 167a65cc53aSPetr Machata 168a65cc53aSPetr Machata tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M 169a65cc53aSPetr Machata test_mtu "TC: " 170a65cc53aSPetr Machata tc qdisc delete dev $swp root 171a65cc53aSPetr Machata} 172a65cc53aSPetr Machata 173a65cc53aSPetr Machatatest_pfc() 174a65cc53aSPetr Machata{ 175a65cc53aSPetr Machata RET=0 176a65cc53aSPetr Machata 1779a1cac06SPetr Machata dcb ets set dev $swp prio-tc all:0 5:1 6:2 7:3 178a65cc53aSPetr Machata 179a65cc53aSPetr Machata local buf0size=$(get_buf_size 0) 180a65cc53aSPetr Machata local buf1size=$(get_buf_size 1) 181a65cc53aSPetr Machata local buf2size=$(get_buf_size 2) 182a65cc53aSPetr Machata local buf3size=$(get_buf_size 3) 183a65cc53aSPetr Machata check_buf_size 0 "> 0" 184a65cc53aSPetr Machata check_buf_size 1 "> 0" 185a65cc53aSPetr Machata check_buf_size 2 "> 0" 186a65cc53aSPetr Machata check_buf_size 3 "> 0" 187a65cc53aSPetr Machata check_buf_size 4 "== 0" 188a65cc53aSPetr Machata check_buf_size 5 "== 0" 189a65cc53aSPetr Machata check_buf_size 6 "== 0" 190a65cc53aSPetr Machata check_buf_size 7 "== 0" 191a65cc53aSPetr Machata 192a65cc53aSPetr Machata log_test "Buffer size sans PFC" 193a65cc53aSPetr Machata 194a65cc53aSPetr Machata RET=0 195a65cc53aSPetr Machata 1969a1cac06SPetr Machata dcb pfc set dev $swp prio-pfc all:off 5:on 6:on 7:on delay 0 197a65cc53aSPetr Machata 198a65cc53aSPetr Machata check_prio_pg "0 0 0 0 0 1 2 3 " 199a65cc53aSPetr Machata check_prio_pfc "0 0 0 0 0 1 1 1 " 200a65cc53aSPetr Machata check_buf_size 0 "== $buf0size" 201a65cc53aSPetr Machata check_buf_size 1 "> $buf1size" 202a65cc53aSPetr Machata check_buf_size 2 "> $buf2size" 203a65cc53aSPetr Machata check_buf_size 3 "> $buf3size" 204a65cc53aSPetr Machata 205a65cc53aSPetr Machata local buf1size=$(get_buf_size 1) 206a65cc53aSPetr Machata check_buf_size 2 "== $buf1size" 207a65cc53aSPetr Machata check_buf_size 3 "== $buf1size" 208a65cc53aSPetr Machata 209a65cc53aSPetr Machata log_test "PFC: Cable length 0" 210a65cc53aSPetr Machata 211a65cc53aSPetr Machata RET=0 212a65cc53aSPetr Machata 2139a1cac06SPetr Machata dcb pfc set dev $swp delay 1000 214a65cc53aSPetr Machata 215a65cc53aSPetr Machata check_buf_size 0 "== $buf0size" 216a65cc53aSPetr Machata check_buf_size 1 "> $buf1size" 217a65cc53aSPetr Machata check_buf_size 2 "> $buf1size" 218a65cc53aSPetr Machata check_buf_size 3 "> $buf1size" 219a65cc53aSPetr Machata 220a65cc53aSPetr Machata log_test "PFC: Cable length 1000" 221a65cc53aSPetr Machata 222a65cc53aSPetr Machata RET=0 223a65cc53aSPetr Machata 2249a1cac06SPetr Machata dcb pfc set dev $swp prio-pfc all:off delay 0 2259a1cac06SPetr Machata dcb ets set dev $swp prio-tc all:0 226a65cc53aSPetr Machata 227a65cc53aSPetr Machata check_prio_pg "0 0 0 0 0 0 0 0 " 228a65cc53aSPetr Machata check_prio_tc "0 0 0 0 0 0 0 0 " 229a65cc53aSPetr Machata check_buf_size 0 "> 0" 230a65cc53aSPetr Machata check_buf_size 1 "== 0" 231a65cc53aSPetr Machata check_buf_size 2 "== 0" 232a65cc53aSPetr Machata check_buf_size 3 "== 0" 233a65cc53aSPetr Machata check_buf_size 4 "== 0" 234a65cc53aSPetr Machata check_buf_size 5 "== 0" 235a65cc53aSPetr Machata check_buf_size 6 "== 0" 236a65cc53aSPetr Machata check_buf_size 7 "== 0" 237a65cc53aSPetr Machata 238a65cc53aSPetr Machata log_test "PFC: Restore defaults" 239a65cc53aSPetr Machata} 240a65cc53aSPetr Machata 241a65cc53aSPetr Machatatest_tc_priomap() 242a65cc53aSPetr Machata{ 243a65cc53aSPetr Machata RET=0 244a65cc53aSPetr Machata 2459a1cac06SPetr Machata dcb ets set dev $swp prio-tc 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7 246a65cc53aSPetr Machata check_prio_pg "0 1 2 3 4 5 6 7 " 247a65cc53aSPetr Machata 248a65cc53aSPetr Machata tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M 249a65cc53aSPetr Machata check_prio_pg "0 0 0 0 0 0 0 0 " 250a65cc53aSPetr Machata 2519a1cac06SPetr Machata dcb buffer set dev $swp prio-buffer 0:1 1:3 2:5 3:7 4:0 5:2 6:4 7:6 252a65cc53aSPetr Machata check_prio_pg "1 3 5 7 0 2 4 6 " 253a65cc53aSPetr Machata 254a65cc53aSPetr Machata tc qdisc delete dev $swp root 255a65cc53aSPetr Machata check_prio_pg "0 1 2 3 4 5 6 7 " 256a65cc53aSPetr Machata 257a65cc53aSPetr Machata # Clean up. 258a65cc53aSPetr Machata tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M 2599a1cac06SPetr Machata dcb buffer set dev $swp prio-buffer all:0 260a65cc53aSPetr Machata tc qdisc delete dev $swp root 2619a1cac06SPetr Machata dcb ets set dev $swp prio-tc all:0 262a65cc53aSPetr Machata 263a65cc53aSPetr Machata log_test "TC: priomap" 264a65cc53aSPetr Machata} 265a65cc53aSPetr Machata 266a65cc53aSPetr Machatatest_tc_sizes() 267a65cc53aSPetr Machata{ 268a65cc53aSPetr Machata local cell_size=$(devlink_cell_size_get) 269a65cc53aSPetr Machata local size=$((cell_size * 1000)) 270a65cc53aSPetr Machata 271a65cc53aSPetr Machata RET=0 272a65cc53aSPetr Machata 2739a1cac06SPetr Machata dcb buffer set dev $swp buffer-size all:0 0:$size 2>/dev/null 274a65cc53aSPetr Machata check_fail $? "buffer_size should fail before qdisc is added" 275a65cc53aSPetr Machata 276a65cc53aSPetr Machata tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M 277a65cc53aSPetr Machata 2789a1cac06SPetr Machata dcb buffer set dev $swp buffer-size all:0 0:$size 279a65cc53aSPetr Machata check_err $? "buffer_size should pass after qdisc is added" 280a65cc53aSPetr Machata check_buf_size 0 "== $size" "set size: " 281a65cc53aSPetr Machata 282a65cc53aSPetr Machata mtu_set $swp 6000 283a65cc53aSPetr Machata check_buf_size 0 "== $size" "set MTU: " 284a65cc53aSPetr Machata mtu_restore $swp 285a65cc53aSPetr Machata 2869a1cac06SPetr Machata dcb buffer set dev $swp buffer-size all:0 287a65cc53aSPetr Machata 288a65cc53aSPetr Machata # After replacing the qdisc for the same kind, buffer_size still has to 289a65cc53aSPetr Machata # work. 290a65cc53aSPetr Machata tc qdisc replace dev $swp root handle 1: bfifo limit 1M 291a65cc53aSPetr Machata 2929a1cac06SPetr Machata dcb buffer set dev $swp buffer-size all:0 0:$size 293a65cc53aSPetr Machata check_buf_size 0 "== $size" "post replace, set size: " 294a65cc53aSPetr Machata 2959a1cac06SPetr Machata dcb buffer set dev $swp buffer-size all:0 296a65cc53aSPetr Machata 297a65cc53aSPetr Machata # Likewise after replacing for a different kind. 298a65cc53aSPetr Machata tc qdisc replace dev $swp root handle 2: prio bands 8 299a65cc53aSPetr Machata 3009a1cac06SPetr Machata dcb buffer set dev $swp buffer-size all:0 0:$size 301a65cc53aSPetr Machata check_buf_size 0 "== $size" "post replace different kind, set size: " 302a65cc53aSPetr Machata 303a65cc53aSPetr Machata tc qdisc delete dev $swp root 304a65cc53aSPetr Machata 3059a1cac06SPetr Machata dcb buffer set dev $swp buffer-size all:0 0:$size 2>/dev/null 306a65cc53aSPetr Machata check_fail $? "buffer_size should fail after qdisc is deleted" 307a65cc53aSPetr Machata 308a65cc53aSPetr Machata log_test "TC: buffer size" 309a65cc53aSPetr Machata} 310a65cc53aSPetr Machata 311a65cc53aSPetr Machatatest_int_buf() 312a65cc53aSPetr Machata{ 313a65cc53aSPetr Machata local what=$1; shift 314a65cc53aSPetr Machata 315a65cc53aSPetr Machata RET=0 316a65cc53aSPetr Machata 317a65cc53aSPetr Machata local buf0size=$(get_buf_size 0) 318a65cc53aSPetr Machata local tot_size=$(get_tot_size) 319a65cc53aSPetr Machata 320a65cc53aSPetr Machata # Size of internal buffer and buffer 9. 321a65cc53aSPetr Machata local dsize=$((tot_size - buf0size)) 322a65cc53aSPetr Machata 323a65cc53aSPetr Machata tc qdisc add dev $swp clsact 324a65cc53aSPetr Machata tc filter add dev $swp egress matchall skip_sw action mirred egress mirror dev $swp 325a65cc53aSPetr Machata 326a65cc53aSPetr Machata local buf0size_2=$(get_buf_size 0) 327a65cc53aSPetr Machata local tot_size_2=$(get_tot_size) 328a65cc53aSPetr Machata local dsize_2=$((tot_size_2 - buf0size_2)) 329a65cc53aSPetr Machata 330a65cc53aSPetr Machata # Egress SPAN should have added to the "invisible" buffer configuration. 331a65cc53aSPetr Machata ((dsize_2 > dsize)) 332a65cc53aSPetr Machata check_err $? "Invisible buffers account for '$dsize_2', expected '> $dsize'" 333a65cc53aSPetr Machata 334a65cc53aSPetr Machata mtu_set $swp 3000 335a65cc53aSPetr Machata 336a65cc53aSPetr Machata local buf0size_3=$(get_buf_size 0) 337a65cc53aSPetr Machata local tot_size_3=$(get_tot_size) 338a65cc53aSPetr Machata local dsize_3=$((tot_size_3 - buf0size_3)) 339a65cc53aSPetr Machata 340a65cc53aSPetr Machata # MTU change might change buffer 0, which will show at total, but the 341a65cc53aSPetr Machata # hidden buffers should stay the same size. 342a65cc53aSPetr Machata ((dsize_3 == dsize_2)) 343a65cc53aSPetr Machata check_err $? "MTU change: Invisible buffers account for '$dsize_3', expected '== $dsize_2'" 344a65cc53aSPetr Machata 345a65cc53aSPetr Machata mtu_restore $swp 346a65cc53aSPetr Machata tc qdisc del dev $swp clsact 347a65cc53aSPetr Machata 348a65cc53aSPetr Machata # After SPAN removal, hidden buffers should be back to the original sizes. 349a65cc53aSPetr Machata local buf0size_4=$(get_buf_size 0) 350a65cc53aSPetr Machata local tot_size_4=$(get_tot_size) 351a65cc53aSPetr Machata local dsize_4=$((tot_size_4 - buf0size_4)) 352a65cc53aSPetr Machata ((dsize_4 == dsize)) 353a65cc53aSPetr Machata check_err $? "SPAN removed: Invisible buffers account for '$dsize_4', expected '== $dsize'" 354a65cc53aSPetr Machata 355a65cc53aSPetr Machata log_test "${what}internal buffer size" 356a65cc53aSPetr Machata} 357a65cc53aSPetr Machata 358a65cc53aSPetr Machatatest_tc_int_buf() 359a65cc53aSPetr Machata{ 360a65cc53aSPetr Machata local cell_size=$(devlink_cell_size_get) 361a65cc53aSPetr Machata local size=$((cell_size * 1000)) 362a65cc53aSPetr Machata 363a65cc53aSPetr Machata tc qdisc replace dev $swp root handle 1: bfifo limit 1.5M 364a65cc53aSPetr Machata test_int_buf "TC: " 365a65cc53aSPetr Machata 3669a1cac06SPetr Machata dcb buffer set dev $swp buffer-size all:0 0:$size 367a65cc53aSPetr Machata test_int_buf "TC+buffsize: " 368a65cc53aSPetr Machata 3699a1cac06SPetr Machata dcb buffer set dev $swp buffer-size all:0 370a65cc53aSPetr Machata tc qdisc delete dev $swp root 371a65cc53aSPetr Machata} 372a65cc53aSPetr Machata 373*8fcac792SPetr Machatabail_on_lldpad "configure DCB" "configure Qdiscs" 37418d2c710SPetr Machata 37518d2c710SPetr Machatatrap cleanup EXIT 376a65cc53aSPetr Machatasetup_wait 377a65cc53aSPetr Machatatests_run 378a65cc53aSPetr Machata 379a65cc53aSPetr Machataexit $EXIT_STATUS 380