linux/tools/testing/selftests/net/forwarding/sch_ets_tests.sh
Petr Machata b9b72999eb selftests: forwarding: ETS: Use Qdisc counters
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>
2020-03-05 14:03:32 -08:00

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
}