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 7struct 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 20struct 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 */ 33struct 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 43static 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 52static 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 62static 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 100static 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