~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/drivers/net/mlxsw/qos_ets_strict.sh

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #!/bin/bash
  2 # SPDX-License-Identifier: GPL-2.0
  3 #
  4 # A test for strict prioritization of traffic in the switch. Run two streams of
  5 # traffic, each through a different ingress port, one tagged with PCP of 1, the
  6 # other with PCP of 2. Both streams converge at one egress port, where they are
  7 # assigned TC of, respectively, 1 and 2, with strict priority configured between
  8 # them. In H3, we expect to see (almost) exclusively the high-priority traffic.
  9 #
 10 # Please see qos_mc_aware.sh for an explanation of why we use mausezahn and
 11 # counters instead of just running iperf3.
 12 #
 13 # +---------------------------+                 +-----------------------------+
 14 # | H1                        |                 |                          H2 |
 15 # |         $h1.111 +         |                 |         + $h2.222           |
 16 # |   192.0.2.33/28 |         |                 |         | 192.0.2.65/28     |
 17 # |   e-qos-map 0:1 |         |                 |         | e-qos-map 0:2     |
 18 # |                 |         |                 |         |                   |
 19 # |             $h1 +         |                 |         + $h2               |
 20 # +-----------------|---------+                 +---------|-------------------+
 21 #                   |                                     |
 22 # +-----------------|-------------------------------------|-------------------+
 23 # |           $swp1 +                                     + $swp2             |
 24 # |          >1Gbps |                                     | >1Gbps            |
 25 # | +---------------|-----------+              +----------|----------------+  |
 26 # | |     $swp1.111 +           |              |          + $swp2.222      |  |
 27 # | |                     BR111 |       SW     | BR222                     |  |
 28 # | |     $swp3.111 +           |              |          + $swp3.222      |  |
 29 # | +---------------|-----------+              +----------|----------------+  |
 30 # |                 \_____________________________________/                   |
 31 # |                                    |                                      |
 32 # |                                    + $swp3                                |
 33 # |                                    | 1Gbps bottleneck                     |
 34 # |                                    | ETS: (up n->tc n for n in 0..7)      |
 35 # |                                    |      strict priority                 |
 36 # +------------------------------------|--------------------------------------+
 37 #                                      |
 38 #                 +--------------------|--------------------+
 39 #                 |                    + $h3             H3 |
 40 #                 |                   / \                   |
 41 #                 |                  /   \                  |
 42 #                 |         $h3.111 +     + $h3.222         |
 43 #                 |  192.0.2.34/28          192.0.2.66/28   |
 44 #                 +-----------------------------------------+
 45 
 46 ALL_TESTS="
 47         ping_ipv4
 48         test_ets_strict
 49 "
 50 
 51 lib_dir=$(dirname $0)/../../../net/forwarding
 52 
 53 NUM_NETIFS=6
 54 source $lib_dir/lib.sh
 55 source $lib_dir/devlink_lib.sh
 56 source qos_lib.sh
 57 
 58 h1_create()
 59 {
 60         simple_if_init $h1
 61         mtu_set $h1 10000
 62 
 63         vlan_create $h1 111 v$h1 192.0.2.33/28
 64         ip link set dev $h1.111 type vlan egress-qos-map 0:1
 65 }
 66 
 67 h1_destroy()
 68 {
 69         vlan_destroy $h1 111
 70 
 71         mtu_restore $h1
 72         simple_if_fini $h1
 73 }
 74 
 75 h2_create()
 76 {
 77         simple_if_init $h2
 78         mtu_set $h2 10000
 79 
 80         vlan_create $h2 222 v$h2 192.0.2.65/28
 81         ip link set dev $h2.222 type vlan egress-qos-map 0:2
 82 }
 83 
 84 h2_destroy()
 85 {
 86         vlan_destroy $h2 222
 87 
 88         mtu_restore $h2
 89         simple_if_fini $h2
 90 }
 91 
 92 h3_create()
 93 {
 94         simple_if_init $h3
 95         mtu_set $h3 10000
 96 
 97         vlan_create $h3 111 v$h3 192.0.2.34/28
 98         vlan_create $h3 222 v$h3 192.0.2.66/28
 99 }
