File Index
Files and directories
Sign in
FILE

sch_ets_tests.sh

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/net/forwarding/sch_ets_tests.sh BASH
  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}
~/ Read-only file preview.