Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/testing/selftests/drivers/net/ocelot/basic_qos.sh
26298 views
1
#!/bin/bash
2
# SPDX-License-Identifier: GPL-2.0
3
# Copyright 2022 NXP
4
5
# The script is mostly generic, with the exception of the
6
# ethtool per-TC counter names ("rx_green_prio_${tc}")
7
8
WAIT_TIME=1
9
NUM_NETIFS=4
10
STABLE_MAC_ADDRS=yes
11
NETIF_CREATE=no
12
lib_dir=$(dirname $0)/../../../net/forwarding
13
source $lib_dir/tc_common.sh
14
source $lib_dir/lib.sh
15
16
require_command dcb
17
18
h1=${NETIFS[p1]}
19
swp1=${NETIFS[p2]}
20
swp2=${NETIFS[p3]}
21
h2=${NETIFS[p4]}
22
23
H1_IPV4="192.0.2.1"
24
H2_IPV4="192.0.2.2"
25
H1_IPV6="2001:db8:1::1"
26
H2_IPV6="2001:db8:1::2"
27
28
h1_create()
29
{
30
simple_if_init $h1 $H1_IPV4/24 $H1_IPV6/64
31
}
32
33
h1_destroy()
34
{
35
simple_if_fini $h1 $H1_IPV4/24 $H1_IPV6/64
36
}
37
38
h2_create()
39
{
40
simple_if_init $h2 $H2_IPV4/24 $H2_IPV6/64
41
}
42
43
h2_destroy()
44
{
45
simple_if_fini $h2 $H2_IPV4/24 $H2_IPV6/64
46
}
47
48
h1_vlan_create()
49
{
50
local vid=$1
51
52
vlan_create $h1 $vid
53
simple_if_init $h1.$vid $H1_IPV4/24 $H1_IPV6/64
54
ip link set $h1.$vid type vlan \
55
egress-qos-map 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7 \
56
ingress-qos-map 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7
57
}
58
59
h1_vlan_destroy()
60
{
61
local vid=$1
62
63
simple_if_fini $h1.$vid $H1_IPV4/24 $H1_IPV6/64
64
vlan_destroy $h1 $vid
65
}
66
67
h2_vlan_create()
68
{
69
local vid=$1
70
71
vlan_create $h2 $vid
72
simple_if_init $h2.$vid $H2_IPV4/24 $H2_IPV6/64
73
ip link set $h2.$vid type vlan \
74
egress-qos-map 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7 \
75
ingress-qos-map 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7
76
}
77
78
h2_vlan_destroy()
79
{
80
local vid=$1
81
82
simple_if_fini $h2.$vid $H2_IPV4/24 $H2_IPV6/64
83
vlan_destroy $h2 $vid
84
}
85
86
vlans_prepare()
87
{
88
h1_vlan_create 100
89
h2_vlan_create 100
90
91
tc qdisc add dev ${h1}.100 clsact
92
tc filter add dev ${h1}.100 egress protocol ipv4 \
93
flower ip_proto icmp action skbedit priority 3
94
tc filter add dev ${h1}.100 egress protocol ipv6 \
95
flower ip_proto icmpv6 action skbedit priority 3
96
}
97
98
vlans_destroy()
99
{
100
tc qdisc del dev ${h1}.100 clsact
101
102
h1_vlan_destroy 100
103
h2_vlan_destroy 100
104
}
105
106
switch_create()
107
{
108
ip link set ${swp1} up
109
ip link set ${swp2} up
110
111
# Ports should trust VLAN PCP even with vlan_filtering=0
112
ip link add br0 type bridge
113
ip link set ${swp1} master br0
114
ip link set ${swp2} master br0
115
ip link set br0 up
116
}
117
118
switch_destroy()
119
{
120
ip link del br0
121
}
122
123
setup_prepare()
124
{
125
vrf_prepare
126
127
h1_create
128
h2_create
129
switch_create
130
}
131
132
cleanup()
133
{
134
pre_cleanup
135
136
h2_destroy
137
h1_destroy
138
switch_destroy
139
140
vrf_cleanup
141
}
142
143
dscp_cs_to_tos()
144
{
145
local dscp_cs=$1
146
147
# https://datatracker.ietf.org/doc/html/rfc2474
148
# 4.2.2.1 The Class Selector Codepoints
149
echo $((${dscp_cs} << 5))
150
}
151
152
run_test()
153
{
154
local test_name=$1; shift
155
local if_name=$1; shift
156
local tc=$1; shift
157
local tos=$1; shift
158
local counter_name="rx_green_prio_${tc}"
159
local ipv4_before
160
local ipv4_after
161
local ipv6_before
162
local ipv6_after
163
164
ipv4_before=$(ethtool_stats_get ${swp1} "${counter_name}")
165
ping_do ${if_name} $H2_IPV4 "-Q ${tos}"
166
ipv4_after=$(ethtool_stats_get ${swp1} "${counter_name}")
167
168
if [ $((${ipv4_after} - ${ipv4_before})) -lt ${PING_COUNT} ]; then
169
RET=1
170
else
171
RET=0
172
fi
173
log_test "IPv4 ${test_name}"
174
175
ipv6_before=$(ethtool_stats_get ${swp1} "${counter_name}")
176
ping_do ${if_name} $H2_IPV6 "-Q ${tos}"
177
ipv6_after=$(ethtool_stats_get ${swp1} "${counter_name}")
178
179
if [ $((${ipv6_after} - ${ipv6_before})) -lt ${PING_COUNT} ]; then
180
RET=1
181
else
182
RET=0
183
fi
184
log_test "IPv6 ${test_name}"
185
}
186
187
port_default_prio_get()
188
{
189
local if_name=$1
190
local prio
191
192
prio="$(dcb -j app show dev ${if_name} default-prio | \
193
jq '.default_prio[]')"
194
if [ -z "${prio}" ]; then
195
prio=0
196
fi
197
198
echo ${prio}
199
}
200
201
test_port_default()
202
{
203
local orig=$(port_default_prio_get ${swp1})
204
local dmac=$(mac_get ${h2})
205
206
dcb app replace dev ${swp1} default-prio 5
207
208
run_test "Port-default QoS classification" ${h1} 5 0
209
210
dcb app replace dev ${swp1} default-prio ${orig}
211
}
212
213
test_vlan_pcp()
214
{
215
vlans_prepare
216
217
run_test "Trusted VLAN PCP QoS classification" ${h1}.100 3 0
218
219
vlans_destroy
220
}
221
222
test_ip_dscp()
223
{
224
local port_default=$(port_default_prio_get ${swp1})
225
local tos=$(dscp_cs_to_tos 4)
226
227
dcb app add dev ${swp1} dscp-prio CS4:4
228
run_test "Trusted DSCP QoS classification" ${h1} 4 ${tos}
229
dcb app del dev ${swp1} dscp-prio CS4:4
230
231
vlans_prepare
232
run_test "Untrusted DSCP QoS classification follows VLAN PCP" \
233
${h1}.100 3 ${tos}
234
vlans_destroy
235
236
run_test "Untrusted DSCP QoS classification follows port default" \
237
${h1} ${port_default} ${tos}
238
}
239
240
trap cleanup EXIT
241
242
ALL_TESTS="
243
test_port_default
244
test_vlan_pcp
245
test_ip_dscp
246
"
247
248
setup_prepare
249
setup_wait
250
251
tests_run
252
253
exit $EXIT_STATUS
254
255