2005-04-17 02:20:36 +04:00
# ifndef _NET_DN_FIB_H
# define _NET_DN_FIB_H
2013-03-21 11:45:28 +04:00
# include <linux/netlink.h>
extern const struct nla_policy rtm_dn_policy [ ] ;
2005-04-17 02:20:36 +04:00
struct dn_fib_res {
2006-08-10 02:56:46 +04:00
struct fib_rule * r ;
2005-04-17 02:20:36 +04:00
struct dn_fib_info * fi ;
unsigned char prefixlen ;
unsigned char nh_sel ;
unsigned char type ;
unsigned char scope ;
} ;
struct dn_fib_nh {
struct net_device * nh_dev ;
2012-04-15 09:58:06 +04:00
unsigned int nh_flags ;
2005-04-17 02:20:36 +04:00
unsigned char nh_scope ;
int nh_weight ;
int nh_power ;
int nh_oif ;
2006-03-21 09:42:39 +03:00
__le16 nh_gw ;
2005-04-17 02:20:36 +04:00
} ;
struct dn_fib_info {
struct dn_fib_info * fib_next ;
struct dn_fib_info * fib_prev ;
int fib_treeref ;
atomic_t fib_clntref ;
int fib_dead ;
2012-04-15 09:58:06 +04:00
unsigned int fib_flags ;
2005-04-17 02:20:36 +04:00
int fib_protocol ;
2006-03-21 09:42:39 +03:00
__le16 fib_prefsrc ;
2005-04-17 02:20:36 +04:00
__u32 fib_priority ;
__u32 fib_metrics [ RTAX_MAX ] ;
int fib_nhs ;
int fib_power ;
struct dn_fib_nh fib_nh [ 0 ] ;
# define dn_fib_dev fib_nh[0].nh_dev
} ;
# define DN_FIB_RES_RESET(res) ((res).nh_sel = 0)
# define DN_FIB_RES_NH(res) ((res).fi->fib_nh[(res).nh_sel])
# define DN_FIB_RES_PREFSRC(res) ((res).fi->fib_prefsrc ? : __dn_fib_res_prefsrc(&res))
# define DN_FIB_RES_GW(res) (DN_FIB_RES_NH(res).nh_gw)
# define DN_FIB_RES_DEV(res) (DN_FIB_RES_NH(res).nh_dev)
# define DN_FIB_RES_OIF(res) (DN_FIB_RES_NH(res).nh_oif)
typedef struct {
2006-03-21 09:42:39 +03:00
__le16 datum ;
2005-04-17 02:20:36 +04:00
} dn_fib_key_t ;
typedef struct {
2006-03-21 09:42:39 +03:00
__le16 datum ;
2005-04-17 02:20:36 +04:00
} dn_fib_hash_t ;
typedef struct {
2006-03-21 09:42:39 +03:00
__u16 datum ;
2005-04-17 02:20:36 +04:00
} dn_fib_idx_t ;
struct dn_fib_node {
struct dn_fib_node * fn_next ;
struct dn_fib_info * fn_info ;
# define DN_FIB_INFO(f) ((f)->fn_info)
dn_fib_key_t fn_key ;
u8 fn_type ;
u8 fn_scope ;
u8 fn_state ;
} ;
struct dn_fib_table {
2006-08-11 10:11:47 +04:00
struct hlist_node hlist ;
2006-08-11 10:08:33 +04:00
u32 n ;
2005-04-17 02:20:36 +04:00
int ( * insert ) ( struct dn_fib_table * t , struct rtmsg * r ,
2013-03-21 11:45:28 +04:00
struct nlattr * attrs [ ] , struct nlmsghdr * n ,
2005-04-17 02:20:36 +04:00
struct netlink_skb_parms * req ) ;
int ( * delete ) ( struct dn_fib_table * t , struct rtmsg * r ,
2013-03-21 11:45:28 +04:00
struct nlattr * attrs [ ] , struct nlmsghdr * n ,
2005-04-17 02:20:36 +04:00
struct netlink_skb_parms * req ) ;
2011-03-13 01:17:10 +03:00
int ( * lookup ) ( struct dn_fib_table * t , const struct flowidn * fld ,
2005-04-17 02:20:36 +04:00
struct dn_fib_res * res ) ;
int ( * flush ) ( struct dn_fib_table * t ) ;
int ( * dump ) ( struct dn_fib_table * t , struct sk_buff * skb , struct netlink_callback * cb ) ;
unsigned char data [ 0 ] ;
} ;
# ifdef CONFIG_DECNET_ROUTER
/*
* dn_fib . c
*/
2013-09-20 22:23:20 +04:00
void dn_fib_init ( void ) ;
void dn_fib_cleanup ( void ) ;
int dn_fib_ioctl ( struct socket * sock , unsigned int cmd , unsigned long arg ) ;
struct dn_fib_info * dn_fib_create_info ( const struct rtmsg * r ,
struct nlattr * attrs [ ] ,
const struct nlmsghdr * nlh , int * errp ) ;
int dn_fib_semantic_match ( int type , struct dn_fib_info * fi ,
const struct flowidn * fld , struct dn_fib_res * res ) ;
void dn_fib_release_info ( struct dn_fib_info * fi ) ;
void dn_fib_flush ( void ) ;
void dn_fib_select_multipath ( const struct flowidn * fld , struct dn_fib_res * res ) ;
2005-04-17 02:20:36 +04:00
/*
* dn_tables . c
*/
2013-09-20 22:23:20 +04:00
struct dn_fib_table * dn_fib_get_table ( u32 n , int creat ) ;
struct dn_fib_table * dn_fib_empty_table ( void ) ;
void dn_fib_table_init ( void ) ;
void dn_fib_table_cleanup ( void ) ;
2005-04-17 02:20:36 +04:00
/*
* dn_rules . c
*/
2013-09-20 22:23:20 +04:00
void dn_fib_rules_init ( void ) ;
void dn_fib_rules_cleanup ( void ) ;
unsigned int dnet_addr_type ( __le16 addr ) ;
int dn_fib_lookup ( struct flowidn * fld , struct dn_fib_res * res ) ;
2005-04-17 02:20:36 +04:00
2013-09-20 22:23:20 +04:00
int dn_fib_dump ( struct sk_buff * skb , struct netlink_callback * cb ) ;
2005-04-17 02:20:36 +04:00
2013-09-20 22:23:20 +04:00
void dn_fib_free_info ( struct dn_fib_info * fi ) ;
2005-04-17 02:20:36 +04:00
static inline void dn_fib_info_put ( struct dn_fib_info * fi )
{
if ( atomic_dec_and_test ( & fi - > fib_clntref ) )
dn_fib_free_info ( fi ) ;
}
static inline void dn_fib_res_put ( struct dn_fib_res * res )
{
if ( res - > fi )
dn_fib_info_put ( res - > fi ) ;
if ( res - > r )
2006-08-10 02:56:46 +04:00
fib_rule_put ( res - > r ) ;
2005-04-17 02:20:36 +04:00
}
# else /* Endnode */
# define dn_fib_init() do { } while(0)
# define dn_fib_cleanup() do { } while(0)
# define dn_fib_lookup(fl, res) (-ESRCH)
# define dn_fib_info_put(fi) do { } while(0)
# define dn_fib_select_multipath(fl, res) do { } while(0)
# define dn_fib_rules_policy(saddr,res,flags) (0)
# define dn_fib_res_put(res) do { } while(0)
# endif /* CONFIG_DECNET_ROUTER */
2006-03-21 09:42:39 +03:00
static inline __le16 dnet_make_mask ( int n )
2005-04-17 02:20:36 +04:00
{
2008-11-27 11:12:47 +03:00
if ( n )
return cpu_to_le16 ( ~ ( ( 1 < < ( 16 - n ) ) - 1 ) ) ;
return cpu_to_le16 ( 0 ) ;
2005-04-17 02:20:36 +04:00
}
# endif /* _NET_DN_FIB_H */