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