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