| 1 | /* SPDX-License-Identifier: GPL-2.0 */ | 
|---|
| 2 | #ifndef _AF_NETLINK_H | 
|---|
| 3 | #define _AF_NETLINK_H | 
|---|
| 4 |  | 
|---|
| 5 | #include <linux/rhashtable.h> | 
|---|
| 6 | #include <linux/atomic.h> | 
|---|
| 7 | #include <net/sock.h> | 
|---|
| 8 |  | 
|---|
| 9 | /* flags */ | 
|---|
| 10 | enum { | 
|---|
| 11 | NETLINK_F_KERNEL_SOCKET, | 
|---|
| 12 | NETLINK_F_RECV_PKTINFO, | 
|---|
| 13 | NETLINK_F_BROADCAST_SEND_ERROR, | 
|---|
| 14 | NETLINK_F_RECV_NO_ENOBUFS, | 
|---|
| 15 | NETLINK_F_LISTEN_ALL_NSID, | 
|---|
| 16 | NETLINK_F_CAP_ACK, | 
|---|
| 17 | NETLINK_F_EXT_ACK, | 
|---|
| 18 | NETLINK_F_STRICT_CHK, | 
|---|
| 19 | }; | 
|---|
| 20 |  | 
|---|
| 21 | #define NLGRPSZ(x)	(ALIGN(x, sizeof(unsigned long) * 8) / 8) | 
|---|
| 22 | #define NLGRPLONGS(x)	(NLGRPSZ(x)/sizeof(unsigned long)) | 
|---|
| 23 |  | 
|---|
| 24 | struct netlink_sock { | 
|---|
| 25 | /* struct sock has to be the first member of netlink_sock */ | 
|---|
| 26 | struct sock		sk; | 
|---|
| 27 | unsigned long		flags; | 
|---|
| 28 | u32			portid; | 
|---|
| 29 | u32			dst_portid; | 
|---|
| 30 | u32			dst_group; | 
|---|
| 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			bound; | 
|---|
| 38 | bool			cb_running; | 
|---|
| 39 | int			dump_done_errno; | 
|---|
| 40 | struct netlink_callback	cb; | 
|---|
| 41 | struct mutex		nl_cb_mutex; | 
|---|
| 42 |  | 
|---|
| 43 | void			(*netlink_rcv)(struct sk_buff *skb); | 
|---|
| 44 | int			(*netlink_bind)(struct net *net, int group); | 
|---|
| 45 | void			(*netlink_unbind)(struct net *net, int group); | 
|---|
| 46 | void			(*netlink_release)(struct sock *sk, | 
|---|
| 47 | unsigned long *groups); | 
|---|
| 48 | struct module		*module; | 
|---|
| 49 |  | 
|---|
| 50 | struct rhash_head	node; | 
|---|
| 51 | struct rcu_head		rcu; | 
|---|
| 52 | }; | 
|---|
| 53 |  | 
|---|
| 54 | static inline struct netlink_sock *nlk_sk(struct sock *sk) | 
|---|
| 55 | { | 
|---|
| 56 | return container_of(sk, struct netlink_sock, sk); | 
|---|
| 57 | } | 
|---|
| 58 |  | 
|---|
| 59 | #define nlk_test_bit(nr, sk) test_bit(NETLINK_F_##nr, &nlk_sk(sk)->flags) | 
|---|
| 60 |  | 
|---|
| 61 | struct netlink_table { | 
|---|
| 62 | struct rhashtable	hash; | 
|---|
| 63 | struct hlist_head	mc_list; | 
|---|
| 64 | struct listeners __rcu	*listeners; | 
|---|
| 65 | unsigned int		flags; | 
|---|
| 66 | unsigned int		groups; | 
|---|
| 67 | struct mutex		*cb_mutex; | 
|---|
| 68 | struct module		*module; | 
|---|
| 69 | int			(*bind)(struct net *net, int group); | 
|---|
| 70 | void			(*unbind)(struct net *net, int group); | 
|---|
| 71 | void                    (*release)(struct sock *sk, | 
|---|
| 72 | unsigned long *groups); | 
|---|
| 73 | int			registered; | 
|---|
| 74 | }; | 
|---|
| 75 |  | 
|---|
| 76 | extern struct netlink_table *nl_table; | 
|---|
| 77 | extern rwlock_t nl_table_lock; | 
|---|
| 78 |  | 
|---|
| 79 | #endif | 
|---|
| 80 |  | 
|---|