1 #ifndef _AF_NETLINK_H 2 #define _AF_NETLINK_H 3 4 #include <linux/rhashtable.h> 5 #include <net/sock.h> 6 7 #define NLGRPSZ(x) (ALIGN(x, sizeof(unsigned long) * 8) / 8) 8 #define NLGRPLONGS(x) (NLGRPSZ(x)/sizeof(unsigned long)) 9 10 struct netlink_ring { 11 void **pg_vec; 12 unsigned int head; 13 unsigned int frames_per_block; 14 unsigned int frame_size; 15 unsigned int frame_max; 16 17 unsigned int pg_vec_order; 18 unsigned int pg_vec_pages; 19 unsigned int pg_vec_len; 20 21 atomic_t pending; 22 }; 23 24 struct netlink_sock { 25 /* struct sock has to be the first member of netlink_sock */ 26 struct sock sk; 27 u32 portid; 28 u32 dst_portid; 29 u32 dst_group; 30 u32 flags; 31 u32 subscriptions; 32 u32 ngroups; 33 unsigned long *groups; 34 unsigned long state; 35 size_t max_recvmsg_len; 36 wait_queue_head_t wait; 37 bool cb_running; 38 int dump_done_errno; 39 struct netlink_callback cb; 40 struct mutex *cb_mutex; 41 struct mutex cb_def_mutex; 42 void (*netlink_rcv)(struct sk_buff *skb); 43 int (*netlink_bind)(int group); 44 void (*netlink_unbind)(int group); 45 struct module *module; 46 47 struct rhash_head node; 48 }; 49 nlk_sk(struct sock * sk)50static inline struct netlink_sock *nlk_sk(struct sock *sk) 51 { 52 return container_of(sk, struct netlink_sock, sk); 53 } 54 55 struct netlink_table { 56 struct rhashtable hash; 57 struct hlist_head mc_list; 58 struct listeners __rcu *listeners; 59 unsigned int flags; 60 unsigned int groups; 61 struct mutex *cb_mutex; 62 struct module *module; 63 int (*bind)(int group); 64 void (*unbind)(int group); 65 bool (*compare)(struct net *net, struct sock *sock); 66 int registered; 67 }; 68 69 extern struct netlink_table *nl_table; 70 extern rwlock_t nl_table_lock; 71 extern struct mutex nl_sk_hash_lock; 72 73 #endif 74