2006-08-04 03:38:38 -07: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-25 23:20:05 -07:00
# include <net/rtnetlink.h>
2006-08-04 03:38:38 -07:00
struct fib_rule
{
struct list_head list ;
atomic_t refcnt ;
int ifindex ;
char ifname [ IFNAMSIZ ] ;
2006-11-09 15:22:18 -08:00
u32 mark ;
u32 mark_mask ;
2006-08-04 03:38:38 -07:00
u32 pref ;
u32 flags ;
u32 table ;
u8 action ;
2007-03-26 17:14:15 -07:00
u32 target ;
struct fib_rule * ctarget ;
2006-08-04 03:38:38 -07:00
struct rcu_head rcu ;
2008-01-20 16:47:09 -08:00
struct net * fr_net ;
2006-08-04 03:38:38 -07: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 12:46:02 -07:00
int addr_size ;
2007-03-26 17:14:15 -07:00
int unresolved_rules ;
int nr_goto_rules ;
2006-08-04 03:38:38 -07: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 03:18:25 -08:00
u32 ( * default_pref ) ( struct fib_rules_ops * ops ) ;
2006-11-10 14:10:15 -08:00
size_t ( * nlmsg_payload ) ( struct fib_rule * ) ;
2006-08-04 03:38:38 -07:00
2007-03-27 13:56:52 -07:00
/* Called after modifications to the rules set, must flush
* the route cache if one exists . */
2008-07-05 19:01:28 -07:00
void ( * flush_cache ) ( struct fib_rules_ops * ops ) ;
2007-03-27 13:56:52 -07:00
2006-08-04 03:38:38 -07:00
int nlgroup ;
2007-06-05 12:38:30 -07:00
const struct nla_policy * policy ;
2007-09-16 15:44:27 -07:00
struct list_head rules_list ;
2006-08-04 03:38:38 -07:00
struct module * owner ;
2008-01-20 16:46:01 -08:00
struct net * fro_net ;
2006-08-04 03:38:38 -07:00
} ;
2006-11-09 15:22:48 -08: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-26 17:14:15 -07:00
[ FRA_TABLE ] = { . type = NLA_U32 } , \
[ FRA_GOTO ] = { . type = NLA_U32 }
2006-11-09 15:22:48 -08:00
2006-08-04 03:38:38 -07: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 ) ;
2008-04-16 02:01:56 -07:00
release_net ( rule - > fr_net ) ;
2006-08-04 03:38:38 -07:00
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-10 23:09:48 -07: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-20 16:46:41 -08:00
extern int fib_rules_register ( struct fib_rules_ops * ) ;
extern void fib_rules_unregister ( struct fib_rules_ops * ) ;
2007-12-07 00:42:52 -08:00
extern void fib_rules_cleanup_ops ( struct fib_rules_ops * ) ;
2006-08-04 03:38:38 -07:00
extern int fib_rules_lookup ( struct fib_rules_ops * ,
struct flowi * , int flags ,
struct fib_lookup_arg * ) ;
2007-11-10 22:12:03 -08:00
extern int fib_default_rule_add ( struct fib_rules_ops * ,
u32 pref , u32 table ,
u32 flags ) ;
2006-08-04 03:38:38 -07:00
# endif