2 # SPDX-License-Identifier: GPL-2.0
4 # Test tc-police action.
6 # +---------------------------------+
11 # | | default via 192.0.2.2 |
12 # +----|----------------------------+
14 # +----|----------------------------------------------------------------------+
19 # | 198.51.100.2/24 203.0.113.2/24 |
22 # +----|-----------------------------------------|----------------------------+
24 # +----|----------------------------+ +----|----------------------------+
25 # | | default via 198.51.100.2 | | | default via 203.0.113.2 |
27 # | | 198.51.100.1/24 | | | 203.0.113.1/24 |
29 # | H2 (vrf) | | H3 (vrf) |
30 # +---------------------------------+ +---------------------------------+
49 simple_if_init
$h1 192.0.2.1/24
51 ip
-4 route add default vrf v
$h1 nexthop via
192.0.2.2
56 ip
-4 route del default vrf v
$h1 nexthop via
192.0.2.2
58 simple_if_fini
$h1 192.0.2.1/24
63 simple_if_init
$h2 198.51.100.1/24
65 ip
-4 route add default vrf v
$h2 nexthop via
198.51.100.2
67 tc qdisc add dev
$h2 clsact
72 tc qdisc del dev
$h2 clsact
74 ip
-4 route del default vrf v
$h2 nexthop via
198.51.100.2
76 simple_if_fini
$h2 198.51.100.1/24
81 simple_if_init
$h3 203.0.113.1/24
83 ip
-4 route add default vrf v
$h3 nexthop via
203.0.113.2
85 tc qdisc add dev
$h3 clsact
90 tc qdisc del dev
$h3 clsact
92 ip
-4 route del default vrf v
$h3 nexthop via
203.0.113.2
94 simple_if_fini
$h3 203.0.113.1/24
99 ip link
set dev
$rp1 up
100 ip link
set dev
$rp2 up
101 ip link
set dev
$rp3 up
103 __addr_add_del
$rp1 add
192.0.2.2/24
104 __addr_add_del
$rp2 add
198.51.100.2/24
105 __addr_add_del
$rp3 add
203.0.113.2/24
107 tc qdisc add dev
$rp1 clsact
108 tc qdisc add dev
$rp2 clsact
113 tc qdisc del dev
$rp2 clsact
114 tc qdisc del dev
$rp1 clsact
116 __addr_add_del
$rp3 del
203.0.113.2/24
117 __addr_add_del
$rp2 del
198.51.100.2/24
118 __addr_add_del
$rp1 del
192.0.2.2/24
120 ip link
set dev
$rp3 down
121 ip link
set dev
$rp2 down
122 ip link
set dev
$rp1 down
127 local test_name
=$1; shift
131 # Rule to measure bandwidth on ingress of $h2
132 tc filter add dev
$h2 ingress protocol ip pref
1 handle
101 flower \
133 dst_ip
198.51.100.1 ip_proto udp dst_port
54321 \
136 mausezahn
$h1 -a own
-b $
(mac_get
$rp1) -A 192.0.2.1 -B 198.51.100.1 \
137 -t udp sp
=12345,dp
=54321 -p 1000 -c 0 -q &
139 local t0
=$
(tc_rule_stats_get
$h2 1 ingress .bytes
)
141 local t1
=$
(tc_rule_stats_get
$h2 1 ingress .bytes
)
143 local er
=$
((10 * 1000 * 1000))
144 local nr
=$
(rate
$t0 $t1 10)
145 local nr_pct
=$
((100 * (nr
- er
) / er
))
146 ((-10 <= nr_pct
&& nr_pct
<= 10))
147 check_err $?
"Expected rate $(humanize $er), got $(humanize $nr), which is $nr_pct% off. Required accuracy is +-10%."
149 log_test
"$test_name"
152 tc filter del dev
$h2 ingress protocol ip pref
1 handle
101 flower
157 # Rule to police traffic destined to $h2 on ingress of $rp1
158 tc filter add dev
$rp1 ingress protocol ip pref
1 handle
101 flower \
159 dst_ip
198.51.100.1 ip_proto udp dst_port
54321 \
160 action police rate
10mbit burst
16k conform-exceed drop
/ok
162 police_common_test
"police on rx"
164 tc filter del dev
$rp1 ingress protocol ip pref
1 handle
101 flower
169 # Rule to police traffic destined to $h2 on egress of $rp2
170 tc filter add dev
$rp2 egress protocol ip pref
1 handle
101 flower \
171 dst_ip
198.51.100.1 ip_proto udp dst_port
54321 \
172 action police rate
10mbit burst
16k conform-exceed drop
/ok
174 police_common_test
"police on tx"
176 tc filter del dev
$rp2 egress protocol ip pref
1 handle
101 flower
179 police_shared_common_test
()
181 local dport
=$1; shift
182 local test_name
=$1; shift
186 mausezahn
$h1 -a own
-b $
(mac_get
$rp1) -A 192.0.2.1 -B 198.51.100.1 \
187 -t udp sp
=12345,dp
=$dport -p 1000 -c 0 -q &
189 local t0
=$
(tc_rule_stats_get
$h2 1 ingress .bytes
)
191 local t1
=$
(tc_rule_stats_get
$h2 1 ingress .bytes
)
193 local er
=$
((10 * 1000 * 1000))
194 local nr
=$
(rate
$t0 $t1 10)
195 local nr_pct
=$
((100 * (nr
- er
) / er
))
196 ((-10 <= nr_pct
&& nr_pct
<= 10))
197 check_err $?
"Expected rate $(humanize $er), got $(humanize $nr), which is $nr_pct% off. Required accuracy is +-10%."
199 log_test
"$test_name"
206 # Rule to measure bandwidth on ingress of $h2
207 tc filter add dev
$h2 ingress protocol ip pref
1 handle
101 flower \
208 dst_ip
198.51.100.1 ip_proto udp src_port
12345 \
211 # Rule to police traffic destined to $h2 on ingress of $rp1
212 tc filter add dev
$rp1 ingress protocol ip pref
1 handle
101 flower \
213 dst_ip
198.51.100.1 ip_proto udp dst_port
54321 \
214 action police rate
10mbit burst
16k conform-exceed drop
/ok \
217 # Rule to police a different flow destined to $h2 on egress of $rp2
219 tc filter add dev
$rp2 egress protocol ip pref
1 handle
101 flower \
220 dst_ip
198.51.100.1 ip_proto udp dst_port
22222 \
221 action police index
10
223 police_shared_common_test
54321 "police with shared policer - rx"
225 police_shared_common_test
22222 "police with shared policer - tx"
227 tc filter del dev
$rp2 egress protocol ip pref
1 handle
101 flower
228 tc filter del dev
$rp1 ingress protocol ip pref
1 handle
101 flower
229 tc filter del dev
$h2 ingress protocol ip pref
1 handle
101 flower
232 police_mirror_common_test
()
234 local pol_if
=$1; shift
236 local test_name
=$1; shift
240 # Rule to measure bandwidth on ingress of $h2
241 tc filter add dev
$h2 ingress protocol ip pref
1 handle
101 flower \
242 dst_ip
198.51.100.1 ip_proto udp dst_port
54321 \
245 # Rule to measure bandwidth of mirrored traffic on ingress of $h3
246 tc filter add dev
$h3 ingress protocol ip pref
1 handle
101 flower \
247 dst_ip
198.51.100.1 ip_proto udp dst_port
54321 \
250 # Rule to police traffic destined to $h2 and mirror to $h3
251 tc filter add dev
$pol_if $dir protocol ip pref
1 handle
101 flower \
252 dst_ip
198.51.100.1 ip_proto udp dst_port
54321 \
253 action police rate
10mbit burst
16k conform-exceed drop
/pipe \
254 action mirred egress mirror dev
$rp3
256 mausezahn
$h1 -a own
-b $
(mac_get
$rp1) -A 192.0.2.1 -B 198.51.100.1 \
257 -t udp sp
=12345,dp
=54321 -p 1000 -c 0 -q &
259 local t0
=$
(tc_rule_stats_get
$h2 1 ingress .bytes
)
261 local t1
=$
(tc_rule_stats_get
$h2 1 ingress .bytes
)
263 local er
=$
((10 * 1000 * 1000))
264 local nr
=$
(rate
$t0 $t1 10)
265 local nr_pct
=$
((100 * (nr
- er
) / er
))
266 ((-10 <= nr_pct
&& nr_pct
<= 10))
267 check_err $?
"Expected rate $(humanize $er), got $(humanize $nr), which is $nr_pct% off. Required accuracy is +-10%."
269 local t0
=$
(tc_rule_stats_get
$h3 1 ingress .bytes
)
271 local t1
=$
(tc_rule_stats_get
$h3 1 ingress .bytes
)
273 local er
=$
((10 * 1000 * 1000))
274 local nr
=$
(rate
$t0 $t1 10)
275 local nr_pct
=$
((100 * (nr
- er
) / er
))
276 ((-10 <= nr_pct
&& nr_pct
<= 10))
277 check_err $?
"Expected rate $(humanize $er), got $(humanize $nr), which is $nr_pct% off. Required accuracy is +-10%."
279 log_test
"$test_name"
282 tc filter del dev
$pol_if $dir protocol ip pref
1 handle
101 flower
283 tc filter del dev
$h3 ingress protocol ip pref
1 handle
101 flower
284 tc filter del dev
$h2 ingress protocol ip pref
1 handle
101 flower
287 police_rx_mirror_test
()
289 police_mirror_common_test
$rp1 ingress
"police rx and mirror"
292 police_tx_mirror_test
()
294 police_mirror_common_test
$rp2 egress
"police tx and mirror"
297 police_pps_common_test
()
299 local test_name
=$1; shift
303 # Rule to measure bandwidth on ingress of $h2
304 tc filter add dev
$h2 ingress protocol ip pref
1 handle
101 flower \
305 dst_ip
198.51.100.1 ip_proto udp dst_port
54321 \
308 mausezahn
$h1 -a own
-b $
(mac_get
$rp1) -A 192.0.2.1 -B 198.51.100.1 \
309 -t udp sp
=12345,dp
=54321 -p 1000 -c 0 -q &
311 local t0
=$
(tc_rule_stats_get
$h2 1 ingress .packets
)
313 local t1
=$
(tc_rule_stats_get
$h2 1 ingress .packets
)
316 local nr
=$
(packets_rate
$t0 $t1 10)
317 local nr_pct
=$
((100 * (nr
- er
) / er
))
318 ((-10 <= nr_pct
&& nr_pct
<= 10))
319 check_err $?
"Expected rate $(humanize $er), got $(humanize $nr), which is $nr_pct% off. Required accuracy is +-10%."
321 log_test
"$test_name"
324 tc filter del dev
$h2 ingress protocol ip pref
1 handle
101 flower
329 # Rule to police traffic destined to $h2 on ingress of $rp1
330 tc filter add dev
$rp1 ingress protocol ip pref
1 handle
101 flower \
331 dst_ip
198.51.100.1 ip_proto udp dst_port
54321 \
332 action police pkts_rate
2000 pkts_burst
400 conform-exceed drop
/ok
334 police_pps_common_test
"police pps on rx"
336 tc filter del dev
$rp1 ingress protocol ip pref
1 handle
101 flower
341 # Rule to police traffic destined to $h2 on egress of $rp2
342 tc filter add dev
$rp2 egress protocol ip pref
1 handle
101 flower \
343 dst_ip
198.51.100.1 ip_proto udp dst_port
54321 \
344 action police pkts_rate
2000 pkts_burst
400 conform-exceed drop
/ok
346 police_pps_common_test
"police pps on tx"
348 tc filter del dev
$rp2 egress protocol ip pref
1 handle
101 flower
351 police_mtu_common_test
() {
354 local test_name
=$1; shift
356 local direction
=$1; shift
358 tc filter add dev
$dev $direction protocol ip pref
1 handle
101 flower \
359 dst_ip
198.51.100.1 ip_proto udp dst_port
54321 \
360 action police mtu
1042 conform-exceed drop
/ok
362 # to count "conform" packets
363 tc filter add dev
$h2 ingress protocol ip pref
1 handle
101 flower \
364 dst_ip
198.51.100.1 ip_proto udp dst_port
54321 \
367 mausezahn
$h1 -a own
-b $
(mac_get
$rp1) -A 192.0.2.1 -B 198.51.100.1 \
368 -t udp sp
=12345,dp
=54321 -p 1001 -c 10 -q
370 mausezahn
$h1 -a own
-b $
(mac_get
$rp1) -A 192.0.2.1 -B 198.51.100.1 \
371 -t udp sp
=12345,dp
=54321 -p 1000 -c 3 -q
373 tc_check_packets
"dev $dev $direction" 101 13
374 check_err $?
"wrong packet counter"
377 local overlimits_t0
=$
(tc_rule_stats_get
${dev} 1 ${direction} .overlimits
)
378 test ${overlimits_t0} = 10
379 check_err $?
"wrong overlimits, expected 10 got ${overlimits_t0}"
382 tc_check_packets
"dev $h2 ingress" 101 3
383 check_err $?
"forwarding error"
385 tc filter del dev
$h2 ingress protocol ip pref
1 handle
101 flower
386 tc filter del dev
$dev $direction protocol ip pref
1 handle
101 flower
388 log_test
"$test_name"
393 police_mtu_common_test
"police mtu (rx)" $rp1 ingress
398 police_mtu_common_test
"police mtu (tx)" $rp2 egress