| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| ALL_TESTS=" |
| ping_ipv4 |
| ecn_test |
| ecn_test_perband |
| ecn_nodrop_test |
| red_test |
| mc_backlog_test |
| red_mirror_test |
| red_trap_test |
| ecn_mirror_test |
| " |
| : ${QDISC:=ets} |
| source sch_red_core.sh |
| |
| # do_ecn_test first build 2/3 of the requested backlog and expects no marking, |
| # and then builds 3/2 of it and does expect marking. The values of $BACKLOG1 and |
| # $BACKLOG2 are far enough not to overlap, so that we can assume that if we do |
| # see (do not see) marking, it is actually due to the configuration of that one |
| # TC, and not due to configuration of the other TC leaking over. |
| BACKLOG1=200000 |
| BACKLOG2=500000 |
| |
| install_root_qdisc() |
| { |
| tc qdisc add dev $swp3 root handle 10: $QDISC \ |
| bands 8 priomap 7 6 5 4 3 2 1 0 |
| } |
| |
| install_qdisc_tc0() |
| { |
| local -a args=("$@") |
| |
| tc qdisc add dev $swp3 parent 10:8 handle 108: red \ |
| limit 1000000 min $BACKLOG1 max $((BACKLOG1 + 1)) \ |
| probability 1.0 avpkt 8000 burst 38 "${args[@]}" |
| } |
| |
| install_qdisc_tc1() |
| { |
| local -a args=("$@") |
| |
| tc qdisc add dev $swp3 parent 10:7 handle 107: red \ |
| limit 1000000 min $BACKLOG2 max $((BACKLOG2 + 1)) \ |
| probability 1.0 avpkt 8000 burst 63 "${args[@]}" |
| } |
| |
| install_qdisc() |
| { |
| install_root_qdisc |
| install_qdisc_tc0 "$@" |
| install_qdisc_tc1 "$@" |
| sleep 1 |
| } |
| |
| uninstall_qdisc_tc0() |
| { |
| tc qdisc del dev $swp3 parent 10:8 |
| } |
| |
| uninstall_qdisc_tc1() |
| { |
| tc qdisc del dev $swp3 parent 10:7 |
| } |
| |
| uninstall_root_qdisc() |
| { |
| tc qdisc del dev $swp3 root |
| } |
| |
| uninstall_qdisc() |
| { |
| uninstall_qdisc_tc0 |
| uninstall_qdisc_tc1 |
| uninstall_root_qdisc |
| } |
| |
| ecn_test() |
| { |
| install_qdisc ecn |
| |
| do_ecn_test 10 $BACKLOG1 |
| do_ecn_test 11 $BACKLOG2 |
| |
| uninstall_qdisc |
| } |
| |
| ecn_test_perband() |
| { |
| install_qdisc ecn |
| |
| do_ecn_test_perband 10 $BACKLOG1 |
| do_ecn_test_perband 11 $BACKLOG2 |
| |
| uninstall_qdisc |
| } |
| |
| ecn_nodrop_test() |
| { |
| install_qdisc ecn nodrop |
| |
| do_ecn_nodrop_test 10 $BACKLOG1 |
| do_ecn_nodrop_test 11 $BACKLOG2 |
| |
| uninstall_qdisc |
| } |
| |
| red_test() |
| { |
| install_qdisc |
| |
| # Make sure that we get the non-zero value if there is any. |
| local cur=$(busywait 1100 until_counter_is "> 0" \ |
| qdisc_stats_get $swp3 10: .backlog) |
| (( cur == 0 )) |
| check_err $? "backlog of $cur observed on non-busy qdisc" |
| log_test "$QDISC backlog properly cleaned" |
| |
| do_red_test 10 $BACKLOG1 |
| do_red_test 11 $BACKLOG2 |
| |
| uninstall_qdisc |
| } |
| |
| mc_backlog_test() |
| { |
| install_qdisc |
| |
| # Note that the backlog numbers here do not correspond to RED |
| # configuration, but are arbitrary. |
| do_mc_backlog_test 10 $BACKLOG1 |
| do_mc_backlog_test 11 $BACKLOG2 |
| |
| uninstall_qdisc |
| } |
| |
| red_mirror_test() |
| { |
| install_qdisc qevent early_drop block 10 |
| |
| do_drop_mirror_test 10 $BACKLOG1 early_drop |
| do_drop_mirror_test 11 $BACKLOG2 early_drop |
| |
| uninstall_qdisc |
| } |
| |
| red_trap_test() |
| { |
| install_qdisc qevent early_drop block 10 |
| |
| do_drop_trap_test 10 $BACKLOG1 early_drop |
| do_drop_trap_test 11 $BACKLOG2 early_drop |
| |
| uninstall_qdisc |
| } |
| |
| ecn_mirror_test() |
| { |
| install_qdisc ecn qevent mark block 10 |
| |
| do_mark_mirror_test 10 $BACKLOG1 |
| do_mark_mirror_test 11 $BACKLOG2 |
| |
| uninstall_qdisc |
| } |
| |
| trap cleanup EXIT |
| |
| setup_prepare |
| setup_wait |
| |
| bail_on_lldpad |
| tests_run |
| |
| exit $EXIT_STATUS |