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