cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

tc_sample.sh (17833B)


      1#!/bin/bash
      2# SPDX-License-Identifier: GPL-2.0
      3#
      4# Test that packets are sampled when tc-sample is used and that reported
      5# metadata is correct. Two sets of hosts (with and without LAG) are used, since
      6# metadata extraction in mlxsw is a bit different when LAG is involved.
      7#
      8# +---------------------------------+       +---------------------------------+
      9# | H1 (vrf)                        |       | H3 (vrf)                        |
     10# |    + $h1                        |       |    + $h3_lag                    |
     11# |    | 192.0.2.1/28               |       |    | 192.0.2.17/28              |
     12# |    |                            |       |    |                            |
     13# |    |  default via 192.0.2.2     |       |    |  default via 192.0.2.18    |
     14# +----|----------------------------+       +----|----------------------------+
     15#      |                                         |
     16# +----|-----------------------------------------|----------------------------+
     17# |    | 192.0.2.2/28                            | 192.0.2.18/28              |
     18# |    + $rp1                                    + $rp3_lag                   |
     19# |                                                                           |
     20# |    + $rp2                                    + $rp4_lag                   |
     21# |    | 198.51.100.2/28                         | 198.51.100.18/28           |
     22# +----|-----------------------------------------|----------------------------+
     23#      |                                         |
     24# +----|----------------------------+       +----|----------------------------+
     25# |    |  default via 198.51.100.2  |       |    |  default via 198.51.100.18 |
     26# |    |                            |       |    |                            |
     27# |    | 198.51.100.1/28            |       |    | 198.51.100.17/28           |
     28# |    + $h2                        |       |    + $h4_lag                    |
     29# | H2 (vrf)                        |       | H4 (vrf)                        |
     30# +---------------------------------+       +---------------------------------+
     31
     32lib_dir=$(dirname $0)/../../../net/forwarding
     33
     34ALL_TESTS="
     35	tc_sample_rate_test
     36	tc_sample_max_rate_test
     37	tc_sample_conflict_test
     38	tc_sample_group_conflict_test
     39	tc_sample_md_iif_test
     40	tc_sample_md_lag_iif_test
     41	tc_sample_md_oif_test
     42	tc_sample_md_lag_oif_test
     43	tc_sample_md_out_tc_test
     44	tc_sample_md_out_tc_occ_test
     45	tc_sample_md_latency_test
     46	tc_sample_acl_group_conflict_test
     47	tc_sample_acl_rate_test
     48	tc_sample_acl_max_rate_test
     49"
     50NUM_NETIFS=8
     51CAPTURE_FILE=$(mktemp)
     52source $lib_dir/lib.sh
     53source $lib_dir/devlink_lib.sh
     54source mlxsw_lib.sh
     55
     56# Available at https://github.com/Mellanox/libpsample
     57require_command psample
     58
     59h1_create()
     60{
     61	simple_if_init $h1 192.0.2.1/28
     62
     63	ip -4 route add default vrf v$h1 nexthop via 192.0.2.2
     64}
     65
     66h1_destroy()
     67{
     68	ip -4 route del default vrf v$h1 nexthop via 192.0.2.2
     69
     70	simple_if_fini $h1 192.0.2.1/28
     71}
     72
     73h2_create()
     74{
     75	simple_if_init $h2 198.51.100.1/28
     76
     77	ip -4 route add default vrf v$h2 nexthop via 198.51.100.2
     78}
     79
     80h2_destroy()
     81{
     82	ip -4 route del default vrf v$h2 nexthop via 198.51.100.2
     83
     84	simple_if_fini $h2 198.51.100.1/28
     85}
     86
     87h3_create()
     88{
     89	ip link set dev $h3 down
     90	ip link add name ${h3}_bond type bond mode 802.3ad
     91	ip link set dev $h3 master ${h3}_bond
     92
     93	simple_if_init ${h3}_bond 192.0.2.17/28
     94
     95	ip -4 route add default vrf v${h3}_bond nexthop via 192.0.2.18
     96}
     97
     98h3_destroy()
     99{
    100	ip -4 route del default vrf v${h3}_bond nexthop via 192.0.2.18
    101
    102	simple_if_fini ${h3}_bond 192.0.2.17/28
    103
    104	ip link set dev $h3 nomaster
    105	ip link del dev ${h3}_bond
    106}
    107
    108h4_create()
    109{
    110	ip link set dev $h4 down
    111	ip link add name ${h4}_bond type bond mode 802.3ad
    112	ip link set dev $h4 master ${h4}_bond
    113
    114	simple_if_init ${h4}_bond 198.51.100.17/28
    115
    116	ip -4 route add default vrf v${h4}_bond nexthop via 198.51.100.18
    117}
    118
    119h4_destroy()
    120{
    121	ip -4 route del default vrf v${h4}_bond nexthop via 198.51.100.18
    122
    123	simple_if_fini ${h4}_bond 198.51.100.17/28
    124
    125	ip link set dev $h4 nomaster
    126	ip link del dev ${h4}_bond
    127}
    128
    129router_create()
    130{
    131	ip link set dev $rp1 up
    132	__addr_add_del $rp1 add 192.0.2.2/28
    133	tc qdisc add dev $rp1 clsact
    134
    135	ip link set dev $rp2 up
    136	__addr_add_del $rp2 add 198.51.100.2/28
    137	tc qdisc add dev $rp2 clsact
    138
    139	ip link add name ${rp3}_bond type bond mode 802.3ad
    140	ip link set dev $rp3 master ${rp3}_bond
    141	__addr_add_del ${rp3}_bond add 192.0.2.18/28
    142	tc qdisc add dev $rp3 clsact
    143	ip link set dev ${rp3}_bond up
    144
    145	ip link add name ${rp4}_bond type bond mode 802.3ad
    146	ip link set dev $rp4 master ${rp4}_bond
    147	__addr_add_del ${rp4}_bond add 198.51.100.18/28
    148	tc qdisc add dev $rp4 clsact
    149	ip link set dev ${rp4}_bond up
    150}
    151
    152router_destroy()
    153{
    154	ip link set dev ${rp4}_bond down
    155	tc qdisc del dev $rp4 clsact
    156	__addr_add_del ${rp4}_bond del 198.51.100.18/28
    157	ip link set dev $rp4 nomaster
    158	ip link del dev ${rp4}_bond
    159
    160	ip link set dev ${rp3}_bond down
    161	tc qdisc del dev $rp3 clsact
    162	__addr_add_del ${rp3}_bond del 192.0.2.18/28
    163	ip link set dev $rp3 nomaster
    164	ip link del dev ${rp3}_bond
    165
    166	tc qdisc del dev $rp2 clsact
    167	__addr_add_del $rp2 del 198.51.100.2/28
    168	ip link set dev $rp2 down
    169
    170	tc qdisc del dev $rp1 clsact
    171	__addr_add_del $rp1 del 192.0.2.2/28
    172	ip link set dev $rp1 down
    173}
    174
    175setup_prepare()
    176{
    177	h1=${NETIFS[p1]}
    178	rp1=${NETIFS[p2]}
    179	rp2=${NETIFS[p3]}
    180	h2=${NETIFS[p4]}
    181	h3=${NETIFS[p5]}
    182	rp3=${NETIFS[p6]}
    183	h4=${NETIFS[p7]}
    184	rp4=${NETIFS[p8]}
    185
    186	vrf_prepare
    187
    188	h1_create
    189	h2_create
    190	h3_create
    191	h4_create
    192	router_create
    193}
    194
    195cleanup()
    196{
    197	pre_cleanup
    198
    199	rm -f $CAPTURE_FILE
    200
    201	router_destroy
    202	h4_destroy
    203	h3_destroy
    204	h2_destroy
    205	h1_destroy
    206
    207	vrf_cleanup
    208}
    209
    210psample_capture_start()
    211{
    212	rm -f $CAPTURE_FILE
    213
    214	psample &> $CAPTURE_FILE &
    215
    216	sleep 1
    217}
    218
    219psample_capture_stop()
    220{
    221	{ kill %% && wait %%; } 2>/dev/null
    222}
    223
    224__tc_sample_rate_test()
    225{
    226	local desc=$1; shift
    227	local dip=$1; shift
    228	local pkts pct
    229
    230	RET=0
    231
    232	tc filter add dev $rp1 ingress protocol all pref 1 handle 101 matchall \
    233		skip_sw action sample rate 32 group 1
    234	check_err $? "Failed to configure sampling rule"
    235
    236	psample_capture_start
    237
    238	ip vrf exec v$h1 $MZ $h1 -c 320000 -d 100usec -p 64 -A 192.0.2.1 \
    239		-B $dip -t udp dp=52768,sp=42768 -q
    240
    241	psample_capture_stop
    242
    243	pkts=$(grep -e "group 1 " $CAPTURE_FILE | wc -l)
    244	pct=$((100 * (pkts - 10000) / 10000))
    245	(( -25 <= pct && pct <= 25))
    246	check_err $? "Expected 10000 packets, got $pkts packets, which is $pct% off. Required accuracy is +-25%"
    247
    248	log_test "tc sample rate ($desc)"
    249
    250	tc filter del dev $rp1 ingress protocol all pref 1 handle 101 matchall
    251}
    252
    253tc_sample_rate_test()
    254{
    255	__tc_sample_rate_test "forward" 198.51.100.1
    256	__tc_sample_rate_test "local receive" 192.0.2.2
    257}
    258
    259tc_sample_max_rate_test()
    260{
    261	RET=0
    262
    263	tc filter add dev $rp1 ingress protocol all pref 1 handle 101 matchall \
    264		skip_sw action sample rate $((35 * 10 ** 8)) group 1
    265	check_err $? "Failed to configure sampling rule with max rate"
    266
    267	tc filter del dev $rp1 ingress protocol all pref 1 handle 101 matchall
    268
    269	tc filter add dev $rp1 ingress protocol all pref 1 handle 101 matchall \
    270		skip_sw action sample rate $((35 * 10 ** 8 + 1)) \
    271		group 1 &> /dev/null
    272	check_fail $? "Managed to configure sampling rate above maximum"
    273
    274	log_test "tc sample maximum rate"
    275}
    276
    277tc_sample_conflict_test()
    278{
    279	RET=0
    280
    281	# Test that two sampling rules cannot be configured on the same port,
    282	# even when they share the same parameters.
    283
    284	tc filter add dev $rp1 ingress protocol all pref 1 handle 101 matchall \
    285		skip_sw action sample rate 1024 group 1
    286	check_err $? "Failed to configure sampling rule"
    287
    288	tc filter add dev $rp1 ingress protocol all pref 2 handle 102 matchall \
    289		skip_sw action sample rate 1024 group 1 &> /dev/null
    290	check_fail $? "Managed to configure second sampling rule"
    291
    292	# Delete the first rule and make sure the second rule can now be
    293	# configured.
    294
    295	tc filter del dev $rp1 ingress protocol all pref 1 handle 101 matchall
    296
    297	tc filter add dev $rp1 ingress protocol all pref 2 handle 102 matchall \
    298		skip_sw action sample rate 1024 group 1
    299	check_err $? "Failed to configure sampling rule after deletion"
    300
    301	log_test "tc sample conflict test"
    302
    303	tc filter del dev $rp1 ingress protocol all pref 2 handle 102 matchall
    304}
    305
    306tc_sample_group_conflict_test()
    307{
    308	RET=0
    309
    310	# Test that two sampling rules cannot be configured on the same port
    311	# with different groups.
    312
    313	tc filter add dev $rp1 ingress protocol all pref 1 handle 101 matchall \
    314		skip_sw action sample rate 1024 group 1
    315	check_err $? "Failed to configure sampling rule"
    316
    317	tc filter add dev $rp1 ingress protocol all pref 2 handle 102 matchall \
    318		skip_sw action sample rate 1024 group 2 &> /dev/null
    319	check_fail $? "Managed to configure sampling rule with conflicting group"
    320
    321	log_test "tc sample group conflict test"
    322
    323	tc filter del dev $rp1 ingress protocol all pref 1 handle 101 matchall
    324}
    325
    326tc_sample_md_iif_test()
    327{
    328	local rp1_ifindex
    329
    330	RET=0
    331
    332	tc filter add dev $rp1 ingress protocol all pref 1 handle 101 matchall \
    333		skip_sw action sample rate 5 group 1
    334	check_err $? "Failed to configure sampling rule"
    335
    336	psample_capture_start
    337
    338	ip vrf exec v$h1 $MZ $h1 -c 3200 -d 1msec -p 64 -A 192.0.2.1 \
    339		-B 198.51.100.1 -t udp dp=52768,sp=42768 -q
    340
    341	psample_capture_stop
    342
    343	rp1_ifindex=$(ip -j -p link show dev $rp1 | jq '.[]["ifindex"]')
    344	grep -q -e "in-ifindex $rp1_ifindex " $CAPTURE_FILE
    345	check_err $? "Sampled packets do not have expected in-ifindex"
    346
    347	log_test "tc sample iif"
    348
    349	tc filter del dev $rp1 ingress protocol all pref 1 handle 101 matchall
    350}
    351
    352tc_sample_md_lag_iif_test()
    353{
    354	local rp3_ifindex
    355
    356	RET=0
    357
    358	tc filter add dev $rp3 ingress protocol all pref 1 handle 101 matchall \
    359		skip_sw action sample rate 5 group 1
    360	check_err $? "Failed to configure sampling rule"
    361
    362	psample_capture_start
    363
    364	ip vrf exec v${h3}_bond $MZ ${h3}_bond -c 3200 -d 1msec -p 64 \
    365		-A 192.0.2.17 -B 198.51.100.17 -t udp dp=52768,sp=42768 -q
    366
    367	psample_capture_stop
    368
    369	rp3_ifindex=$(ip -j -p link show dev $rp3 | jq '.[]["ifindex"]')
    370	grep -q -e "in-ifindex $rp3_ifindex " $CAPTURE_FILE
    371	check_err $? "Sampled packets do not have expected in-ifindex"
    372
    373	log_test "tc sample lag iif"
    374
    375	tc filter del dev $rp3 ingress protocol all pref 1 handle 101 matchall
    376}
    377
    378tc_sample_md_oif_test()
    379{
    380	local rp2_ifindex
    381
    382	RET=0
    383
    384	tc filter add dev $rp1 ingress protocol all pref 1 handle 101 matchall \
    385		skip_sw action sample rate 5 group 1
    386	check_err $? "Failed to configure sampling rule"
    387
    388	psample_capture_start
    389
    390	ip vrf exec v$h1 $MZ $h1 -c 3200 -d 1msec -p 64 -A 192.0.2.1 \
    391		-B 198.51.100.1 -t udp dp=52768,sp=42768 -q
    392
    393	psample_capture_stop
    394
    395	rp2_ifindex=$(ip -j -p link show dev $rp2 | jq '.[]["ifindex"]')
    396	grep -q -e "out-ifindex $rp2_ifindex " $CAPTURE_FILE
    397	check_err $? "Sampled packets do not have expected out-ifindex"
    398
    399	log_test "tc sample oif"
    400
    401	tc filter del dev $rp1 ingress protocol all pref 1 handle 101 matchall
    402}
    403
    404tc_sample_md_lag_oif_test()
    405{
    406	local rp4_ifindex
    407
    408	RET=0
    409
    410	tc filter add dev $rp3 ingress protocol all pref 1 handle 101 matchall \
    411		skip_sw action sample rate 5 group 1
    412	check_err $? "Failed to configure sampling rule"
    413
    414	psample_capture_start
    415
    416	ip vrf exec v${h3}_bond $MZ ${h3}_bond -c 3200 -d 1msec -p 64 \
    417		-A 192.0.2.17 -B 198.51.100.17 -t udp dp=52768,sp=42768 -q
    418
    419	psample_capture_stop
    420
    421	rp4_ifindex=$(ip -j -p link show dev $rp4 | jq '.[]["ifindex"]')
    422	grep -q -e "out-ifindex $rp4_ifindex " $CAPTURE_FILE
    423	check_err $? "Sampled packets do not have expected out-ifindex"
    424
    425	log_test "tc sample lag oif"
    426
    427	tc filter del dev $rp3 ingress protocol all pref 1 handle 101 matchall
    428}
    429
    430tc_sample_md_out_tc_test()
    431{
    432	RET=0
    433
    434	# Output traffic class is not supported on Spectrum-1.
    435	mlxsw_only_on_spectrum 2+ || return
    436
    437	tc filter add dev $rp1 ingress protocol all pref 1 handle 101 matchall \
    438		skip_sw action sample rate 5 group 1
    439	check_err $? "Failed to configure sampling rule"
    440
    441	# By default, all the packets should go to the same traffic class (0).
    442
    443	psample_capture_start
    444
    445	ip vrf exec v$h1 $MZ $h1 -c 3200 -d 1msec -p 64 -A 192.0.2.1 \
    446		-B 198.51.100.1 -t udp dp=52768,sp=42768 -q
    447
    448	psample_capture_stop
    449
    450	grep -q -e "out-tc 0 " $CAPTURE_FILE
    451	check_err $? "Sampled packets do not have expected out-tc (0)"
    452
    453	# Map all priorities to highest traffic class (7) and check reported
    454	# out-tc.
    455	tc qdisc replace dev $rp2 root handle 1: \
    456		prio bands 3 priomap 0 0 0 0 0 0 0 0
    457
    458	psample_capture_start
    459
    460	ip vrf exec v$h1 $MZ $h1 -c 3200 -d 1msec -p 64 -A 192.0.2.1 \
    461		-B 198.51.100.1 -t udp dp=52768,sp=42768 -q
    462
    463	psample_capture_stop
    464
    465	grep -q -e "out-tc 7 " $CAPTURE_FILE
    466	check_err $? "Sampled packets do not have expected out-tc (7)"
    467
    468	log_test "tc sample out-tc"
    469
    470	tc qdisc del dev $rp2 root handle 1:
    471	tc filter del dev $rp1 ingress protocol all pref 1 handle 101 matchall
    472}
    473
    474tc_sample_md_out_tc_occ_test()
    475{
    476	local backlog pct occ
    477
    478	RET=0
    479
    480	# Output traffic class occupancy is not supported on Spectrum-1.
    481	mlxsw_only_on_spectrum 2+ || return
    482
    483	tc filter add dev $rp1 ingress protocol all pref 1 handle 101 matchall \
    484		skip_sw action sample rate 1024 group 1
    485	check_err $? "Failed to configure sampling rule"
    486
    487	# Configure a shaper on egress to create congestion.
    488	tc qdisc replace dev $rp2 root handle 1: \
    489		tbf rate 1Mbit burst 256k limit 1M
    490
    491	psample_capture_start
    492
    493	ip vrf exec v$h1 $MZ $h1 -c 0 -d 1usec -p 1400 -A 192.0.2.1 \
    494		-B 198.51.100.1 -t udp dp=52768,sp=42768 -q &
    495
    496	# Allow congestion to reach steady state.
    497	sleep 10
    498
    499	backlog=$(tc -j -p -s qdisc show dev $rp2 | jq '.[0]["backlog"]')
    500
    501	# Kill mausezahn.
    502	{ kill %% && wait %%; } 2>/dev/null
    503
    504	psample_capture_stop
    505
    506	# Record last congestion sample.
    507	occ=$(grep -e "out-tc-occ " $CAPTURE_FILE | tail -n 1 | \
    508		cut -d ' ' -f 16)
    509
    510	pct=$((100 * (occ - backlog) / backlog))
    511	(( -1 <= pct && pct <= 1))
    512	check_err $? "Recorded a congestion of $backlog bytes, but sampled congestion is $occ bytes, which is $pct% off. Required accuracy is +-5%"
    513
    514	log_test "tc sample out-tc-occ"
    515
    516	tc qdisc del dev $rp2 root handle 1:
    517	tc filter del dev $rp1 ingress protocol all pref 1 handle 101 matchall
    518}
    519
    520tc_sample_md_latency_test()
    521{
    522	RET=0
    523
    524	# Egress sampling not supported on Spectrum-1.
    525	mlxsw_only_on_spectrum 2+ || return
    526
    527	tc filter add dev $rp2 egress protocol all pref 1 handle 101 matchall \
    528		skip_sw action sample rate 5 group 1
    529	check_err $? "Failed to configure sampling rule"
    530
    531	psample_capture_start
    532
    533	ip vrf exec v$h1 $MZ $h1 -c 3200 -d 1msec -p 64 -A 192.0.2.1 \
    534		-B 198.51.100.1 -t udp dp=52768,sp=42768 -q
    535
    536	psample_capture_stop
    537
    538	grep -q -e "latency " $CAPTURE_FILE
    539	check_err $? "Sampled packets do not have latency attribute"
    540
    541	log_test "tc sample latency"
    542
    543	tc filter del dev $rp2 egress protocol all pref 1 handle 101 matchall
    544}
    545
    546tc_sample_acl_group_conflict_test()
    547{
    548	RET=0
    549
    550	# Test that two flower sampling rules cannot be configured on the same
    551	# port with different groups.
    552
    553	# Policy-based sampling is not supported on Spectrum-1.
    554	mlxsw_only_on_spectrum 2+ || return
    555
    556	tc filter add dev $rp1 ingress protocol ip pref 1 handle 101 flower \
    557		skip_sw action sample rate 1024 group 1
    558	check_err $? "Failed to configure sampling rule"
    559
    560	tc filter add dev $rp1 ingress protocol ip pref 2 handle 102 flower \
    561		skip_sw action sample rate 1024 group 1
    562	check_err $? "Failed to configure sampling rule with same group"
    563
    564	tc filter add dev $rp1 ingress protocol ip pref 3 handle 103 flower \
    565		skip_sw action sample rate 1024 group 2 &> /dev/null
    566	check_fail $? "Managed to configure sampling rule with conflicting group"
    567
    568	log_test "tc sample (w/ flower) group conflict test"
    569
    570	tc filter del dev $rp1 ingress protocol ip pref 2 handle 102 flower
    571	tc filter del dev $rp1 ingress protocol ip pref 1 handle 101 flower
    572}
    573
    574__tc_sample_acl_rate_test()
    575{
    576	local bind=$1; shift
    577	local port=$1; shift
    578	local pkts pct
    579
    580	RET=0
    581
    582	# Policy-based sampling is not supported on Spectrum-1.
    583	mlxsw_only_on_spectrum 2+ || return
    584
    585	tc filter add dev $port $bind protocol ip pref 1 handle 101 flower \
    586		skip_sw dst_ip 198.51.100.1 action sample rate 32 group 1
    587	check_err $? "Failed to configure sampling rule"
    588
    589	psample_capture_start
    590
    591	ip vrf exec v$h1 $MZ $h1 -c 320000 -d 100usec -p 64 -A 192.0.2.1 \
    592		-B 198.51.100.1 -t udp dp=52768,sp=42768 -q
    593
    594	psample_capture_stop
    595
    596	pkts=$(grep -e "group 1 " $CAPTURE_FILE | wc -l)
    597	pct=$((100 * (pkts - 10000) / 10000))
    598	(( -25 <= pct && pct <= 25))
    599	check_err $? "Expected 10000 packets, got $pkts packets, which is $pct% off. Required accuracy is +-25%"
    600
    601	# Setup a filter that should not match any packet and make sure packets
    602	# are not sampled.
    603	tc filter del dev $port $bind protocol ip pref 1 handle 101 flower
    604
    605	tc filter add dev $port $bind protocol ip pref 1 handle 101 flower \
    606		skip_sw dst_ip 198.51.100.10 action sample rate 32 group 1
    607	check_err $? "Failed to configure sampling rule"
    608
    609	psample_capture_start
    610
    611	ip vrf exec v$h1 $MZ $h1 -c 3200 -d 1msec -p 64 -A 192.0.2.1 \
    612		-B 198.51.100.1 -t udp dp=52768,sp=42768 -q
    613
    614	psample_capture_stop
    615
    616	grep -q -e "group 1 " $CAPTURE_FILE
    617	check_fail $? "Sampled packets when should not"
    618
    619	log_test "tc sample (w/ flower) rate ($bind)"
    620
    621	tc filter del dev $port $bind protocol ip pref 1 handle 101 flower
    622}
    623
    624tc_sample_acl_rate_test()
    625{
    626	__tc_sample_acl_rate_test ingress $rp1
    627	__tc_sample_acl_rate_test egress $rp2
    628}
    629
    630tc_sample_acl_max_rate_test()
    631{
    632	RET=0
    633
    634	# Policy-based sampling is not supported on Spectrum-1.
    635	mlxsw_only_on_spectrum 2+ || return
    636
    637	tc filter add dev $rp1 ingress protocol ip pref 1 handle 101 flower \
    638		skip_sw action sample rate $((2 ** 24 - 1)) group 1
    639	check_err $? "Failed to configure sampling rule with max rate"
    640
    641	tc filter del dev $rp1 ingress protocol ip pref 1 handle 101 flower
    642
    643	tc filter add dev $rp1 ingress protocol ip pref 1 handle 101 flower \
    644		skip_sw action sample rate $((2 ** 24)) \
    645		group 1 &> /dev/null
    646	check_fail $? "Managed to configure sampling rate above maximum"
    647
    648	log_test "tc sample (w/ flower) maximum rate"
    649}
    650
    651trap cleanup EXIT
    652
    653setup_prepare
    654setup_wait
    655
    656tests_run
    657
    658exit $EXIT_STATUS