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 struct netlink_callback cb; 39 struct mutex *cb_mutex; 40 struct mutex cb_def_mutex; 41 void (*netlink_rcv)(struct sk_buff *skb); 42 int (*netlink_bind)(int group); 43 void (*netlink_unbind)(int group); 44 struct module *module; 45 #ifdef CONFIG_NETLINK_MMAP 46 struct mutex pg_vec_lock; 47 struct netlink_ring rx_ring; 48 struct netlink_ring tx_ring; 49 atomic_t mapped; 50 #endif /* CONFIG_NETLINK_MMAP */ 51 52 struct rhash_head node; 53 }; 54 55 static inline struct netlink_sock *nlk_sk(struct sock *sk) 56 { 57 return container_of(sk, struct netlink_sock, sk); 58 } 59 60 struct netlink_table { 61 struct rhashtable hash; 62 struct hlist_head mc_list; 63 struct listeners __rcu *listeners; 64 unsigned int flags; 65 unsigned int groups; 66 struct mutex *cb_mutex; 67 struct module *module; 68 int (*bind)(int group); 69 void (*unbind)(int group); 70 bool (*compare)(struct net *net, struct sock *sock); 71 int registered; 72 }; 73 74 extern struct netlink_table *nl_table; 75 extern rwlock_t nl_table_lock; 76 77 #endif 78