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