2013-03-21 20:33:47 +04:00
# ifndef _AF_NETLINK_H
# define _AF_NETLINK_H
# include <net/sock.h>
# define NLGRPSZ(x) (ALIGN(x, sizeof(unsigned long) * 8) / 8)
# define NLGRPLONGS(x) (NLGRPSZ(x) / sizeof(unsigned long))
2013-04-17 06:47:01 +00:00
struct netlink_ring {
void * * pg_vec ;
unsigned int head ;
unsigned int frames_per_block ;
unsigned int frame_size ;
unsigned int frame_max ;
unsigned int pg_vec_order ;
unsigned int pg_vec_pages ;
unsigned int pg_vec_len ;
atomic_t pending ;
} ;
2013-03-21 20:33:47 +04:00
struct netlink_sock {
/* struct sock has to be the first member of netlink_sock */
struct sock sk ;
u32 portid ;
u32 dst_portid ;
u32 dst_group ;
u32 flags ;
u32 subscriptions ;
u32 ngroups ;
unsigned long * groups ;
unsigned long state ;
wait_queue_head_t wait ;
2013-08-15 15:31:06 -07:00
bool cb_running ;
struct netlink_callback cb ;
2013-03-21 20:33:47 +04:00
struct mutex * cb_mutex ;
struct mutex cb_def_mutex ;
void ( * netlink_rcv ) ( struct sk_buff * skb ) ;
void ( * netlink_bind ) ( int group ) ;
struct module * module ;
2013-04-17 06:47:01 +00:00
# ifdef CONFIG_NETLINK_MMAP
struct mutex pg_vec_lock ;
struct netlink_ring rx_ring ;
struct netlink_ring tx_ring ;
atomic_t mapped ;
# endif /* CONFIG_NETLINK_MMAP */
2013-03-21 20:33:47 +04:00
} ;
static inline struct netlink_sock * nlk_sk ( struct sock * sk )
{
return container_of ( sk , struct netlink_sock , sk ) ;
}
struct nl_portid_hash {
struct hlist_head * table ;
unsigned long rehash_time ;
unsigned int mask ;
unsigned int shift ;
unsigned int entries ;
unsigned int max_shift ;
u32 rnd ;
} ;
struct netlink_table {
struct nl_portid_hash hash ;
struct hlist_head mc_list ;
struct listeners __rcu * listeners ;
unsigned int flags ;
unsigned int groups ;
struct mutex * cb_mutex ;
struct module * module ;
void ( * bind ) ( int group ) ;
2013-06-06 14:49:11 +08:00
bool ( * compare ) ( struct net * net , struct sock * sock ) ;
2013-03-21 20:33:47 +04:00
int registered ;
} ;
extern struct netlink_table * nl_table ;
extern rwlock_t nl_table_lock ;
# endif