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
9struct 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
23struct 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	wait_queue_head_t	wait;
35	struct netlink_callback	*cb;
36	struct mutex		*cb_mutex;
37	struct mutex		cb_def_mutex;
38	void			(*netlink_rcv)(struct sk_buff *skb);
39	void			(*netlink_bind)(int group);
40	struct module		*module;
41#ifdef CONFIG_NETLINK_MMAP
42	struct mutex		pg_vec_lock;
43	struct netlink_ring	rx_ring;
44	struct netlink_ring	tx_ring;
45	atomic_t		mapped;
46#endif /* CONFIG_NETLINK_MMAP */
47};
48
49static inline struct netlink_sock *nlk_sk(struct sock *sk)
50{
51	return container_of(sk, struct netlink_sock, sk);
52}
53
54struct nl_portid_hash {
55	struct hlist_head	*table;
56	unsigned long		rehash_time;
57
58	unsigned int		mask;
59	unsigned int		shift;
60
61	unsigned int		entries;
62	unsigned int		max_shift;
63
64	u32			rnd;
65};
66
67struct netlink_table {
68	struct nl_portid_hash	hash;
69	struct hlist_head	mc_list;
70	struct listeners __rcu	*listeners;
71	unsigned int		flags;
72	unsigned int		groups;
73	struct mutex		*cb_mutex;
74	struct module		*module;
75	void			(*bind)(int group);
76	int			registered;
77};
78
79extern struct netlink_table *nl_table;
80extern rwlock_t nl_table_lock;
81
82#endif
83