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

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/drivers/net/hw/hw_stats_l3.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 # +--------------------+                     +----------------------+
  5 # | H1                 |                     |                   H2 |
  6 # |                    |                     |                      |
  7 # |          $h1.200 + |                     | + $h2.200            |
  8 # |     192.0.2.1/28 | |                     | | 192.0.2.18/28      |
  9 # | 2001:db8:1::1/64 | |                     | | 2001:db8:2::1/64   |
 10 # |                  | |                     | |                    |
 11 # |              $h1 + |                     | + $h2                |
 12 # |                  | |                     | |                    |
 13 # +------------------|-+                     +-|--------------------+
 14 #                    |                         |
 15 # +------------------|-------------------------|--------------------+
 16 # | SW               |                         |                    |
 17 # |                  |                         |                    |
 18 # |             $rp1 +                         + $rp2               |
 19 # |                  |                         |                    |
 20 # |         $rp1.200 +                         + $rp2.200           |
 21 # |     192.0.2.2/28                             192.0.2.17/28      |
 22 # | 2001:db8:1::2/64                             2001:db8:2::2/64   |
 23 # |                                                                 |
 24 # +-----------------------------------------------------------------+
 25 
 26 ALL_TESTS="
 27         ping_ipv4
 28         ping_ipv6
 29         test_stats_rx_ipv4
 30         test_stats_tx_ipv4
 31         test_stats_rx_ipv6
 32         test_stats_tx_ipv6
 33         respin_enablement
 34         test_stats_rx_ipv4
 35         test_stats_tx_ipv4
 36         test_stats_rx_ipv6
 37         test_stats_tx_ipv6
 38         reapply_config
 39         ping_ipv4
 40         ping_ipv6
 41         test_stats_rx_ipv4
 42         test_stats_tx_ipv4
 43         test_stats_rx_ipv6
 44         test_stats_tx_ipv6
 45         test_stats_report_rx
 46         test_stats_report_tx
 47         test_destroy_enabled
 48         test_double_enable
 49 "
 50 NUM_NETIFS=4
 51 lib_dir=$(dirname "$0")
 52 source "$lib_dir"/../../../net/forwarding/lib.sh
 53 source "$lib_dir"/../../../net/forwarding/tc_common.sh
 54 
 55 h1_create()
 56 {
 57         simple_if_init $h1
 58         vlan_create $h1 200 v$h1 192.0.2.1/28 2001:db8:1::1/64
 59         ip route add 192.0.2.16/28 vrf v$h1 nexthop via 192.0.2.2
 60         ip -6 route add 2001:db8:2::/64 vrf v$h1 nexthop via 2001:db8:1::2
 61 }
 62 
 63 h1_destroy()
 64 {
 65         ip -6 route del 2001:db8:2::/64 vrf v$h1 nexthop via 2001:db8:1::2
 66         ip route del 192.0.2.16/28 vrf v$h1 nexthop via 192.0.2.2
 67         vlan_destroy $h1 200
 68         simple_if_fini $h1
 69 }
 70 
 71 h2_create()
 72 {
 73         simple_if_init $h2
 74         vlan_create $h2 200 v$h2 192.0.2.18/28 2001:db8:2::1/64
 75         ip route add 192.0.2.0/28 vrf v$h2 nexthop via 192.0.2.17
 76         ip -6 route add 2001:db8:1::/64 vrf v$h2 nexthop via 2001:db8:2::2
 77 }
 78 
 79 h2_destroy()
 80 {
 81         ip -6 route del 2001:db8:1::/64 vrf v$h2 nexthop via 2001:db8:2::2
 82         ip route del 192.0.2.0/28 vrf v$h2 nexthop via 192.0.2.17
 83         vlan_destroy $h2 200
 84         simple_if_fini $h2
 85 }
 86 
 87 router_rp1_200_create()
 88 {
 89         ip link add name $rp1.200 link $rp1 type vlan id 200
 90         ip link set dev $rp1.200 addrgenmode eui64
 91         ip link set dev $rp1.200 up
 92         ip address add dev $rp1.200 192.0.2.2/28
 93         ip address add dev $rp1.200 2001:db8:1::2/64
 94         ip stats set dev $rp1.200 l3_stats on
 95 }
 96 
 97 router_rp1_200_destroy()
 98 {
 99         ip stats set dev $rp1.200 l3_stats off
100         ip address del dev $rp1.200 2001:db8:1::2/64
101         ip address del dev $rp1.200 192.0.2.2/28
102         ip link del dev $rp1.200
103 }
104 
105 router_create()
106 {
107         ip link set dev $rp1 up
108         router_rp1_200_create
109 
110         ip link set dev $rp2 up
111         vlan_create $rp2 200 "" 192.0.2.17/28 2001:db8:2::2/64
112 }
113 
114 router_destroy()
115 {
116         vlan_destroy $rp2 200
117         ip link set dev $rp2 down
118 
119         router_rp1_200_destroy
120         ip link set dev $rp1 down
121 }
122 
123 setup_prepare()
124 {
125         h1=${NETIFS[p1]}
126         rp1=${NETIFS[p2]}
127 
128         rp2=${NETIFS[p3]}
129         h2=${NETIFS[p4]}
130 
131         rp1mac=$(mac_get $rp1)
132         rp2mac=$(mac_get $rp2)
133 
134         vrf_prepare
135 
136         h1_create
137         h2_create
138 
139         router_create
140 
141         forwarding_enable
142 }
143 
144 cleanup()
145 {
146         pre_cleanup
147 
148         forwarding_restore
149 
150         router_destroy
151 
152         h2_destroy
153         h1_destroy
154 
155         vrf_cleanup
156 }
157 
158 ping_ipv4()
159 {
160         ping_test $h1.200 192.0.2.18 " IPv4"
161 }
162 
163 ping_ipv6()
164 {
165         ping_test $h1.200 2001:db8:2::1 " IPv6"
166 }
167 
168 send_packets_rx_ipv4()
169 {
170         # Send 21 packets instead of 20, because the first one might trap and go
171         # through the SW datapath, which might not bump the HW counter.
172         $MZ $h1.200 -c 21 -d 20msec -p 100 \
173             -a own -b $rp1mac -A 192.0.2.1 -B 192.0.2.18 \
174             -q -t udp sp=54321,dp=12345
175 }
176 
177 send_packets_rx_ipv6()
178 {
179         $MZ $h1.200 -6 -c 21 -d 20msec -p 100 \
180             -a own -b $rp1mac -A 2001:db8:1::1 -B 2001:db8:2::1 \
181             -q -t udp sp=54321,dp=12345
182 }
183 
184 send_packets_tx_ipv4()
185 {
186         $MZ $h2.200 -c 21 -d 20msec -p 100 \
187             -a own -b $rp2mac -A 192.0.2.18 -B 192.0.2.1 \
188             -q -t udp sp=54321,dp=12345
189 }
190 
191 send_packets_tx_ipv6()
192 {
193         $MZ $h2.200 -6 -c 21 -d 20msec -p 100 \
194             -a own -b $rp2mac -A 2001:db8:2::1 -B 2001:db8:1::1 \
195             -q -t udp sp=54321,dp=12345
196 }
197 
198 ___test_stats()
199 {
200         local dir=$1; shift
201         local prot=$1; shift
202 
203         local a
204         local b
205 
206         a=$(hw_stats_get l3_stats $rp1.200 ${dir} packets)
207         send_packets_${dir}_${prot}
208         "$@"
209         b=$(busywait "$TC_HIT_TIMEOUT" until_counter_is ">= $a + 20" \
210                        hw_stats_get l3_stats $rp1.200 ${dir} packets)
211         check_err $? "Traffic not reflected in the counter: $a -> $b"
212 }
213 
214 __test_stats()
215 {
216         local dir=$1; shift
217         local prot=$1; shift
218 
219         RET=0
220         ___test_stats "$dir" "$prot"
221         log_test "Test $dir packets: $prot"
222 }
223 
224 test_stats_rx_ipv4()
225 {
226         __test_stats rx ipv4
227 }
228 
229 test_stats_tx_ipv4()
230 {
231         __test_stats tx ipv4
232 }
233 
234 test_stats_rx_ipv6()
235 {
236         __test_stats rx ipv6
237 }
238 
239 test_stats_tx_ipv6()
240 {
241         __test_stats tx ipv6
242 }
243 
244 # Make sure everything works well even after stats have been disabled and
245 # reenabled on the same device without touching the L3 configuration.
246 respin_enablement()
247 {
248         log_info "Turning stats off and on again"
249         ip stats set dev $rp1.200 l3_stats off
250         ip stats set dev $rp1.200 l3_stats on
251 }
252 
253 # For the initial run, l3_stats is enabled on a completely set up netdevice. Now
254 # do it the other way around: enabling the L3 stats on an L2 netdevice, and only
255 # then apply the L3 configuration.
256 reapply_config()
257 {
258         log_info "Reapplying configuration"
259 
260         router_rp1_200_destroy
261 
262         ip link add name $rp1.200 link $rp1 type vlan id 200
263         ip link set dev $rp1.200 addrgenmode none
264         ip stats set dev $rp1.200 l3_stats on
265         ip link set dev $rp1.200 addrgenmode eui64
266         ip link set dev $rp1.200 up
267         ip address add dev $rp1.200 192.0.2.2/28
268         ip address add dev $rp1.200 2001:db8:1::2/64
269 }
270 
271 __test_stats_report()
272 {
273         local dir=$1; shift
274         local prot=$1; shift
275 
276         local a
277         local b
278 
279         RET=0
280 
281         a=$(hw_stats_get l3_stats $rp1.200 ${dir} packets)
282         send_packets_${dir}_${prot}
283         ip address flush dev $rp1.200
284         b=$(busywait "$TC_HIT_TIMEOUT" until_counter_is ">= $a + 20" \
285                        hw_stats_get l3_stats $rp1.200 ${dir} packets)
286         check_err $? "Traffic not reflected in the counter: $a -> $b"
287         log_test "Test ${dir} packets: stats pushed on loss of L3"
288 
289         ip stats set dev $rp1.200 l3_stats off
290         ip link del dev $rp1.200
291         router_rp1_200_create
292 }
293 
294 test_stats_report_rx()
295 {
296         __test_stats_report rx ipv4
297 }
298 
299 test_stats_report_tx()
300 {
301         __test_stats_report tx ipv4
302 }
303 
304 test_destroy_enabled()
305 {
306         RET=0
307 
308         ip link del dev $rp1.200
309         router_rp1_200_create
310 
311         log_test "Destroy l3_stats-enabled netdev"
312 }
313 
314 test_double_enable()
315 {
316         RET=0
317         ___test_stats rx ipv4 \
318                 ip stats set dev $rp1.200 l3_stats on
319         log_test "Test stat retention across a spurious enablement"
320 }
321 
322 trap cleanup EXIT
323 
324 setup_prepare
325 setup_wait
326 
327 used=$(ip -j stats show dev $rp1.200 group offload subgroup hw_stats_info |
328            jq '.[].info.l3_stats.used')
329 [[ $used = true ]]
330 check_err $? "hw_stats_info.used=$used"
331 log_test "l3_stats offloaded"
332 tests_run
333 
334 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