blob: d9acb2a1d855d81626d7dbf0b5bf968d76c0023d [file] [log] [blame]
Andrey Vagin0f29c762013-03-21 20:33:47 +04001#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_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
29static inline struct netlink_sock *nlk_sk(struct sock *sk)
30{
31 return container_of(sk, struct netlink_sock, sk);
32}
33
34struct 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
47struct 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
59extern struct netlink_table *nl_table;
60extern rwlock_t nl_table_lock;
61
62#endif