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