2019-05-04 04:46:21 -07:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef __NET_TC_POLICE_H
# define __NET_TC_POLICE_H
# include <net/act_api.h>
struct tcf_police_params {
int tcfp_result ;
u32 tcfp_ewma_rate ;
s64 tcfp_burst ;
u32 tcfp_mtu ;
s64 tcfp_mtu_ptoks ;
struct psched_ratecfg rate ;
bool rate_present ;
struct psched_ratecfg peak ;
bool peak_present ;
struct rcu_head rcu ;
} ;
struct tcf_police {
struct tc_action common ;
struct tcf_police_params __rcu * params ;
spinlock_t tcfp_lock ____cacheline_aligned_in_smp ;
s64 tcfp_toks ;
s64 tcfp_ptoks ;
s64 tcfp_t_c ;
} ;
# define to_police(pc) ((struct tcf_police *)pc)
/* old policer structure from before tc actions */
struct tc_police_compat {
u32 index ;
int action ;
u32 limit ;
u32 burst ;
u32 mtu ;
struct tc_ratespec rate ;
struct tc_ratespec peakrate ;
} ;
static inline bool is_tcf_police ( const struct tc_action * act )
{
# ifdef CONFIG_NET_CLS_ACT
if ( act - > ops & & act - > ops - > id = = TCA_ID_POLICE )
return true ;
# endif
return false ;
}
static inline u64 tcf_police_rate_bytes_ps ( const struct tc_action * act )
{
struct tcf_police * police = to_police ( act ) ;
struct tcf_police_params * params ;
2020-02-17 12:12:10 +02:00
params = rcu_dereference_protected ( police - > params ,
lockdep_is_held ( & police - > tcf_lock ) ) ;
2019-05-04 04:46:21 -07:00
return params - > rate . rate_bytes_ps ;
}
2020-06-29 14:54:16 +08:00
static inline u32 tcf_police_burst ( const struct tc_action * act )
2019-05-04 04:46:21 -07:00
{
struct tcf_police * police = to_police ( act ) ;
struct tcf_police_params * params ;
2020-06-29 14:54:16 +08:00
u32 burst ;
2019-05-04 04:46:21 -07:00
2020-02-17 12:12:10 +02:00
params = rcu_dereference_protected ( police - > params ,
lockdep_is_held ( & police - > tcf_lock ) ) ;
2020-06-29 14:54:16 +08:00
/*
* " rate " bytes " burst " nanoseconds
* - - - - - - - - - - - - * - - - - - - - - - - - - - - - - - - -
* 1 second 2 ^ 6 ticks
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* NSEC_PER_SEC nanoseconds
* - - - - - - - - - - - - - - - - - - - - - - - -
* 2 ^ 6 ticks
*
* " rate " bytes " burst " nanoseconds 2 ^ 6 ticks
* = - - - - - - - - - - - - * - - - - - - - - - - - - - - - - - - - * - - - - - - - - - - - - - - - - - - - - - - - -
* 1 second 2 ^ 6 ticks NSEC_PER_SEC nanoseconds
*
* " rate " * " burst "
* = - - - - - - - - - - - - - - - - bytes / nanosecond
* NSEC_PER_SEC ^ 2
*
*
* " rate " * " burst "
* = - - - - - - - - - - - - - - - - bytes / second
* NSEC_PER_SEC
*/
burst = div_u64 ( params - > tcfp_burst * params - > rate . rate_bytes_ps ,
NSEC_PER_SEC ) ;
return burst ;
2019-05-04 04:46:21 -07:00
}
2020-06-24 17:36:28 +08:00
static inline u32 tcf_police_tcfp_mtu ( const struct tc_action * act )
{
struct tcf_police * police = to_police ( act ) ;
struct tcf_police_params * params ;
params = rcu_dereference_protected ( police - > params ,
lockdep_is_held ( & police - > tcf_lock ) ) ;
return params - > tcfp_mtu ;
}
2019-05-04 04:46:21 -07:00
# endif /* __NET_TC_POLICE_H */