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