xref: /linux/include/net/tc_act/tc_police.h (revision 8be4d31cb8aaeea27bde4b7ddb26e28a89062ebf)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __NET_TC_POLICE_H
3 #define __NET_TC_POLICE_H
4 
5 #include <net/act_api.h>
6 
7 struct tcf_police_params {
8 	int			action;
9 	int			tcfp_result;
10 	u32			tcfp_ewma_rate;
11 	u32			tcfp_mtu;
12 	s64			tcfp_burst;
13 	s64			tcfp_mtu_ptoks;
14 	s64			tcfp_pkt_burst;
15 	struct psched_ratecfg	rate;
16 	bool			rate_present;
17 	struct psched_ratecfg	peak;
18 	bool			peak_present;
19 	struct psched_pktrate	ppsrate;
20 	bool			pps_present;
21 	struct rcu_head rcu;
22 };
23 
24 struct tcf_police {
25 	struct tc_action	common;
26 	struct tcf_police_params __rcu *params;
27 
28 	spinlock_t		tcfp_lock ____cacheline_aligned_in_smp;
29 	s64			tcfp_toks;
30 	s64			tcfp_ptoks;
31 	s64			tcfp_pkttoks;
32 	s64			tcfp_t_c;
33 };
34 
35 #define to_police(pc) ((struct tcf_police *)pc)
36 
37 /* old policer structure from before tc actions */
38 struct tc_police_compat {
39 	u32			index;
40 	int			action;
41 	u32			limit;
42 	u32			burst;
43 	u32			mtu;
44 	struct tc_ratespec	rate;
45 	struct tc_ratespec	peakrate;
46 };
47 
tcf_police_rate_bytes_ps(const struct tc_action * act)48 static inline u64 tcf_police_rate_bytes_ps(const struct tc_action *act)
49 {
50 	struct tcf_police *police = to_police(act);
51 	struct tcf_police_params *params;
52 
53 	params = rcu_dereference_protected(police->params,
54 					   lockdep_is_held(&police->tcf_lock));
55 	return params->rate.rate_bytes_ps;
56 }
57 
tcf_police_burst(const struct tc_action * act)58 static inline u32 tcf_police_burst(const struct tc_action *act)
59 {
60 	struct tcf_police *police = to_police(act);
61 	struct tcf_police_params *params;
62 	u32 burst;
63 
64 	params = rcu_dereference_protected(police->params,
65 					   lockdep_is_held(&police->tcf_lock));
66 
67 	/*
68 	 *  "rate" bytes   "burst" nanoseconds
69 	 *  ------------ * -------------------
70 	 *    1 second          2^6 ticks
71 	 *
72 	 * ------------------------------------
73 	 *        NSEC_PER_SEC nanoseconds
74 	 *        ------------------------
75 	 *              2^6 ticks
76 	 *
77 	 *    "rate" bytes   "burst" nanoseconds            2^6 ticks
78 	 *  = ------------ * ------------------- * ------------------------
79 	 *      1 second          2^6 ticks        NSEC_PER_SEC nanoseconds
80 	 *
81 	 *   "rate" * "burst"
82 	 * = ---------------- bytes/nanosecond
83 	 *    NSEC_PER_SEC^2
84 	 *
85 	 *
86 	 *   "rate" * "burst"
87 	 * = ---------------- bytes/second
88 	 *     NSEC_PER_SEC
89 	 */
90 	burst = div_u64(params->tcfp_burst * params->rate.rate_bytes_ps,
91 			NSEC_PER_SEC);
92 
93 	return burst;
94 }
95 
tcf_police_rate_pkt_ps(const struct tc_action * act)96 static inline u64 tcf_police_rate_pkt_ps(const struct tc_action *act)
97 {
98 	struct tcf_police *police = to_police(act);
99 	struct tcf_police_params *params;
100 
101 	params = rcu_dereference_protected(police->params,
102 					   lockdep_is_held(&police->tcf_lock));
103 	return params->ppsrate.rate_pkts_ps;
104 }
105 
tcf_police_burst_pkt(const struct tc_action * act)106 static inline u32 tcf_police_burst_pkt(const struct tc_action *act)
107 {
108 	struct tcf_police *police = to_police(act);
109 	struct tcf_police_params *params;
110 	u32 burst;
111 
112 	params = rcu_dereference_protected(police->params,
113 					   lockdep_is_held(&police->tcf_lock));
114 
115 	/*
116 	 *  "rate" pkts     "burst" nanoseconds
117 	 *  ------------ *  -------------------
118 	 *    1 second          2^6 ticks
119 	 *
120 	 * ------------------------------------
121 	 *        NSEC_PER_SEC nanoseconds
122 	 *        ------------------------
123 	 *              2^6 ticks
124 	 *
125 	 *    "rate" pkts    "burst" nanoseconds            2^6 ticks
126 	 *  = ------------ * ------------------- * ------------------------
127 	 *      1 second          2^6 ticks        NSEC_PER_SEC nanoseconds
128 	 *
129 	 *   "rate" * "burst"
130 	 * = ---------------- pkts/nanosecond
131 	 *    NSEC_PER_SEC^2
132 	 *
133 	 *
134 	 *   "rate" * "burst"
135 	 * = ---------------- pkts/second
136 	 *     NSEC_PER_SEC
137 	 */
138 	burst = div_u64(params->tcfp_pkt_burst * params->ppsrate.rate_pkts_ps,
139 			NSEC_PER_SEC);
140 
141 	return burst;
142 }
143 
tcf_police_tcfp_mtu(const struct tc_action * act)144 static inline u32 tcf_police_tcfp_mtu(const struct tc_action *act)
145 {
146 	struct tcf_police *police = to_police(act);
147 	struct tcf_police_params *params;
148 
149 	params = rcu_dereference_protected(police->params,
150 					   lockdep_is_held(&police->tcf_lock));
151 	return params->tcfp_mtu;
152 }
153 
tcf_police_peakrate_bytes_ps(const struct tc_action * act)154 static inline u64 tcf_police_peakrate_bytes_ps(const struct tc_action *act)
155 {
156 	struct tcf_police *police = to_police(act);
157 	struct tcf_police_params *params;
158 
159 	params = rcu_dereference_protected(police->params,
160 					   lockdep_is_held(&police->tcf_lock));
161 	return params->peak.rate_bytes_ps;
162 }
163 
tcf_police_tcfp_ewma_rate(const struct tc_action * act)164 static inline u32 tcf_police_tcfp_ewma_rate(const struct tc_action *act)
165 {
166 	struct tcf_police *police = to_police(act);
167 	struct tcf_police_params *params;
168 
169 	params = rcu_dereference_protected(police->params,
170 					   lockdep_is_held(&police->tcf_lock));
171 	return params->tcfp_ewma_rate;
172 }
173 
tcf_police_rate_overhead(const struct tc_action * act)174 static inline u16 tcf_police_rate_overhead(const struct tc_action *act)
175 {
176 	struct tcf_police *police = to_police(act);
177 	struct tcf_police_params *params;
178 
179 	params = rcu_dereference_protected(police->params,
180 					   lockdep_is_held(&police->tcf_lock));
181 	return params->rate.overhead;
182 }
183 
184 #endif /* __NET_TC_POLICE_H */
185