xref: /linux/net/netlink/af_netlink.h (revision e5c5d22e8dcf7c2d430336cbf8e180bd38e8daf1)
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_sock {
10 	/* struct sock has to be the first member of netlink_sock */
11 	struct sock		sk;
12 	u32			portid;
13 	u32			dst_portid;
14 	u32			dst_group;
15 	u32			flags;
16 	u32			subscriptions;
17 	u32			ngroups;
18 	unsigned long		*groups;
19 	unsigned long		state;
20 	wait_queue_head_t	wait;
21 	struct netlink_callback	*cb;
22 	struct mutex		*cb_mutex;
23 	struct mutex		cb_def_mutex;
24 	void			(*netlink_rcv)(struct sk_buff *skb);
25 	void			(*netlink_bind)(int group);
26 	struct module		*module;
27 };
28 
29 static inline struct netlink_sock *nlk_sk(struct sock *sk)
30 {
31 	return container_of(sk, struct netlink_sock, sk);
32 }
33 
34 struct nl_portid_hash {
35 	struct hlist_head	*table;
36 	unsigned long		rehash_time;
37 
38 	unsigned int		mask;
39 	unsigned int		shift;
40 
41 	unsigned int		entries;
42 	unsigned int		max_shift;
43 
44 	u32			rnd;
45 };
46 
47 struct netlink_table {
48 	struct nl_portid_hash	hash;
49 	struct hlist_head	mc_list;
50 	struct listeners __rcu	*listeners;
51 	unsigned int		flags;
52 	unsigned int		groups;
53 	struct mutex		*cb_mutex;
54 	struct module		*module;
55 	void			(*bind)(int group);
56 	int			registered;
57 };
58 
59 extern struct netlink_table *nl_table;
60 extern rwlock_t nl_table_lock;
61 
62 #endif
63