1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# Test that policers shared by different tc filters are correctly reference
5# counted by observing policers' occupancy via devlink-resource.
6
7lib_dir=$(dirname $0)/../../../net/forwarding
8
9ALL_TESTS="
10	tc_police_occ_test
11"
12NUM_NETIFS=2
13source $lib_dir/lib.sh
14source $lib_dir/devlink_lib.sh
15
16h1_create()
17{
18	simple_if_init $h1
19}
20
21h1_destroy()
22{
23	simple_if_fini $h1
24}
25
26switch_create()
27{
28	simple_if_init $swp1
29	tc qdisc add dev $swp1 clsact
30}
31
32switch_destroy()
33{
34	tc qdisc del dev $swp1 clsact
35	simple_if_fini $swp1
36}
37
38setup_prepare()
39{
40	h1=${NETIFS[p1]}
41	swp1=${NETIFS[p2]}
42
43	vrf_prepare
44
45	h1_create
46	switch_create
47}
48
49cleanup()
50{
51	pre_cleanup
52
53	switch_destroy
54	h1_destroy
55
56	vrf_cleanup
57}
58
59tc_police_occ_get()
60{
61	devlink_resource_occ_get global_policers single_rate_policers
62}
63
64tc_police_occ_test()
65{
66	RET=0
67
68	local occ=$(tc_police_occ_get)
69
70	tc filter add dev $swp1 ingress pref 1 handle 101 proto ip \
71		flower skip_sw \
72		action police rate 100mbit burst 100k conform-exceed drop/ok
73	(( occ + 1 == $(tc_police_occ_get) ))
74	check_err $? "Got occupancy $(tc_police_occ_get), expected $((occ + 1))"
75
76	tc filter del dev $swp1 ingress pref 1 handle 101 flower
77	(( occ == $(tc_police_occ_get) ))
78	check_err $? "Got occupancy $(tc_police_occ_get), expected $occ"
79
80	tc filter add dev $swp1 ingress pref 1 handle 101 proto ip \
81		flower skip_sw \
82		action police rate 100mbit burst 100k conform-exceed drop/ok \
83		index 10
84	tc filter add dev $swp1 ingress pref 2 handle 102 proto ip \
85		flower skip_sw action police index 10
86
87	(( occ + 1 == $(tc_police_occ_get) ))
88	check_err $? "Got occupancy $(tc_police_occ_get), expected $((occ + 1))"
89
90	tc filter del dev $swp1 ingress pref 2 handle 102 flower
91	(( occ + 1 == $(tc_police_occ_get) ))
92	check_err $? "Got occupancy $(tc_police_occ_get), expected $((occ + 1))"
93
94	tc filter del dev $swp1 ingress pref 1 handle 101 flower
95	(( occ == $(tc_police_occ_get) ))
96	check_err $? "Got occupancy $(tc_police_occ_get), expected $occ"
97
98	log_test "tc police occupancy"
99}
100
101trap cleanup EXIT
102
103setup_prepare
104setup_wait
105
106tests_run
107
108exit $EXIT_STATUS
109