xref: /OK3568_Linux_fs/kernel/net/netlink/af_netlink.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _AF_NETLINK_H
3*4882a593Smuzhiyun #define _AF_NETLINK_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/rhashtable.h>
6*4882a593Smuzhiyun #include <linux/atomic.h>
7*4882a593Smuzhiyun #include <linux/workqueue.h>
8*4882a593Smuzhiyun #include <net/sock.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun /* flags */
11*4882a593Smuzhiyun #define NETLINK_F_KERNEL_SOCKET		0x1
12*4882a593Smuzhiyun #define NETLINK_F_RECV_PKTINFO		0x2
13*4882a593Smuzhiyun #define NETLINK_F_BROADCAST_SEND_ERROR	0x4
14*4882a593Smuzhiyun #define NETLINK_F_RECV_NO_ENOBUFS	0x8
15*4882a593Smuzhiyun #define NETLINK_F_LISTEN_ALL_NSID	0x10
16*4882a593Smuzhiyun #define NETLINK_F_CAP_ACK		0x20
17*4882a593Smuzhiyun #define NETLINK_F_EXT_ACK		0x40
18*4882a593Smuzhiyun #define NETLINK_F_STRICT_CHK		0x80
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define NLGRPSZ(x)	(ALIGN(x, sizeof(unsigned long) * 8) / 8)
21*4882a593Smuzhiyun #define NLGRPLONGS(x)	(NLGRPSZ(x)/sizeof(unsigned long))
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun struct netlink_sock {
24*4882a593Smuzhiyun 	/* struct sock has to be the first member of netlink_sock */
25*4882a593Smuzhiyun 	struct sock		sk;
26*4882a593Smuzhiyun 	u32			portid;
27*4882a593Smuzhiyun 	u32			dst_portid;
28*4882a593Smuzhiyun 	u32			dst_group;
29*4882a593Smuzhiyun 	u32			flags;
30*4882a593Smuzhiyun 	u32			subscriptions;
31*4882a593Smuzhiyun 	u32			ngroups;
32*4882a593Smuzhiyun 	unsigned long		*groups;
33*4882a593Smuzhiyun 	unsigned long		state;
34*4882a593Smuzhiyun 	size_t			max_recvmsg_len;
35*4882a593Smuzhiyun 	wait_queue_head_t	wait;
36*4882a593Smuzhiyun 	bool			bound;
37*4882a593Smuzhiyun 	bool			cb_running;
38*4882a593Smuzhiyun 	int			dump_done_errno;
39*4882a593Smuzhiyun 	struct netlink_callback	cb;
40*4882a593Smuzhiyun 	struct mutex		*cb_mutex;
41*4882a593Smuzhiyun 	struct mutex		cb_def_mutex;
42*4882a593Smuzhiyun 	void			(*netlink_rcv)(struct sk_buff *skb);
43*4882a593Smuzhiyun 	int			(*netlink_bind)(struct net *net, int group);
44*4882a593Smuzhiyun 	void			(*netlink_unbind)(struct net *net, int group);
45*4882a593Smuzhiyun 	struct module		*module;
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	struct rhash_head	node;
48*4882a593Smuzhiyun 	struct rcu_head		rcu;
49*4882a593Smuzhiyun 	struct work_struct	work;
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
nlk_sk(struct sock * sk)52*4882a593Smuzhiyun static inline struct netlink_sock *nlk_sk(struct sock *sk)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun 	return container_of(sk, struct netlink_sock, sk);
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun struct netlink_table {
58*4882a593Smuzhiyun 	struct rhashtable	hash;
59*4882a593Smuzhiyun 	struct hlist_head	mc_list;
60*4882a593Smuzhiyun 	struct listeners __rcu	*listeners;
61*4882a593Smuzhiyun 	unsigned int		flags;
62*4882a593Smuzhiyun 	unsigned int		groups;
63*4882a593Smuzhiyun 	struct mutex		*cb_mutex;
64*4882a593Smuzhiyun 	struct module		*module;
65*4882a593Smuzhiyun 	int			(*bind)(struct net *net, int group);
66*4882a593Smuzhiyun 	void			(*unbind)(struct net *net, int group);
67*4882a593Smuzhiyun 	bool			(*compare)(struct net *net, struct sock *sock);
68*4882a593Smuzhiyun 	int			registered;
69*4882a593Smuzhiyun };
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun extern struct netlink_table *nl_table;
72*4882a593Smuzhiyun extern rwlock_t nl_table_lock;
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun #endif
75