aboutsummaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/drivers/net/mlxsw/sch_red_ets.sh
blob: 7a73057206cd090af039462be7c8e43bcc37a317 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#!/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
}

bail_on_lldpad

trap cleanup EXIT
setup_prepare
setup_wait
tests_run

exit $EXIT_STATUS