| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- #!/bin/bash
- # SPDX-License-Identifier: GPL-2.0
- #
- # Test qdisc offload indication
- ALL_TESTS="
- test_root
- test_port_tbf
- test_etsprio
- test_etsprio_port_tbf
- "
- NUM_NETIFS=1
- lib_dir=$(dirname $0)/../../../net/forwarding
- source $lib_dir/lib.sh
- check_not_offloaded()
- {
- local handle=$1; shift
- local h
- local offloaded
- h=$(qdisc_stats_get $h1 "$handle" .handle)
- [[ $h == '"'$handle'"' ]]
- check_err $? "Qdisc with handle $handle does not exist"
- offloaded=$(qdisc_stats_get $h1 "$handle" .offloaded)
- [[ $offloaded == true ]]
- check_fail $? "Qdisc with handle $handle offloaded, but should not be"
- }
- check_all_offloaded()
- {
- local handle=$1; shift
- if [[ ! -z $handle ]]; then
- local offloaded=$(qdisc_stats_get $h1 "$handle" .offloaded)
- [[ $offloaded == true ]]
- check_err $? "Qdisc with handle $handle not offloaded"
- fi
- local unoffloaded=$(tc q sh dev $h1 invisible |
- grep -v offloaded |
- sed s/root/parent\ root/ |
- cut -d' ' -f 5)
- [[ -z $unoffloaded ]]
- check_err $? "Qdiscs with following parents not offloaded: $unoffloaded"
- pre_cleanup
- }
- with_ets()
- {
- local handle=$1; shift
- local locus=$1; shift
- tc qdisc add dev $h1 $locus handle $handle \
- ets bands 8 priomap 7 6 5 4 3 2 1 0
- "$@"
- tc qdisc del dev $h1 $locus
- }
- with_prio()
- {
- local handle=$1; shift
- local locus=$1; shift
- tc qdisc add dev $h1 $locus handle $handle \
- prio bands 8 priomap 7 6 5 4 3 2 1 0
- "$@"
- tc qdisc del dev $h1 $locus
- }
- with_red()
- {
- local handle=$1; shift
- local locus=$1; shift
- tc qdisc add dev $h1 $locus handle $handle \
- red limit 1000000 min 200000 max 300000 probability 0.5 avpkt 1500
- "$@"
- tc qdisc del dev $h1 $locus
- }
- with_tbf()
- {
- local handle=$1; shift
- local locus=$1; shift
- tc qdisc add dev $h1 $locus handle $handle \
- tbf rate 400Mbit burst 128K limit 1M
- "$@"
- tc qdisc del dev $h1 $locus
- }
- with_pfifo()
- {
- local handle=$1; shift
- local locus=$1; shift
- tc qdisc add dev $h1 $locus handle $handle pfifo limit 100K
- "$@"
- tc qdisc del dev $h1 $locus
- }
- with_bfifo()
- {
- local handle=$1; shift
- local locus=$1; shift
- tc qdisc add dev $h1 $locus handle $handle bfifo limit 100K
- "$@"
- tc qdisc del dev $h1 $locus
- }
- with_drr()
- {
- local handle=$1; shift
- local locus=$1; shift
- tc qdisc add dev $h1 $locus handle $handle drr
- "$@"
- tc qdisc del dev $h1 $locus
- }
- with_qdiscs()
- {
- local handle=$1; shift
- local parent=$1; shift
- local kind=$1; shift
- local next_handle=$((handle * 2))
- local locus;
- if [[ $kind == "--" ]]; then
- local cmd=$1; shift
- $cmd $(printf %x: $parent) "$@"
- else
- if ((parent == 0)); then
- locus=root
- else
- locus=$(printf "parent %x:1" $parent)
- fi
- with_$kind $(printf %x: $handle) "$locus" \
- with_qdiscs $next_handle $handle "$@"
- fi
- }
- get_name()
- {
- local parent=$1; shift
- local name=$(echo "" "${@^^}" | tr ' ' -)
- if ((parent != 0)); then
- kind=$(qdisc_stats_get $h1 $parent: .kind)
- kind=${kind%\"}
- kind=${kind#\"}
- name="-${kind^^}$name"
- fi
- echo root$name
- }
- do_test_offloaded()
- {
- local handle=$1; shift
- local parent=$1; shift
- RET=0
- with_qdiscs $handle $parent "$@" -- check_all_offloaded
- log_test $(get_name $parent "$@")" offloaded"
- }
- do_test_nooffload()
- {
- local handle=$1; shift
- local parent=$1; shift
- local name=$(echo "${@^^}" | tr ' ' -)
- local kind
- RET=0
- with_qdiscs $handle $parent "$@" -- check_not_offloaded
- log_test $(get_name $parent "$@")" not offloaded"
- }
- do_test_combinations()
- {
- local handle=$1; shift
- local parent=$1; shift
- local cont
- local leaf
- local fifo
- for cont in "" ets prio; do
- for leaf in "" red tbf "red tbf" "tbf red"; do
- for fifo in "" pfifo bfifo; do
- if [[ -z "$cont$leaf$fifo" ]]; then
- continue
- fi
- do_test_offloaded $handle $parent \
- $cont $leaf $fifo
- done
- done
- done
- for cont in ets prio; do
- for leaf in red tbf; do
- do_test_nooffload $handle $parent $cont red tbf $leaf
- do_test_nooffload $handle $parent $cont tbf red $leaf
- done
- for leaf in "red red" "tbf tbf"; do
- do_test_nooffload $handle $parent $cont $leaf
- done
- done
- do_test_nooffload $handle $parent drr
- }
- test_root()
- {
- do_test_combinations 1 0
- }
- test_port_tbf()
- {
- with_tbf 1: root \
- do_test_combinations 8 1
- }
- do_test_etsprio()
- {
- local parent=$1; shift
- local tbfpfx=$1; shift
- local cont
- for cont in ets prio; do
- RET=0
- with_$cont 8: "$parent" \
- with_red 11: "parent 8:1" \
- with_red 12: "parent 8:2" \
- with_tbf 13: "parent 8:3" \
- with_tbf 14: "parent 8:4" \
- check_all_offloaded
- log_test "root$tbfpfx-ETS-{RED,TBF} offloaded"
- RET=0
- with_$cont 8: "$parent" \
- with_red 81: "parent 8:1" \
- with_tbf 811: "parent 81:1" \
- with_tbf 84: "parent 8:4" \
- with_red 841: "parent 84:1" \
- check_all_offloaded
- log_test "root$tbfpfx-ETS-{RED-TBF,TBF-RED} offloaded"
- RET=0
- with_$cont 8: "$parent" \
- with_red 81: "parent 8:1" \
- with_tbf 811: "parent 81:1" \
- with_bfifo 8111: "parent 811:1" \
- with_tbf 82: "parent 8:2" \
- with_red 821: "parent 82:1" \
- with_bfifo 8211: "parent 821:1" \
- check_all_offloaded
- log_test "root$tbfpfx-ETS-{RED-TBF-bFIFO,TBF-RED-bFIFO} offloaded"
- done
- }
- test_etsprio()
- {
- do_test_etsprio root ""
- }
- test_etsprio_port_tbf()
- {
- with_tbf 1: root \
- do_test_etsprio "parent 1:1" "-TBF"
- }
- cleanup()
- {
- tc qdisc del dev $h1 root &>/dev/null
- }
- trap cleanup EXIT
- h1=${NETIFS[p1]}
- tests_run
- exit $EXIT_STATUS
|