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