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 tcfp_result; 9 u32 tcfp_ewma_rate; 10 s64 tcfp_burst; 11 u32 tcfp_mtu; 12 s64 tcfp_mtu_ptoks; 13 struct psched_ratecfg rate; 14 bool rate_present; 15 struct psched_ratecfg peak; 16 bool peak_present; 17 struct rcu_head rcu; 18 }; 19 20 struct tcf_police { 21 struct tc_action common; 22 struct tcf_police_params __rcu *params; 23 24 spinlock_t tcfp_lock ____cacheline_aligned_in_smp; 25 s64 tcfp_toks; 26 s64 tcfp_ptoks; 27 s64 tcfp_t_c; 28 }; 29 30 #define to_police(pc) ((struct tcf_police *)pc) 31 32 /* old policer structure from before tc actions */ 33 struct tc_police_compat { 34 u32 index; 35 int action; 36 u32 limit; 37 u32 burst; 38 u32 mtu; 39 struct tc_ratespec rate; 40 struct tc_ratespec peakrate; 41 }; 42 43 static inline bool is_tcf_police(const struct tc_action *act) 44 { 45 #ifdef CONFIG_NET_CLS_ACT 46 if (act->ops && act->ops->id == TCA_ID_POLICE) 47 return true; 48 #endif 49 return false; 50 } 51 52 static inline u64 tcf_police_rate_bytes_ps(const struct tc_action *act) 53 { 54 struct tcf_police *police = to_police(act); 55 struct tcf_police_params *params; 56 57 params = rcu_dereference_protected(police->params, 58 lockdep_is_held(&police->tcf_lock)); 59 return params->rate.rate_bytes_ps; 60 } 61 62 static inline s64 tcf_police_tcfp_burst(const struct tc_action *act) 63 { 64 struct tcf_police *police = to_police(act); 65 struct tcf_police_params *params; 66 67 params = rcu_dereference_protected(police->params, 68 lockdep_is_held(&police->tcf_lock)); 69 return params->tcfp_burst; 70 } 71 72 #endif /* __NET_TC_POLICE_H */ 73