2005-04-17 02:20:36 +04:00
# ifndef __NET_ACT_API_H
# define __NET_ACT_API_H
/*
* Public police action API for classifiers / qdiscs
*/
# include <net/sch_generic.h>
# include <net/pkt_sched.h>
2006-08-22 10:54:55 +04:00
struct tcf_common {
struct tcf_common * tcfc_next ;
u32 tcfc_index ;
int tcfc_refcnt ;
int tcfc_bindcnt ;
u32 tcfc_capab ;
int tcfc_action ;
struct tcf_t tcfc_tm ;
2009-08-16 13:36:49 +04:00
struct gnet_stats_basic_packed tcfc_bstats ;
2006-08-22 10:54:55 +04:00
struct gnet_stats_queue tcfc_qstats ;
struct gnet_stats_rate_est tcfc_rate_est ;
spinlock_t tcfc_lock ;
} ;
# define tcf_next common.tcfc_next
# define tcf_index common.tcfc_index
# define tcf_refcnt common.tcfc_refcnt
# define tcf_bindcnt common.tcfc_bindcnt
# define tcf_capab common.tcfc_capab
# define tcf_action common.tcfc_action
# define tcf_tm common.tcfc_tm
# define tcf_bstats common.tcfc_bstats
# define tcf_qstats common.tcfc_qstats
# define tcf_rate_est common.tcfc_rate_est
# define tcf_lock common.tcfc_lock
struct tcf_police {
struct tcf_common common ;
int tcfp_result ;
u32 tcfp_ewma_rate ;
u32 tcfp_burst ;
u32 tcfp_mtu ;
u32 tcfp_toks ;
u32 tcfp_ptoks ;
psched_time_t tcfp_t_c ;
struct qdisc_rate_table * tcfp_R_tab ;
struct qdisc_rate_table * tcfp_P_tab ;
2005-04-17 02:20:36 +04:00
} ;
2006-08-22 10:54:55 +04:00
# define to_police(pc) \
container_of ( pc , struct tcf_police , common )
struct tcf_hashinfo {
struct tcf_common * * htab ;
unsigned int hmask ;
rwlock_t * lock ;
} ;
static inline unsigned int tcf_hash ( u32 index , unsigned int hmask )
{
return index & hmask ;
}
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_NET_CLS_ACT
# define ACT_P_CREATED 1
# define ACT_P_DELETED 1
2006-08-22 10:54:55 +04:00
struct tcf_act_hdr {
struct tcf_common common ;
2005-04-17 02:20:36 +04:00
} ;
2006-08-22 10:54:55 +04:00
struct tc_action {
void * priv ;
struct tc_action_ops * ops ;
__u32 type ; /* for backward compat(TCA_OLD_COMPAT) */
__u32 order ;
struct tc_action * next ;
2005-04-17 02:20:36 +04:00
} ;
# define TCA_CAP_NONE 0
2006-08-22 10:54:55 +04:00
struct tc_action_ops {
2005-04-17 02:20:36 +04:00
struct tc_action_ops * next ;
2006-08-22 10:54:55 +04:00
struct tcf_hashinfo * hinfo ;
2005-04-17 02:20:36 +04:00
char kind [ IFNAMSIZ ] ;
__u32 type ; /* TBD to match kind */
__u32 capab ; /* capabilities includes 4 bit version */
struct module * owner ;
2006-01-09 09:15:34 +03:00
int ( * act ) ( struct sk_buff * , struct tc_action * , struct tcf_result * ) ;
2005-04-17 02:20:36 +04:00
int ( * get_stats ) ( struct sk_buff * , struct tc_action * ) ;
2006-08-22 10:54:55 +04:00
int ( * dump ) ( struct sk_buff * , struct tc_action * , int , int ) ;
2005-04-17 02:20:36 +04:00
int ( * cleanup ) ( struct tc_action * , int bind ) ;
2006-08-22 10:54:55 +04:00
int ( * lookup ) ( struct tc_action * , u32 ) ;
2008-01-23 09:11:50 +03:00
int ( * init ) ( struct nlattr * , struct nlattr * , struct tc_action * , int , int ) ;
2006-08-22 10:54:55 +04:00
int ( * walk ) ( struct sk_buff * , struct netlink_callback * , int , struct tc_action * ) ;
2005-04-17 02:20:36 +04:00
} ;
2006-08-22 10:54:55 +04:00
extern struct tcf_common * tcf_hash_lookup ( u32 index ,
struct tcf_hashinfo * hinfo ) ;
extern void tcf_hash_destroy ( struct tcf_common * p , struct tcf_hashinfo * hinfo ) ;
extern int tcf_hash_release ( struct tcf_common * p , int bind ,
struct tcf_hashinfo * hinfo ) ;
extern int tcf_generic_walker ( struct sk_buff * skb , struct netlink_callback * cb ,
int type , struct tc_action * a ) ;
extern u32 tcf_hash_new_index ( u32 * idx_gen , struct tcf_hashinfo * hinfo ) ;
extern int tcf_hash_search ( struct tc_action * a , u32 index ) ;
extern struct tcf_common * tcf_hash_check ( u32 index , struct tc_action * a ,
int bind , struct tcf_hashinfo * hinfo ) ;
2008-01-23 09:11:50 +03:00
extern struct tcf_common * tcf_hash_create ( u32 index , struct nlattr * est ,
2006-08-22 10:54:55 +04:00
struct tc_action * a , int size ,
int bind , u32 * idx_gen ,
struct tcf_hashinfo * hinfo ) ;
extern void tcf_hash_insert ( struct tcf_common * p , struct tcf_hashinfo * hinfo ) ;
2005-04-17 02:20:36 +04:00
extern int tcf_register_action ( struct tc_action_ops * a ) ;
extern int tcf_unregister_action ( struct tc_action_ops * a ) ;
extern void tcf_action_destroy ( struct tc_action * a , int bind ) ;
extern int tcf_action_exec ( struct sk_buff * skb , struct tc_action * a , struct tcf_result * res ) ;
2008-01-24 07:33:13 +03:00
extern struct tc_action * tcf_action_init ( struct nlattr * nla , struct nlattr * est , char * n , int ovr , int bind ) ;
extern struct tc_action * tcf_action_init_1 ( struct nlattr * nla , struct nlattr * est , char * n , int ovr , int bind ) ;
2005-04-17 02:20:36 +04:00
extern int tcf_action_dump ( struct sk_buff * skb , struct tc_action * a , int , int ) ;
extern int tcf_action_dump_old ( struct sk_buff * skb , struct tc_action * a , int , int ) ;
extern int tcf_action_dump_1 ( struct sk_buff * skb , struct tc_action * a , int , int ) ;
extern int tcf_action_copy_stats ( struct sk_buff * , struct tc_action * , int ) ;
# endif /* CONFIG_NET_CLS_ACT */
# endif