WIP FPC-III support
[linux/fpc-iii.git] / tools / testing / selftests / net / forwarding / sch_ets_tests.sh
blobcdf689e99458e0932c303a1b5486d5fb56990ef2
1 # SPDX-License-Identifier: GPL-2.0
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
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.
13 declare -a WS
15 qdisc_describe()
17 local nbands=${#WS[@]}
18 local nstrict=0
19 local i
21 for ((i = 0; i < nbands; i++)); do
22 if ((!${WS[$i]})); then
23 : $((nstrict++))
25 done
27 echo -n "ets bands $nbands"
28 if ((nstrict)); then
29 echo -n " strict $nstrict"
31 if ((nstrict < nbands)); then
32 echo -n " quanta"
33 for ((i = nstrict; i < nbands; i++)); do
34 echo -n " ${WS[$i]}"
35 done
39 __strict_eval()
41 local desc=$1; shift
42 local d=$1; shift
43 local total=$1; shift
44 local above=$1; shift
46 RET=0
48 if ((! total)); then
49 check_err 1 "No traffic observed"
50 log_test "$desc"
51 return
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"
68 strict_eval()
70 __strict_eval "$@" 1
73 notraf_eval()
75 __strict_eval "$@" 0
78 __ets_dwrr_test()
80 local -a streams=("$@")
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
89 echo "Testing $(qdisc_describe), streams ${streams[@]}"
91 for stream in ${streams[@]}; do
92 ets_start_traffic $stream
93 done
95 sleep 10
97 t0=($(collect_stats "${streams[@]}"))
99 sleep 10
101 t1=($(collect_stats "${streams[@]}"))
102 d=($(for ((i = 0; i < ${#streams[@]}; i++)); do
103 echo $((${t1[$i]} - ${t0[$i]}))
104 done))
105 total=$(echo ${d[@]} | sed 's/ /+/g' | bc)
107 for ((i = 0; i < ${#streams[@]}; i++)); do
108 local stream=${streams[$i]}
109 if ((seen_strict)); then
110 notraf_eval "band $stream" ${d[$i]} $total
111 elif ((${WS[$stream]} == 0)); then
112 strict_eval "band $stream" ${d[$i]} $total
113 seen_strict=1
114 elif ((stream == low_stream)); then
115 # Low stream is used as DWRR evaluation reference.
116 continue
117 else
118 multipath_eval "bands $low_stream:$stream" \
119 ${WS[$low_stream]} ${WS[$stream]} \
120 ${d[0]} ${d[$i]}
122 done
124 for stream in ${streams[@]}; do
125 stop_traffic
126 done
129 ets_dwrr_test_012()
131 __ets_dwrr_test 0 1 2
134 ets_dwrr_test_01()
136 __ets_dwrr_test 0 1
139 ets_dwrr_test_12()
141 __ets_dwrr_test 1 2
144 ets_qdisc_setup()
146 local dev=$1; shift
147 local nstrict=$1; shift
148 local -a quanta=("$@")
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
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
165 ets_change_qdisc $dev $nstrict "$priomap" ${quanta[@]}
168 ets_set_dwrr_uniform()
170 ets_qdisc_setup $put 0 3300 3300 3300
173 ets_set_dwrr_varying()
175 ets_qdisc_setup $put 0 5000 3500 1500
178 ets_set_strict()
180 ets_qdisc_setup $put 3
183 ets_set_mixed()
185 ets_qdisc_setup $put 1 5000 2500 1500
188 ets_change_quantum()
190 tc class change dev $put classid 10:2 ets quantum 8000
191 WS[1]=8000
194 ets_set_dwrr_two_bands()
196 ets_qdisc_setup $put 0 5000 2500
199 ets_test_strict()
201 ets_set_strict
202 ets_dwrr_test_01
203 ets_dwrr_test_12
206 ets_test_mixed()
208 ets_set_mixed
209 ets_dwrr_test_01
210 ets_dwrr_test_12
213 ets_test_dwrr()
215 ets_set_dwrr_uniform
216 ets_dwrr_test_012
217 ets_set_dwrr_varying
218 ets_dwrr_test_012
219 ets_change_quantum
220 ets_dwrr_test_012
221 ets_set_dwrr_two_bands
222 ets_dwrr_test_01