2006-08-04 14:38:38 +04:00
# ifndef __NET_FIB_RULES_H
# define __NET_FIB_RULES_H
# include <linux/types.h>
# include <linux/netdevice.h>
# include <linux/fib_rules.h>
# include <net/flow.h>
2007-03-26 10:20:05 +04:00
# include <net/rtnetlink.h>
2006-08-04 14:38:38 +04:00
struct fib_rule
{
struct list_head list ;
atomic_t refcnt ;
int ifindex ;
char ifname [ IFNAMSIZ ] ;
2006-11-10 02:22:18 +03:00
u32 mark ;
u32 mark_mask ;
2006-08-04 14:38:38 +04:00
u32 pref ;
u32 flags ;
u32 table ;
u8 action ;
2007-03-27 04:14:15 +04:00
u32 target ;
struct fib_rule * ctarget ;
2006-08-04 14:38:38 +04:00
struct rcu_head rcu ;
2008-01-21 03:47:09 +03:00
struct net * fr_net ;
2006-08-04 14:38:38 +04:00
} ;
struct fib_lookup_arg
{
void * lookup_ptr ;
void * result ;
struct fib_rule * rule ;
} ;
struct fib_rules_ops
{
int family ;
struct list_head list ;
int rule_size ;
2007-03-24 22:46:02 +03:00
int addr_size ;
2007-03-27 04:14:15 +04:00
int unresolved_rules ;
int nr_goto_rules ;
2006-08-04 14:38:38 +04:00
int ( * action ) ( struct fib_rule * ,
struct flowi * , int ,
struct fib_lookup_arg * ) ;
int ( * match ) ( struct fib_rule * ,
struct flowi * , int ) ;
int ( * configure ) ( struct fib_rule * ,
struct sk_buff * ,
struct nlmsghdr * ,
struct fib_rule_hdr * ,
struct nlattr * * ) ;
int ( * compare ) ( struct fib_rule * ,
struct fib_rule_hdr * ,
struct nlattr * * ) ;
int ( * fill ) ( struct fib_rule * , struct sk_buff * ,
struct nlmsghdr * ,
struct fib_rule_hdr * ) ;
2008-01-10 14:18:25 +03:00
u32 ( * default_pref ) ( struct fib_rules_ops * ops ) ;
2006-11-11 01:10:15 +03:00
size_t ( * nlmsg_payload ) ( struct fib_rule * ) ;
2006-08-04 14:38:38 +04:00
2007-03-28 00:56:52 +04:00
/* Called after modifications to the rules set, must flush
* the route cache if one exists . */
void ( * flush_cache ) ( void ) ;
2006-08-04 14:38:38 +04:00
int nlgroup ;
2007-06-05 23:38:30 +04:00
const struct nla_policy * policy ;
2007-09-17 02:44:27 +04:00
struct list_head rules_list ;
2006-08-04 14:38:38 +04:00
struct module * owner ;
2008-01-21 03:46:01 +03:00
struct net * fro_net ;
2006-08-04 14:38:38 +04:00
} ;
2006-11-10 02:22:48 +03:00
# define FRA_GENERIC_POLICY \
[ FRA_IFNAME ] = { . type = NLA_STRING , . len = IFNAMSIZ - 1 } , \
[ FRA_PRIORITY ] = { . type = NLA_U32 } , \
[ FRA_FWMARK ] = { . type = NLA_U32 } , \
[ FRA_FWMASK ] = { . type = NLA_U32 } , \
2007-03-27 04:14:15 +04:00
[ FRA_TABLE ] = { . type = NLA_U32 } , \
[ FRA_GOTO ] = { . type = NLA_U32 }
2006-11-10 02:22:48 +03:00
2006-08-04 14:38:38 +04:00
static inline void fib_rule_get ( struct fib_rule * rule )
{
atomic_inc ( & rule - > refcnt ) ;
}
static inline void fib_rule_put_rcu ( struct rcu_head * head )
{
struct fib_rule * rule = container_of ( head , struct fib_rule , rcu ) ;
kfree ( rule ) ;
}
static inline void fib_rule_put ( struct fib_rule * rule )
{
if ( atomic_dec_and_test ( & rule - > refcnt ) )
call_rcu ( & rule - > rcu , fib_rule_put_rcu ) ;
}
2006-08-11 10:09:48 +04:00
static inline u32 frh_get_table ( struct fib_rule_hdr * frh , struct nlattr * * nla )
{
if ( nla [ FRA_TABLE ] )
return nla_get_u32 ( nla [ FRA_TABLE ] ) ;
return frh - > table ;
}
2008-01-21 03:46:41 +03:00
extern int fib_rules_register ( struct fib_rules_ops * ) ;
extern void fib_rules_unregister ( struct fib_rules_ops * ) ;
2007-12-07 11:42:52 +03:00
extern void fib_rules_cleanup_ops ( struct fib_rules_ops * ) ;
2006-08-04 14:38:38 +04:00
extern int fib_rules_lookup ( struct fib_rules_ops * ,
struct flowi * , int flags ,
struct fib_lookup_arg * ) ;
2007-11-11 09:12:03 +03:00
extern int fib_default_rule_add ( struct fib_rules_ops * ,
u32 pref , u32 table ,
u32 flags ) ;
2006-08-04 14:38:38 +04:00
# endif