Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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
228ets_test_plug()
229{
230 ets_change_qdisc $put 2 "3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3" "1514 1514"
231 tc qdisc add dev $put handle 20: parent 10:4 plug
232 start_traffic_pktsize 100 $h1.10 192.0.2.1 192.0.2.2 00:c1:a0:c1:a0:00 "-c 1"
233 ets_qdisc_setup $put 2
234}