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 22struct 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 51static inline struct netlink_sock *nlk_sk(struct sock *sk) 52{ 53 return container_of(sk, struct netlink_sock, sk); 54} 55 56struct 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 70extern struct netlink_table *nl_table; 71extern rwlock_t nl_table_lock; 72 73#endif 74