Merge tag 'ceph-for-5.13-rc1' of git://github.com/ceph/ceph-client
[linux-2.6-microblaze.git] / tools / testing / selftests / net / forwarding / tc_police.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 #
4 # Test tc-police action.
5 #
6 # +---------------------------------+
7 # | H1 (vrf)                        |
8 # |    + $h1                        |
9 # |    | 192.0.2.1/24               |
10 # |    |                            |
11 # |    |  default via 192.0.2.2     |
12 # +----|----------------------------+
13 #      |
14 # +----|----------------------------------------------------------------------+
15 # | SW |                                                                      |
16 # |    + $rp1                                                                 |
17 # |        192.0.2.2/24                                                       |
18 # |                                                                           |
19 # |        198.51.100.2/24                           203.0.113.2/24           |
20 # |    + $rp2                                    + $rp3                       |
21 # |    |                                         |                            |
22 # +----|-----------------------------------------|----------------------------+
23 #      |                                         |
24 # +----|----------------------------+       +----|----------------------------+
25 # |    |  default via 198.51.100.2  |       |    |  default via 203.0.113.2   |
26 # |    |                            |       |    |                            |
27 # |    | 198.51.100.1/24            |       |    | 203.0.113.1/24             |
28 # |    + $h2                        |       |    + $h3                        |
29 # | H2 (vrf)                        |       | H3 (vrf)                        |
30 # +---------------------------------+       +---------------------------------+
31
32 ALL_TESTS="
33         police_rx_test
34         police_tx_test
35         police_shared_test
36         police_rx_mirror_test
37         police_tx_mirror_test
38         police_pps_rx_test
39         police_pps_tx_test
40 "
41 NUM_NETIFS=6
42 source tc_common.sh
43 source lib.sh
44
45 h1_create()
46 {
47         simple_if_init $h1 192.0.2.1/24
48
49         ip -4 route add default vrf v$h1 nexthop via 192.0.2.2
50 }
51
52 h1_destroy()
53 {
54         ip -4 route del default vrf v$h1 nexthop via 192.0.2.2
55
56         simple_if_fini $h1 192.0.2.1/24
57 }
58
59 h2_create()
60 {
61         simple_if_init $h2 198.51.100.1/24
62
63         ip -4 route add default vrf v$h2 nexthop via 198.51.100.2
64
65         tc qdisc add dev $h2 clsact
66 }
67
68 h2_destroy()
69 {
70         tc qdisc del dev $h2 clsact
71
72         ip -4 route del default vrf v$h2 nexthop via 198.51.100.2
73
74         simple_if_fini $h2 198.51.100.1/24
75 }
76
77 h3_create()
78 {
79         simple_if_init $h3 203.0.113.1/24
80
81         ip -4 route add default vrf v$h3 nexthop via 203.0.113.2
82
83         tc qdisc add dev $h3 clsact
84 }
85
86 h3_destroy()
87 {
88         tc qdisc del dev $h3 clsact
89
90         ip -4 route del default vrf v$h3 nexthop via 203.0.113.2
91
92         simple_if_fini $h3 203.0.113.1/24
93 }
94
95 router_create()
96 {
97         ip link set dev $rp1 up
98         ip link set dev $rp2 up
99         ip link set dev $rp3 up
100
101         __addr_add_del $rp1 add 192.0.2.2/24
102         __addr_add_del $rp2 add 198.51.100.2/24
103         __addr_add_del $rp3 add 203.0.113.2/24
104
105         tc qdisc add dev $rp1 clsact
106         tc qdisc add dev $rp2 clsact
107 }
108
109 router_destroy()
110 {
111         tc qdisc del dev $rp2 clsact
112         tc qdisc del dev $rp1 clsact
113
114         __addr_add_del $rp3 del 203.0.113.2/24
115         __addr_add_del $rp2 del 198.51.100.2/24
116         __addr_add_del $rp1 del 192.0.2.2/24
117
118         ip link set dev $rp3 down
119         ip link set dev $rp2 down
120         ip link set dev $rp1 down
121 }
122
123 police_common_test()
124 {
125         local test_name=$1; shift
126
127         RET=0
128
129         # Rule to measure bandwidth on ingress of $h2
130         tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
131                 dst_ip 198.51.100.1 ip_proto udp dst_port 54321 \
132                 action drop
133
134         mausezahn $h1 -a own -b $(mac_get $rp1) -A 192.0.2.1 -B 198.51.100.1 \
135                 -t udp sp=12345,dp=54321 -p 1000 -c 0 -q &
136
137         local t0=$(tc_rule_stats_get $h2 1 ingress .bytes)
138         sleep 10
139         local t1=$(tc_rule_stats_get $h2 1 ingress .bytes)
140
141         local er=$((80 * 1000 * 1000))
142         local nr=$(rate $t0 $t1 10)
143         local nr_pct=$((100 * (nr - er) / er))
144         ((-10 <= nr_pct && nr_pct <= 10))
145         check_err $? "Expected rate $(humanize $er), got $(humanize $nr), which is $nr_pct% off. Required accuracy is +-10%."
146
147         log_test "$test_name"
148
149         { kill %% && wait %%; } 2>/dev/null
150         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
151 }
152
153 police_rx_test()
154 {
155         # Rule to police traffic destined to $h2 on ingress of $rp1
156         tc filter add dev $rp1 ingress protocol ip pref 1 handle 101 flower \
157                 dst_ip 198.51.100.1 ip_proto udp dst_port 54321 \
158                 action police rate 80mbit burst 16k conform-exceed drop/ok
159
160         police_common_test "police on rx"
161
162         tc filter del dev $rp1 ingress protocol ip pref 1 handle 101 flower
163 }
164
165 police_tx_test()
166 {
167         # Rule to police traffic destined to $h2 on egress of $rp2
168         tc filter add dev $rp2 egress protocol ip pref 1 handle 101 flower \
169                 dst_ip 198.51.100.1 ip_proto udp dst_port 54321 \
170                 action police rate 80mbit burst 16k conform-exceed drop/ok
171
172         police_common_test "police on tx"
173
174         tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
175 }
176
177 police_shared_common_test()
178 {
179         local dport=$1; shift
180         local test_name=$1; shift
181
182         RET=0
183
184         mausezahn $h1 -a own -b $(mac_get $rp1) -A 192.0.2.1 -B 198.51.100.1 \
185                 -t udp sp=12345,dp=$dport -p 1000 -c 0 -q &
186
187         local t0=$(tc_rule_stats_get $h2 1 ingress .bytes)
188         sleep 10
189         local t1=$(tc_rule_stats_get $h2 1 ingress .bytes)
190
191         local er=$((80 * 1000 * 1000))
192         local nr=$(rate $t0 $t1 10)
193         local nr_pct=$((100 * (nr - er) / er))
194         ((-10 <= nr_pct && nr_pct <= 10))
195         check_err $? "Expected rate $(humanize $er), got $(humanize $nr), which is $nr_pct% off. Required accuracy is +-10%."
196
197         log_test "$test_name"
198
199         { kill %% && wait %%; } 2>/dev/null
200 }
201
202 police_shared_test()
203 {
204         # Rule to measure bandwidth on ingress of $h2
205         tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
206                 dst_ip 198.51.100.1 ip_proto udp src_port 12345 \
207                 action drop
208
209         # Rule to police traffic destined to $h2 on ingress of $rp1
210         tc filter add dev $rp1 ingress protocol ip pref 1 handle 101 flower \
211                 dst_ip 198.51.100.1 ip_proto udp dst_port 54321 \
212                 action police rate 80mbit burst 16k conform-exceed drop/ok \
213                 index 10
214
215         # Rule to police a different flow destined to $h2 on egress of $rp2
216         # using same policer
217         tc filter add dev $rp2 egress protocol ip pref 1 handle 101 flower \
218                 dst_ip 198.51.100.1 ip_proto udp dst_port 22222 \
219                 action police index 10
220
221         police_shared_common_test 54321 "police with shared policer - rx"
222
223         police_shared_common_test 22222 "police with shared policer - tx"
224
225         tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
226         tc filter del dev $rp1 ingress protocol ip pref 1 handle 101 flower
227         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
228 }
229
230 police_mirror_common_test()
231 {
232         local pol_if=$1; shift
233         local dir=$1; shift
234         local test_name=$1; shift
235
236         RET=0
237
238         # Rule to measure bandwidth on ingress of $h2
239         tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
240                 dst_ip 198.51.100.1 ip_proto udp dst_port 54321 \
241                 action drop
242
243         # Rule to measure bandwidth of mirrored traffic on ingress of $h3
244         tc filter add dev $h3 ingress protocol ip pref 1 handle 101 flower \
245                 dst_ip 198.51.100.1 ip_proto udp dst_port 54321 \
246                 action drop
247
248         # Rule to police traffic destined to $h2 and mirror to $h3
249         tc filter add dev $pol_if $dir protocol ip pref 1 handle 101 flower \
250                 dst_ip 198.51.100.1 ip_proto udp dst_port 54321 \
251                 action police rate 80mbit burst 16k conform-exceed drop/pipe \
252                 action mirred egress mirror dev $rp3
253
254         mausezahn $h1 -a own -b $(mac_get $rp1) -A 192.0.2.1 -B 198.51.100.1 \
255                 -t udp sp=12345,dp=54321 -p 1000 -c 0 -q &
256
257         local t0=$(tc_rule_stats_get $h2 1 ingress .bytes)
258         sleep 10
259         local t1=$(tc_rule_stats_get $h2 1 ingress .bytes)
260
261         local er=$((80 * 1000 * 1000))
262         local nr=$(rate $t0 $t1 10)
263         local nr_pct=$((100 * (nr - er) / er))
264         ((-10 <= nr_pct && nr_pct <= 10))
265         check_err $? "Expected rate $(humanize $er), got $(humanize $nr), which is $nr_pct% off. Required accuracy is +-10%."
266
267         local t0=$(tc_rule_stats_get $h3 1 ingress .bytes)
268         sleep 10
269         local t1=$(tc_rule_stats_get $h3 1 ingress .bytes)
270
271         local er=$((80 * 1000 * 1000))
272         local nr=$(rate $t0 $t1 10)
273         local nr_pct=$((100 * (nr - er) / er))
274         ((-10 <= nr_pct && nr_pct <= 10))
275         check_err $? "Expected rate $(humanize $er), got $(humanize $nr), which is $nr_pct% off. Required accuracy is +-10%."
276
277         log_test "$test_name"
278
279         { kill %% && wait %%; } 2>/dev/null
280         tc filter del dev $pol_if $dir protocol ip pref 1 handle 101 flower
281         tc filter del dev $h3 ingress protocol ip pref 1 handle 101 flower
282         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
283 }
284
285 police_rx_mirror_test()
286 {
287         police_mirror_common_test $rp1 ingress "police rx and mirror"
288 }
289
290 police_tx_mirror_test()
291 {
292         police_mirror_common_test $rp2 egress "police tx and mirror"
293 }
294
295 police_pps_common_test()
296 {
297         local test_name=$1; shift
298
299         RET=0
300
301         # Rule to measure bandwidth on ingress of $h2
302         tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
303                 dst_ip 198.51.100.1 ip_proto udp dst_port 54321 \
304                 action drop
305
306         mausezahn $h1 -a own -b $(mac_get $rp1) -A 192.0.2.1 -B 198.51.100.1 \
307                 -t udp sp=12345,dp=54321 -p 1000 -c 0 -q &
308
309         local t0=$(tc_rule_stats_get $h2 1 ingress .packets)
310         sleep 10
311         local t1=$(tc_rule_stats_get $h2 1 ingress .packets)
312
313         local er=$((2000))
314         local nr=$(packets_rate $t0 $t1 10)
315         local nr_pct=$((100 * (nr - er) / er))
316         ((-10 <= nr_pct && nr_pct <= 10))
317         check_err $? "Expected rate $(humanize $er), got $(humanize $nr), which is $nr_pct% off. Required accuracy is +-10%."
318
319         log_test "$test_name"
320
321         { kill %% && wait %%; } 2>/dev/null
322         tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
323 }
324
325 police_pps_rx_test()
326 {
327         # Rule to police traffic destined to $h2 on ingress of $rp1
328         tc filter add dev $rp1 ingress protocol ip pref 1 handle 101 flower \
329                 dst_ip 198.51.100.1 ip_proto udp dst_port 54321 \
330                 action police pkts_rate 2000 pkts_burst 400 conform-exceed drop/ok
331
332         police_pps_common_test "police pps on rx"
333
334         tc filter del dev $rp1 ingress protocol ip pref 1 handle 101 flower
335 }
336
337 police_pps_tx_test()
338 {
339         # Rule to police traffic destined to $h2 on egress of $rp2
340         tc filter add dev $rp2 egress protocol ip pref 1 handle 101 flower \
341                 dst_ip 198.51.100.1 ip_proto udp dst_port 54321 \
342                 action police pkts_rate 2000 pkts_burst 400 conform-exceed drop/ok
343
344         police_pps_common_test "police pps on tx"
345
346         tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
347 }
348
349 setup_prepare()
350 {
351         h1=${NETIFS[p1]}
352         rp1=${NETIFS[p2]}
353
354         rp2=${NETIFS[p3]}
355         h2=${NETIFS[p4]}
356
357         rp3=${NETIFS[p5]}
358         h3=${NETIFS[p6]}
359
360         vrf_prepare
361         forwarding_enable
362
363         h1_create
364         h2_create
365         h3_create
366         router_create
367 }
368
369 cleanup()
370 {
371         pre_cleanup
372
373         router_destroy
374         h3_destroy
375         h2_destroy
376         h1_destroy
377
378         forwarding_restore
379         vrf_cleanup
380 }
381
382 trap cleanup EXIT
383
384 setup_prepare
385 setup_wait
386
387 tests_run
388
389 exit $EXIT_STATUS