b9b72999eb
Currently the SW-datapath ETS selftests use "ip link" stats to obtain the number of packets that went through a given band. mlxsw then uses ethtool per-priority counters. Instead, change both to use qdiscs. In SW datapath this is the obvious choice, and now that mlxsw offloads FIFO, this should work on the offloaded datapath as well. This has the effect of verifying that the FIFO offload works. Signed-off-by: Petr Machata <petrm@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
224 lines
3.9 KiB
Bash
224 lines
3.9 KiB
Bash
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
# Global interface:
|
|
# $put -- port under test (e.g. $swp2)
|
|
# collect_stats($streams...) -- A function to get stats for individual streams
|
|
# 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=($(collect_stats "${streams[@]}"))
|
|
|
|
sleep 10
|
|
|
|
t1=($(collect_stats "${streams[@]}"))
|
|
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
|
|
}
|