1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __NET_TC_POLICE_H 3*4882a593Smuzhiyun #define __NET_TC_POLICE_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <net/act_api.h> 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun struct tcf_police_params { 8*4882a593Smuzhiyun int tcfp_result; 9*4882a593Smuzhiyun u32 tcfp_ewma_rate; 10*4882a593Smuzhiyun s64 tcfp_burst; 11*4882a593Smuzhiyun u32 tcfp_mtu; 12*4882a593Smuzhiyun s64 tcfp_mtu_ptoks; 13*4882a593Smuzhiyun struct psched_ratecfg rate; 14*4882a593Smuzhiyun bool rate_present; 15*4882a593Smuzhiyun struct psched_ratecfg peak; 16*4882a593Smuzhiyun bool peak_present; 17*4882a593Smuzhiyun struct rcu_head rcu; 18*4882a593Smuzhiyun }; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun struct tcf_police { 21*4882a593Smuzhiyun struct tc_action common; 22*4882a593Smuzhiyun struct tcf_police_params __rcu *params; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun spinlock_t tcfp_lock ____cacheline_aligned_in_smp; 25*4882a593Smuzhiyun s64 tcfp_toks; 26*4882a593Smuzhiyun s64 tcfp_ptoks; 27*4882a593Smuzhiyun s64 tcfp_t_c; 28*4882a593Smuzhiyun }; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define to_police(pc) ((struct tcf_police *)pc) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* old policer structure from before tc actions */ 33*4882a593Smuzhiyun struct tc_police_compat { 34*4882a593Smuzhiyun u32 index; 35*4882a593Smuzhiyun int action; 36*4882a593Smuzhiyun u32 limit; 37*4882a593Smuzhiyun u32 burst; 38*4882a593Smuzhiyun u32 mtu; 39*4882a593Smuzhiyun struct tc_ratespec rate; 40*4882a593Smuzhiyun struct tc_ratespec peakrate; 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun is_tcf_police(const struct tc_action * act)43*4882a593Smuzhiyunstatic inline bool is_tcf_police(const struct tc_action *act) 44*4882a593Smuzhiyun { 45*4882a593Smuzhiyun #ifdef CONFIG_NET_CLS_ACT 46*4882a593Smuzhiyun if (act->ops && act->ops->id == TCA_ID_POLICE) 47*4882a593Smuzhiyun return true; 48*4882a593Smuzhiyun #endif 49*4882a593Smuzhiyun return false; 50*4882a593Smuzhiyun } 51*4882a593Smuzhiyun tcf_police_rate_bytes_ps(const struct tc_action * act)52*4882a593Smuzhiyunstatic inline u64 tcf_police_rate_bytes_ps(const struct tc_action *act) 53*4882a593Smuzhiyun { 54*4882a593Smuzhiyun struct tcf_police *police = to_police(act); 55*4882a593Smuzhiyun struct tcf_police_params *params; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun params = rcu_dereference_protected(police->params, 58*4882a593Smuzhiyun lockdep_is_held(&police->tcf_lock)); 59*4882a593Smuzhiyun return params->rate.rate_bytes_ps; 60*4882a593Smuzhiyun } 61*4882a593Smuzhiyun tcf_police_burst(const struct tc_action * act)62*4882a593Smuzhiyunstatic inline u32 tcf_police_burst(const struct tc_action *act) 63*4882a593Smuzhiyun { 64*4882a593Smuzhiyun struct tcf_police *police = to_police(act); 65*4882a593Smuzhiyun struct tcf_police_params *params; 66*4882a593Smuzhiyun u32 burst; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun params = rcu_dereference_protected(police->params, 69*4882a593Smuzhiyun lockdep_is_held(&police->tcf_lock)); 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* 72*4882a593Smuzhiyun * "rate" bytes "burst" nanoseconds 73*4882a593Smuzhiyun * ------------ * ------------------- 74*4882a593Smuzhiyun * 1 second 2^6 ticks 75*4882a593Smuzhiyun * 76*4882a593Smuzhiyun * ------------------------------------ 77*4882a593Smuzhiyun * NSEC_PER_SEC nanoseconds 78*4882a593Smuzhiyun * ------------------------ 79*4882a593Smuzhiyun * 2^6 ticks 80*4882a593Smuzhiyun * 81*4882a593Smuzhiyun * "rate" bytes "burst" nanoseconds 2^6 ticks 82*4882a593Smuzhiyun * = ------------ * ------------------- * ------------------------ 83*4882a593Smuzhiyun * 1 second 2^6 ticks NSEC_PER_SEC nanoseconds 84*4882a593Smuzhiyun * 85*4882a593Smuzhiyun * "rate" * "burst" 86*4882a593Smuzhiyun * = ---------------- bytes/nanosecond 87*4882a593Smuzhiyun * NSEC_PER_SEC^2 88*4882a593Smuzhiyun * 89*4882a593Smuzhiyun * 90*4882a593Smuzhiyun * "rate" * "burst" 91*4882a593Smuzhiyun * = ---------------- bytes/second 92*4882a593Smuzhiyun * NSEC_PER_SEC 93*4882a593Smuzhiyun */ 94*4882a593Smuzhiyun burst = div_u64(params->tcfp_burst * params->rate.rate_bytes_ps, 95*4882a593Smuzhiyun NSEC_PER_SEC); 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun return burst; 98*4882a593Smuzhiyun } 99*4882a593Smuzhiyun tcf_police_tcfp_mtu(const struct tc_action * act)100*4882a593Smuzhiyunstatic inline u32 tcf_police_tcfp_mtu(const struct tc_action *act) 101*4882a593Smuzhiyun { 102*4882a593Smuzhiyun struct tcf_police *police = to_police(act); 103*4882a593Smuzhiyun struct tcf_police_params *params; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun params = rcu_dereference_protected(police->params, 106*4882a593Smuzhiyun lockdep_is_held(&police->tcf_lock)); 107*4882a593Smuzhiyun return params->tcfp_mtu; 108*4882a593Smuzhiyun } 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun #endif /* __NET_TC_POLICE_H */ 111