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 10struct 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 24struct 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 55static inline struct netlink_sock *nlk_sk(struct sock *sk) 56{ 57 return container_of(sk, struct netlink_sock, sk); 58} 59 60struct 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 74extern struct netlink_table *nl_table; 75extern rwlock_t nl_table_lock; 76extern struct mutex nl_sk_hash_lock; 77 78#endif 79