100 
101 h3_destroy()
102 {
103         vlan_destroy $h3 222
104         vlan_destroy $h3 111
105 
106         mtu_restore $h3
107         simple_if_fini $h3
108 }
109 
110 switch_create()
111 {
112         ip link set dev $swp1 up
113         mtu_set $swp1 10000
114 
115         ip link set dev $swp2 up
116         mtu_set $swp2 10000
117 
118         # prio n -> TC n, strict scheduling
119         lldptool -T -i $swp3 -V ETS-CFG up2tc=0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7
120         lldptool -T -i $swp3 -V ETS-CFG tsa=$(
121                         )"0:strict,"$(
122                         )"1:strict,"$(
123                         )"2:strict,"$(
124                         )"3:strict,"$(
125                         )"4:strict,"$(
126                         )"5:strict,"$(
127                         )"6:strict,"$(
128                         )"7:strict"
129         sleep 1
130 
131         ip link set dev $swp3 up
132         mtu_set $swp3 10000
133         tc qdisc replace dev $swp3 root handle 101: tbf rate 1gbit \
134                 burst 128K limit 1G
135 
136         vlan_create $swp1 111
137         vlan_create $swp2 222
138         vlan_create $swp3 111
139         vlan_create $swp3 222
140 
141         ip link add name br111 type bridge vlan_filtering 0
142         ip link set dev br111 addrgenmode none
143         ip link set dev br111 up
144         ip link set dev $swp1.111 master br111
145         ip link set dev $swp3.111 master br111
146 
147         ip link add name br222 type bridge vlan_filtering 0
148         ip link set dev br222 addrgenmode none
149         ip link set dev br222 up
150         ip link set dev $swp2.222 master br222
151         ip link set dev $swp3.222 master br222
152 
153         # Make sure that ingress quotas are smaller than egress so that there is
154         # room for both streams of traffic to be admitted to shared buffer.
155         devlink_pool_size_thtype_save 0
156         devlink_pool_size_thtype_set 0 dynamic 10000000
157         devlink_pool_size_thtype_save 4
158         devlink_pool_size_thtype_set 4 dynamic 10000000
159 
160         devlink_port_pool_th_save $swp1 0
161         devlink_port_pool_th_set $swp1 0 6
162         devlink_tc_bind_pool_th_save $swp1 1 ingress
163         devlink_tc_bind_pool_th_set $swp1 1 ingress 0 6
164 
165         devlink_port_pool_th_save $swp2 0
166         devlink_port_pool_th_set $swp2 0 6
167         devlink_tc_bind_pool_th_save $swp2 2 ingress
168         devlink_tc_bind_pool_th_set $swp2 2 ingress 0 6
169 
170         devlink_tc_bind_pool_th_save $swp3 1 egress
171         devlink_tc_bind_pool_th_set $swp3 1 egress 4 7
172         devlink_tc_bind_pool_th_save $swp3 2 egress
173         devlink_tc_bind_pool_th_set $swp3 2 egress 4 7
174         devlink_port_pool_th_save $swp3 4
175         devlink_port_pool_th_set $swp3 4 7
176 }
177 
178 switch_destroy()
179 {
180         devlink_port_pool_th_restore $swp3 4
181         devlink_tc_bind_pool_th_restore $swp3 2 egress
182         devlink_tc_bind_pool_th_restore $swp3 1 egress
183 
184         devlink_tc_bind_pool_th_restore $swp2 2 ingress
185         devlink_port_pool_th_restore $swp2 0
186 
187         devlink_tc_bind_pool_th_restore $swp1 1 ingress
188         devlink_port_pool_th_restore $swp1 0
189 
190         devlink_pool_size_thtype_restore 4
191         devlink_pool_size_thtype_restore 0
192 
193         ip link del dev br222
194         ip link del dev br111
195 
196         vlan_destroy $swp3 222
197         vlan_destroy $swp3 111
198         vlan_destroy $swp2 222
199         vlan_destroy $swp1 111
200 
201         tc qdisc del dev $swp3 root handle 101:
202         mtu_restore $swp3
203         ip link set dev $swp3 down
204         lldptool -T -i $swp3 -V ETS-CFG up2tc=0:0,1:0,2:0,3:0,4:0,5:0,6:0,7:0
205 
206         mtu_restore $swp2
207         ip link set dev $swp2 down
208 
209         mtu_restore $swp1
210         ip link set dev $swp1 down
211 }
212 
213 setup_prepare()
214 {
215         h1=${NETIFS[p1]}
216         swp1=${NETIFS[p2]}
217 
218         swp2=${NETIFS[p3]}
219         h2=${NETIFS[p4]}
220 
221         swp3=${NETIFS[p5]}
222         h3=${NETIFS[p6]}
223 
224         h3mac=$(mac_get $h3)
225 
226         vrf_prepare
227 
228         h1_create
229         h2_create
230         h3_create
231         switch_create
232 }
233 
234 cleanup()
235 {
236         pre_cleanup
237 
238         switch_destroy
239         h3_destroy
240         h2_destroy
241         h1_destroy
242 
243         vrf_cleanup
244 }
245 
246 ping_ipv4()
247 {
248         ping_test $h1 192.0.2.34 " from H1"
249         ping_test $h2 192.0.2.66 " from H2"
250 }
251 
252 rel()
253 {
254         local old=$1; shift
255         local new=$1; shift
256 
257         bc <<< "
258             scale=2
259             ret = 100 * $new / $old
260             if (ret > 0) { ret } else { 0 }
261         "
262 }
263 
264 test_ets_strict()
265 {
266         RET=0
267 
268         # Run high-prio traffic on its own.
269         start_traffic $h2.222 192.0.2.65 192.0.2.66 $h3mac
270         local -a rate_2
271         rate_2=($(measure_rate $swp2 $h3 rx_octets_prio_2 "prio 2"))
272         check_err $? "Could not get high enough prio-2 ingress rate"
273         local rate_2_in=${rate_2[0]}
274         local rate_2_eg=${rate_2[1]}
275         stop_traffic # $h2.222
276 
277         # Start low-prio stream.
278         start_traffic $h1.111 192.0.2.33 192.0.2.34 $h3mac
279 
280         local -a rate_1
281         rate_1=($(measure_rate $swp1 $h3 rx_octets_prio_1 "prio 1"))
282         check_err $? "Could not get high enough prio-1 ingress rate"
283         local rate_1_in=${rate_1[0]}
284         local rate_1_eg=${rate_1[1]}
285 
286         # High-prio and low-prio on their own should have about the same
287         # throughput.
288         local rel21=$(rel $rate_1_eg $rate_2_eg)
289         check_err $(bc <<< "$rel21 < 95")
290         check_err $(bc <<< "$rel21 > 105")
291 
292         # Start the high-prio stream--now both streams run.
293         start_traffic $h2.222 192.0.2.65 192.0.2.66 $h3mac
294         rate_3=($(measure_rate $swp2 $h3 rx_octets_prio_2 "prio 2 w/ 1"))
295         check_err $? "Could not get high enough prio-2 ingress rate with prio-1"
296         local rate_3_in=${rate_3[0]}
297         local rate_3_eg=${rate_3[1]}
298         stop_traffic # $h2.222
299 
300         stop_traffic # $h1.111
301 
302         # High-prio should have about the same throughput whether or not
303         # low-prio is in the system.
304         local rel32=$(rel $rate_2_eg $rate_3_eg)
305         check_err $(bc <<< "$rel32 < 95")
306 
307         log_test "strict priority"
308         echo "Ingress to switch:"
309         echo "  p1 in rate            $(humanize $rate_1_in)"
310         echo "  p2 in rate            $(humanize $rate_2_in)"
311         echo "  p2 in rate w/ p1      $(humanize $rate_3_in)"
312         echo "Egress from switch:"
313         echo "  p1 eg rate            $(humanize $rate_1_eg)"
314         echo "  p2 eg rate            $(humanize $rate_2_eg) ($rel21% of p1)"
315         echo "  p2 eg rate w/ p1      $(humanize $rate_3_eg) ($rel32% of p2)"
316 }
317 
318 trap cleanup EXIT
319 
320 setup_prepare
321 setup_wait
322 
323 tests_run
324 
325 exit $EXIT_STATUS

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php