129c1eac2SPetr Machata#!/bin/bash
229c1eac2SPetr Machata# SPDX-License-Identifier: GPL-2.0
329c1eac2SPetr Machata#
429c1eac2SPetr Machata# Test qdisc offload indication
529c1eac2SPetr Machata
629c1eac2SPetr Machata
729c1eac2SPetr MachataALL_TESTS="
829c1eac2SPetr Machata	test_root
9*3d5290eaSPetr Machata	test_port_tbf
1029c1eac2SPetr Machata	test_etsprio
11*3d5290eaSPetr Machata	test_etsprio_port_tbf
1229c1eac2SPetr Machata"
1329c1eac2SPetr MachataNUM_NETIFS=1
1429c1eac2SPetr Machatalib_dir=$(dirname $0)/../../../net/forwarding
1529c1eac2SPetr Machatasource $lib_dir/lib.sh
1629c1eac2SPetr Machata
1729c1eac2SPetr Machatacheck_not_offloaded()
1829c1eac2SPetr Machata{
1929c1eac2SPetr Machata	local handle=$1; shift
2029c1eac2SPetr Machata	local h
2129c1eac2SPetr Machata	local offloaded
2229c1eac2SPetr Machata
2329c1eac2SPetr Machata	h=$(qdisc_stats_get $h1 "$handle" .handle)
2429c1eac2SPetr Machata	[[ $h == '"'$handle'"' ]]
2529c1eac2SPetr Machata	check_err $? "Qdisc with handle $handle does not exist"
2629c1eac2SPetr Machata
2729c1eac2SPetr Machata	offloaded=$(qdisc_stats_get $h1 "$handle" .offloaded)
2829c1eac2SPetr Machata	[[ $offloaded == true ]]
2929c1eac2SPetr Machata	check_fail $? "Qdisc with handle $handle offloaded, but should not be"
3029c1eac2SPetr Machata}
3129c1eac2SPetr Machata
3229c1eac2SPetr Machatacheck_all_offloaded()
3329c1eac2SPetr Machata{
3429c1eac2SPetr Machata	local handle=$1; shift
3529c1eac2SPetr Machata
3629c1eac2SPetr Machata	if [[ ! -z $handle ]]; then
3729c1eac2SPetr Machata		local offloaded=$(qdisc_stats_get $h1 "$handle" .offloaded)
3829c1eac2SPetr Machata		[[ $offloaded == true ]]
3929c1eac2SPetr Machata		check_err $? "Qdisc with handle $handle not offloaded"
4029c1eac2SPetr Machata	fi
4129c1eac2SPetr Machata
4229c1eac2SPetr Machata	local unoffloaded=$(tc q sh dev $h1 invisible |
4329c1eac2SPetr Machata				grep -v offloaded |
4429c1eac2SPetr Machata				sed s/root/parent\ root/ |
4529c1eac2SPetr Machata				cut -d' ' -f 5)
4629c1eac2SPetr Machata	[[ -z $unoffloaded ]]
4729c1eac2SPetr Machata	check_err $? "Qdiscs with following parents not offloaded: $unoffloaded"
4829c1eac2SPetr Machata
4929c1eac2SPetr Machata	pre_cleanup
5029c1eac2SPetr Machata}
5129c1eac2SPetr Machata
5229c1eac2SPetr Machatawith_ets()
5329c1eac2SPetr Machata{
5429c1eac2SPetr Machata	local handle=$1; shift
5529c1eac2SPetr Machata	local locus=$1; shift
5629c1eac2SPetr Machata
5729c1eac2SPetr Machata	tc qdisc add dev $h1 $locus handle $handle \
5829c1eac2SPetr Machata	   ets bands 8 priomap 7 6 5 4 3 2 1 0
5929c1eac2SPetr Machata	"$@"
6029c1eac2SPetr Machata	tc qdisc del dev $h1 $locus
6129c1eac2SPetr Machata}
6229c1eac2SPetr Machata
6329c1eac2SPetr Machatawith_prio()
6429c1eac2SPetr Machata{
6529c1eac2SPetr Machata	local handle=$1; shift
6629c1eac2SPetr Machata	local locus=$1; shift
6729c1eac2SPetr Machata
6829c1eac2SPetr Machata	tc qdisc add dev $h1 $locus handle $handle \
6929c1eac2SPetr Machata	   prio bands 8 priomap 7 6 5 4 3 2 1 0
7029c1eac2SPetr Machata	"$@"
7129c1eac2SPetr Machata	tc qdisc del dev $h1 $locus
7229c1eac2SPetr Machata}
7329c1eac2SPetr Machata
7429c1eac2SPetr Machatawith_red()
7529c1eac2SPetr Machata{
7629c1eac2SPetr Machata	local handle=$1; shift
7729c1eac2SPetr Machata	local locus=$1; shift
7829c1eac2SPetr Machata
7929c1eac2SPetr Machata	tc qdisc add dev $h1 $locus handle $handle \
8029c1eac2SPetr Machata	   red limit 1000000 min 200000 max 300000 probability 0.5 avpkt 1500
8129c1eac2SPetr Machata	"$@"
8229c1eac2SPetr Machata	tc qdisc del dev $h1 $locus
8329c1eac2SPetr Machata}
8429c1eac2SPetr Machata
8529c1eac2SPetr Machatawith_tbf()
8629c1eac2SPetr Machata{
8729c1eac2SPetr Machata	local handle=$1; shift
8829c1eac2SPetr Machata	local locus=$1; shift
8929c1eac2SPetr Machata
9029c1eac2SPetr Machata	tc qdisc add dev $h1 $locus handle $handle \
9129c1eac2SPetr Machata	   tbf rate 400Mbit burst 128K limit 1M
9229c1eac2SPetr Machata	"$@"
9329c1eac2SPetr Machata	tc qdisc del dev $h1 $locus
9429c1eac2SPetr Machata}
9529c1eac2SPetr Machata
9629c1eac2SPetr Machatawith_pfifo()
9729c1eac2SPetr Machata{
9829c1eac2SPetr Machata	local handle=$1; shift
9929c1eac2SPetr Machata	local locus=$1; shift
10029c1eac2SPetr Machata
10129c1eac2SPetr Machata	tc qdisc add dev $h1 $locus handle $handle pfifo limit 100K
10229c1eac2SPetr Machata	"$@"
10329c1eac2SPetr Machata	tc qdisc del dev $h1 $locus
10429c1eac2SPetr Machata}
10529c1eac2SPetr Machata
10629c1eac2SPetr Machatawith_bfifo()
10729c1eac2SPetr Machata{
10829c1eac2SPetr Machata	local handle=$1; shift
10929c1eac2SPetr Machata	local locus=$1; shift
11029c1eac2SPetr Machata
11129c1eac2SPetr Machata	tc qdisc add dev $h1 $locus handle $handle bfifo limit 100K
11229c1eac2SPetr Machata	"$@"
11329c1eac2SPetr Machata	tc qdisc del dev $h1 $locus
11429c1eac2SPetr Machata}
11529c1eac2SPetr Machata
11629c1eac2SPetr Machatawith_drr()
11729c1eac2SPetr Machata{
11829c1eac2SPetr Machata	local handle=$1; shift
11929c1eac2SPetr Machata	local locus=$1; shift
12029c1eac2SPetr Machata
12129c1eac2SPetr Machata	tc qdisc add dev $h1 $locus handle $handle drr
12229c1eac2SPetr Machata	"$@"
12329c1eac2SPetr Machata	tc qdisc del dev $h1 $locus
12429c1eac2SPetr Machata}
12529c1eac2SPetr Machata
12629c1eac2SPetr Machatawith_qdiscs()
12729c1eac2SPetr Machata{
12829c1eac2SPetr Machata	local handle=$1; shift
12929c1eac2SPetr Machata	local parent=$1; shift
13029c1eac2SPetr Machata	local kind=$1; shift
13129c1eac2SPetr Machata	local next_handle=$((handle * 2))
13229c1eac2SPetr Machata	local locus;
13329c1eac2SPetr Machata
13429c1eac2SPetr Machata	if [[ $kind == "--" ]]; then
13529c1eac2SPetr Machata		local cmd=$1; shift
13629c1eac2SPetr Machata		$cmd $(printf %x: $parent) "$@"
13729c1eac2SPetr Machata	else
13829c1eac2SPetr Machata		if ((parent == 0)); then
13929c1eac2SPetr Machata			locus=root
14029c1eac2SPetr Machata		else
14129c1eac2SPetr Machata			locus=$(printf "parent %x:1" $parent)
14229c1eac2SPetr Machata		fi
14329c1eac2SPetr Machata
14429c1eac2SPetr Machata		with_$kind $(printf %x: $handle) "$locus" \
14529c1eac2SPetr Machata			with_qdiscs $next_handle $handle "$@"
14629c1eac2SPetr Machata	fi
14729c1eac2SPetr Machata}
14829c1eac2SPetr Machata
14929c1eac2SPetr Machataget_name()
15029c1eac2SPetr Machata{
15129c1eac2SPetr Machata	local parent=$1; shift
15229c1eac2SPetr Machata	local name=$(echo "" "${@^^}" | tr ' ' -)
15329c1eac2SPetr Machata
15429c1eac2SPetr Machata	if ((parent != 0)); then
15529c1eac2SPetr Machata		kind=$(qdisc_stats_get $h1 $parent: .kind)
15629c1eac2SPetr Machata		kind=${kind%\"}
15729c1eac2SPetr Machata		kind=${kind#\"}
15829c1eac2SPetr Machata		name="-${kind^^}$name"
15929c1eac2SPetr Machata	fi
16029c1eac2SPetr Machata
16129c1eac2SPetr Machata	echo root$name
16229c1eac2SPetr Machata}
16329c1eac2SPetr Machata
16429c1eac2SPetr Machatado_test_offloaded()
16529c1eac2SPetr Machata{
16629c1eac2SPetr Machata	local handle=$1; shift
16729c1eac2SPetr Machata	local parent=$1; shift
16829c1eac2SPetr Machata
16929c1eac2SPetr Machata	RET=0
17029c1eac2SPetr Machata	with_qdiscs $handle $parent "$@" -- check_all_offloaded
17129c1eac2SPetr Machata	log_test $(get_name $parent "$@")" offloaded"
17229c1eac2SPetr Machata}
17329c1eac2SPetr Machata
17429c1eac2SPetr Machatado_test_nooffload()
17529c1eac2SPetr Machata{
17629c1eac2SPetr Machata	local handle=$1; shift
17729c1eac2SPetr Machata	local parent=$1; shift
17829c1eac2SPetr Machata
17929c1eac2SPetr Machata	local name=$(echo "${@^^}" | tr ' ' -)
18029c1eac2SPetr Machata	local kind
18129c1eac2SPetr Machata
18229c1eac2SPetr Machata	RET=0
18329c1eac2SPetr Machata	with_qdiscs $handle $parent "$@" -- check_not_offloaded
18429c1eac2SPetr Machata	log_test $(get_name $parent "$@")" not offloaded"
18529c1eac2SPetr Machata}
18629c1eac2SPetr Machata
18729c1eac2SPetr Machatado_test_combinations()
18829c1eac2SPetr Machata{
18929c1eac2SPetr Machata	local handle=$1; shift
19029c1eac2SPetr Machata	local parent=$1; shift
19129c1eac2SPetr Machata
19229c1eac2SPetr Machata	local cont
19329c1eac2SPetr Machata	local leaf
19429c1eac2SPetr Machata	local fifo
19529c1eac2SPetr Machata
19629c1eac2SPetr Machata	for cont in "" ets prio; do
19729c1eac2SPetr Machata		for leaf in "" red tbf "red tbf" "tbf red"; do
19829c1eac2SPetr Machata			for fifo in "" pfifo bfifo; do
19929c1eac2SPetr Machata				if [[ -z "$cont$leaf$fifo" ]]; then
20029c1eac2SPetr Machata					continue
20129c1eac2SPetr Machata				fi
20229c1eac2SPetr Machata				do_test_offloaded $handle $parent \
20329c1eac2SPetr Machata						  $cont $leaf $fifo
20429c1eac2SPetr Machata			done
20529c1eac2SPetr Machata		done
20629c1eac2SPetr Machata	done
20729c1eac2SPetr Machata
20829c1eac2SPetr Machata	for cont in ets prio; do
20929c1eac2SPetr Machata		for leaf in red tbf; do
21029c1eac2SPetr Machata			do_test_nooffload $handle $parent $cont red tbf $leaf
21129c1eac2SPetr Machata			do_test_nooffload $handle $parent $cont tbf red $leaf
21229c1eac2SPetr Machata		done
21329c1eac2SPetr Machata		for leaf in "red red" "tbf tbf"; do
21429c1eac2SPetr Machata			do_test_nooffload $handle $parent $cont $leaf
21529c1eac2SPetr Machata		done
21629c1eac2SPetr Machata	done
21729c1eac2SPetr Machata
21829c1eac2SPetr Machata	do_test_nooffload $handle $parent drr
21929c1eac2SPetr Machata}
22029c1eac2SPetr Machata
22129c1eac2SPetr Machatatest_root()
22229c1eac2SPetr Machata{
22329c1eac2SPetr Machata	do_test_combinations 1 0
22429c1eac2SPetr Machata}
22529c1eac2SPetr Machata
226*3d5290eaSPetr Machatatest_port_tbf()
227*3d5290eaSPetr Machata{
228*3d5290eaSPetr Machata	with_tbf 1: root \
229*3d5290eaSPetr Machata		do_test_combinations 8 1
230*3d5290eaSPetr Machata}
231*3d5290eaSPetr Machata
23229c1eac2SPetr Machatado_test_etsprio()
23329c1eac2SPetr Machata{
23429c1eac2SPetr Machata	local parent=$1; shift
23529c1eac2SPetr Machata	local tbfpfx=$1; shift
23629c1eac2SPetr Machata	local cont
23729c1eac2SPetr Machata
23829c1eac2SPetr Machata	for cont in ets prio; do
23929c1eac2SPetr Machata		RET=0
24029c1eac2SPetr Machata		with_$cont 8: "$parent" \
24129c1eac2SPetr Machata			with_red 11: "parent 8:1" \
24229c1eac2SPetr Machata			with_red 12: "parent 8:2" \
24329c1eac2SPetr Machata			with_tbf 13: "parent 8:3" \
24429c1eac2SPetr Machata			with_tbf 14: "parent 8:4" \
24529c1eac2SPetr Machata			check_all_offloaded
24629c1eac2SPetr Machata		log_test "root$tbfpfx-ETS-{RED,TBF} offloaded"
24729c1eac2SPetr Machata
24829c1eac2SPetr Machata		RET=0
24929c1eac2SPetr Machata		with_$cont 8: "$parent" \
25029c1eac2SPetr Machata			with_red 81: "parent 8:1" \
25129c1eac2SPetr Machata				with_tbf 811: "parent 81:1" \
25229c1eac2SPetr Machata			with_tbf 84: "parent 8:4" \
25329c1eac2SPetr Machata				with_red 841: "parent 84:1" \
25429c1eac2SPetr Machata			check_all_offloaded
25529c1eac2SPetr Machata		log_test "root$tbfpfx-ETS-{RED-TBF,TBF-RED} offloaded"
25629c1eac2SPetr Machata
25729c1eac2SPetr Machata		RET=0
25829c1eac2SPetr Machata		with_$cont 8: "$parent" \
25929c1eac2SPetr Machata			with_red 81: "parent 8:1" \
26029c1eac2SPetr Machata				with_tbf 811: "parent 81:1" \
26129c1eac2SPetr Machata					with_bfifo 8111: "parent 811:1" \
26229c1eac2SPetr Machata			with_tbf 82: "parent 8:2" \
26329c1eac2SPetr Machata				with_red 821: "parent 82:1" \
26429c1eac2SPetr Machata					with_bfifo 8211: "parent 821:1" \
26529c1eac2SPetr Machata			check_all_offloaded
26629c1eac2SPetr Machata		log_test "root$tbfpfx-ETS-{RED-TBF-bFIFO,TBF-RED-bFIFO} offloaded"
26729c1eac2SPetr Machata	done
26829c1eac2SPetr Machata}
26929c1eac2SPetr Machata
27029c1eac2SPetr Machatatest_etsprio()
27129c1eac2SPetr Machata{
27229c1eac2SPetr Machata	do_test_etsprio root ""
27329c1eac2SPetr Machata}
27429c1eac2SPetr Machata
275*3d5290eaSPetr Machatatest_etsprio_port_tbf()
276*3d5290eaSPetr Machata{
277*3d5290eaSPetr Machata	with_tbf 1: root \
278*3d5290eaSPetr Machata		do_test_etsprio "parent 1:1" "-TBF"
279*3d5290eaSPetr Machata}
280*3d5290eaSPetr Machata
28129c1eac2SPetr Machatacleanup()
28229c1eac2SPetr Machata{
28329c1eac2SPetr Machata	tc qdisc del dev $h1 root &>/dev/null
28429c1eac2SPetr Machata}
28529c1eac2SPetr Machata
28629c1eac2SPetr Machatatrap cleanup EXIT
28729c1eac2SPetr Machatah1=${NETIFS[p1]}
28829c1eac2SPetr Machatatests_run
28929c1eac2SPetr Machata
29029c1eac2SPetr Machataexit $EXIT_STATUS
291