1# SPDX-License-Identifier: GPL-2.0 2 3# Global interface: 4# $put -- port under test (e.g. $swp2) 5# collect_stats($streams...) -- A function to get stats for individual streams 6# ets_start_traffic($band) -- Start traffic for this band 7# ets_change_qdisc($op, $dev, $nstrict, $quanta...) -- Add or change qdisc 8 9# WS describes the Qdisc configuration. It has one value per band (so the 10# number of array elements indicates the number of bands). If the value is 11# 0, it is a strict band, otherwise the it's a DRR band and the value is 12# that band's quantum. 13declare -a WS 14 15qdisc_describe() 16{ 17 local nbands=${#WS[@]} 18 local nstrict=0 19 local i 20 21 for ((i = 0; i < nbands; i++)); do 22 if ((!${WS[$i]})); then 23 : $((nstrict++)) 24 fi 25 done 26 27 echo -n "ets bands $nbands" 28 if ((nstrict)); then 29 echo -n " strict $nstrict" 30 fi 31 if ((nstrict < nbands)); then 32 echo -n " quanta" 33 for ((i = nstrict; i < nbands; i++)); do 34 echo -n " ${WS[$i]}" 35 done 36 fi 37} 38 39__strict_eval() 40{ 41 local desc=$1; shift 42 local d=$1; shift 43 local total=$1; shift 44 local above=$1; shift 45 46 RET=0 47 48 if ((! total)); then 49 check_err 1 "No traffic observed" 50 log_test "$desc" 51 return 52 fi 53 54 local ratio=$(echo "scale=2; 100 * $d / $total" | bc -l) 55 if ((above)); then 56 test $(echo "$ratio > 95.0" | bc -l) -eq 1 57 check_err $? "Not enough traffic" 58 log_test "$desc" 59 log_info "Expected ratio >95% Measured ratio $ratio" 60 else 61 test $(echo "$ratio < 5" | bc -l) -eq 1 62 check_err $? "Too much traffic" 63 log_test "$desc" 64 log_info "Expected ratio <5% Measured ratio $ratio" 65 fi 66} 67 68strict_eval() 69{ 70 __strict_eval "$@" 1 71} 72 73notraf_eval() 74{ 75 __strict_eval "$@" 0 76} 77 78__ets_dwrr_test() 79{ 80 local -a streams=("$@") 81 82 local low_stream=${streams[0]} 83 local seen_strict=0 84 local -a t0 t1 d 85 local stream 86 local total 87 local i 88 89 echo "Testing $(qdisc_describe), streams ${streams[@]}" 90 91 for stream in ${streams[@]}; do 92 ets_start_traffic $stream 93 defer stop_traffic $! 94 done 95 96 sleep 10 97 98 t0=($(collect_stats "${streams[@]}")) 99 100 sleep 10 101 102 t1=($(collect_stats "${streams[@]}")) 103 d=($(for ((i = 0; i < ${#streams[@]}; i++)); do 104 echo $((${t1[$i]} - ${t0[$i]})) 105 done)) 106 total=$(echo ${d[@]} | sed 's/ /+/g' | bc) 107 108 for ((i = 0; i < ${#streams[@]}; i++)); do 109 local stream=${streams[$i]} 110 if ((seen_strict)); then 111 notraf_eval "band $stream" ${d[$i]} $total 112 elif ((${WS[$stream]} == 0)); then 113 strict_eval "band $stream" ${d[$i]} $total 114 seen_strict=1 115 elif ((stream == low_stream)); then 116 # Low stream is used as DWRR evaluation reference. 117 continue 118 else 119 multipath_eval "bands $low_stream:$stream" \ 120 ${WS[$low_stream]} ${WS[$stream]} \ 121 ${d[0]} ${d[$i]} 122 fi 123 done 124} 125 126ets_dwrr_test_012() 127{ 128 in_defer_scope \ 129 __ets_dwrr_test 0 1 2 130} 131 132ets_dwrr_test_01() 133{ 134 in_defer_scope \ 135 __ets_dwrr_test 0 1 136} 137 138ets_dwrr_test_12() 139{ 140 in_defer_scope \ 141 __ets_dwrr_test 1 2 142} 143 144ets_qdisc_setup() 145{ 146 local dev=$1; shift 147 local nstrict=$1; shift 148 local -a quanta=("$@") 149 150 local ndwrr=${#quanta[@]} 151 local nbands=$((nstrict + ndwrr)) 152 local nstreams=$(if ((nbands > 3)); then echo 3; else echo $nbands; fi) 153 local priomap=$(seq 0 $((nstreams - 1))) 154 local i 155 156 WS=($( 157 for ((i = 0; i < nstrict; i++)); do 158 echo 0 159 done 160 for ((i = 0; i < ndwrr; i++)); do 161 echo ${quanta[$i]} 162 done 163 )) 164 165 ets_change_qdisc $dev $nstrict "$priomap" ${quanta[@]} 166} 167 168ets_set_dwrr_uniform() 169{ 170 ets_qdisc_setup $put 0 3300 3300 3300 171} 172 173ets_set_dwrr_varying() 174{ 175 ets_qdisc_setup $put 0 5000 3500 1500 176} 177 178ets_set_strict() 179{ 180 ets_qdisc_setup $put 3 181} 182 183ets_set_mixed() 184{ 185 ets_qdisc_setup $put 1 5000 2500 1500 186} 187 188ets_change_quantum() 189{ 190 tc class change dev $put classid 10:2 ets quantum 8000 191 WS[1]=8000 192} 193 194ets_set_dwrr_two_bands() 195{ 196 ets_qdisc_setup $put 0 5000 2500 197} 198 199ets_test_strict() 200{ 201 ets_set_strict 202 xfail_on_slow ets_dwrr_test_01 203 xfail_on_slow ets_dwrr_test_12 204} 205 206ets_test_mixed() 207{ 208 ets_set_mixed 209 xfail_on_slow ets_dwrr_test_01 210 xfail_on_slow ets_dwrr_test_12 211} 212 213ets_test_dwrr() 214{ 215 ets_set_dwrr_uniform 216 xfail_on_slow ets_dwrr_test_012 217 218 ets_set_dwrr_varying 219 xfail_on_slow ets_dwrr_test_012 220 221 ets_change_quantum 222 xfail_on_slow ets_dwrr_test_012 223 224 ets_set_dwrr_two_bands 225 xfail_on_slow ets_dwrr_test_01 226} 227