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 u32 tcf_police_burst(const struct tc_action *act) 63 { 64 struct tcf_police *police = to_police(act); 65 struct tcf_police_params *params; 66 u32 burst; 67 68 params = rcu_dereference_protected(police->params, 69 lockdep_is_held(&police->tcf_lock)); 70 71 /* 72 * "rate" bytes "burst" nanoseconds 73 * ------------ * ------------------- 74 * 1 second 2^6 ticks 75 * 76 * ------------------------------------ 77 * NSEC_PER_SEC nanoseconds 78 * ------------------------ 79 * 2^6 ticks 80 * 81 * "rate" bytes "burst" nanoseconds 2^6 ticks 82 * = ------------ * ------------------- * ------------------------ 83 * 1 second 2^6 ticks NSEC_PER_SEC nanoseconds 84 * 85 * "rate" * "burst" 86 * = ---------------- bytes/nanosecond 87 * NSEC_PER_SEC^2 88 * 89 * 90 * "rate" * "burst" 91 * = ---------------- bytes/second 92 * NSEC_PER_SEC 93 */ 94 burst = div_u64(params->tcfp_burst * params->rate.rate_bytes_ps, 95 NSEC_PER_SEC); 96 97 return burst; 98 } 99 100 static inline u32 tcf_police_tcfp_mtu(const struct tc_action *act) 101 { 102 struct tcf_police *police = to_police(act); 103 struct tcf_police_params *params; 104 105 params = rcu_dereference_protected(police->params, 106 lockdep_is_held(&police->tcf_lock)); 107 return params->tcfp_mtu; 108 } 109 110 #endif /* __NET_TC_POLICE_H */ 111