#!/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