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 struct netlink_callback cb; 28 struct mutex *cb_mutex; 29 struct mutex cb_def_mutex; 30 void (*netlink_rcv)(struct sk_buff *skb); 31 int (*netlink_bind)(struct net *net, int group); 32 void (*netlink_unbind)(struct net *net, int group); 33 struct module *module; 34 35 struct rhash_head node; 36 struct rcu_head rcu; 37 struct work_struct work; 38 }; 39 40 static inline struct netlink_sock *nlk_sk(struct sock *sk) 41 { 42 return container_of(sk, struct netlink_sock, sk); 43 } 44 45 struct netlink_table { 46 struct rhashtable hash; 47 struct hlist_head mc_list; 48 struct listeners __rcu *listeners; 49 unsigned int flags; 50 unsigned int groups; 51 struct mutex *cb_mutex; 52 struct module *module; 53 int (*bind)(struct net *net, int group); 54 void (*unbind)(struct net *net, int group); 55 bool (*compare)(struct net *net, struct sock *sock); 56 int registered; 57 }; 58 59 extern struct netlink_table *nl_table; 60 extern rwlock_t nl_table_lock; 61 62 #endif 63