10f29c768SAndrey Vagin #ifndef _AF_NETLINK_H 20f29c768SAndrey Vagin #define _AF_NETLINK_H 30f29c768SAndrey Vagin 4*e341694eSThomas Graf #include <linux/rhashtable.h> 50f29c768SAndrey Vagin #include <net/sock.h> 60f29c768SAndrey Vagin 70f29c768SAndrey Vagin #define NLGRPSZ(x) (ALIGN(x, sizeof(unsigned long) * 8) / 8) 80f29c768SAndrey Vagin #define NLGRPLONGS(x) (NLGRPSZ(x)/sizeof(unsigned long)) 90f29c768SAndrey Vagin 10ccdfcc39SPatrick McHardy struct netlink_ring { 11ccdfcc39SPatrick McHardy void **pg_vec; 12ccdfcc39SPatrick McHardy unsigned int head; 13ccdfcc39SPatrick McHardy unsigned int frames_per_block; 14ccdfcc39SPatrick McHardy unsigned int frame_size; 15ccdfcc39SPatrick McHardy unsigned int frame_max; 16ccdfcc39SPatrick McHardy 17ccdfcc39SPatrick McHardy unsigned int pg_vec_order; 18ccdfcc39SPatrick McHardy unsigned int pg_vec_pages; 19ccdfcc39SPatrick McHardy unsigned int pg_vec_len; 20ccdfcc39SPatrick McHardy 21ccdfcc39SPatrick McHardy atomic_t pending; 22ccdfcc39SPatrick McHardy }; 23ccdfcc39SPatrick McHardy 240f29c768SAndrey Vagin struct netlink_sock { 250f29c768SAndrey Vagin /* struct sock has to be the first member of netlink_sock */ 260f29c768SAndrey Vagin struct sock sk; 270f29c768SAndrey Vagin u32 portid; 280f29c768SAndrey Vagin u32 dst_portid; 290f29c768SAndrey Vagin u32 dst_group; 300f29c768SAndrey Vagin u32 flags; 310f29c768SAndrey Vagin u32 subscriptions; 320f29c768SAndrey Vagin u32 ngroups; 330f29c768SAndrey Vagin unsigned long *groups; 340f29c768SAndrey Vagin unsigned long state; 359063e21fSEric Dumazet size_t max_recvmsg_len; 360f29c768SAndrey Vagin wait_queue_head_t wait; 3716b304f3SPravin B Shelar bool cb_running; 3816b304f3SPravin B Shelar struct netlink_callback cb; 390f29c768SAndrey Vagin struct mutex *cb_mutex; 400f29c768SAndrey Vagin struct mutex cb_def_mutex; 410f29c768SAndrey Vagin void (*netlink_rcv)(struct sk_buff *skb); 424f520900SRichard Guy Briggs int (*netlink_bind)(int group); 434f520900SRichard Guy Briggs void (*netlink_unbind)(int group); 440f29c768SAndrey Vagin struct module *module; 45ccdfcc39SPatrick McHardy #ifdef CONFIG_NETLINK_MMAP 46ccdfcc39SPatrick McHardy struct mutex pg_vec_lock; 47ccdfcc39SPatrick McHardy struct netlink_ring rx_ring; 48ccdfcc39SPatrick McHardy struct netlink_ring tx_ring; 49ccdfcc39SPatrick McHardy atomic_t mapped; 50ccdfcc39SPatrick McHardy #endif /* CONFIG_NETLINK_MMAP */ 51*e341694eSThomas Graf 52*e341694eSThomas Graf struct rhash_head node; 530f29c768SAndrey Vagin }; 540f29c768SAndrey Vagin 550f29c768SAndrey Vagin static inline struct netlink_sock *nlk_sk(struct sock *sk) 560f29c768SAndrey Vagin { 570f29c768SAndrey Vagin return container_of(sk, struct netlink_sock, sk); 580f29c768SAndrey Vagin } 590f29c768SAndrey Vagin 600f29c768SAndrey Vagin struct netlink_table { 61*e341694eSThomas Graf struct rhashtable hash; 620f29c768SAndrey Vagin struct hlist_head mc_list; 630f29c768SAndrey Vagin struct listeners __rcu *listeners; 640f29c768SAndrey Vagin unsigned int flags; 650f29c768SAndrey Vagin unsigned int groups; 660f29c768SAndrey Vagin struct mutex *cb_mutex; 670f29c768SAndrey Vagin struct module *module; 684f520900SRichard Guy Briggs int (*bind)(int group); 694f520900SRichard Guy Briggs void (*unbind)(int group); 70da12c90eSGao feng bool (*compare)(struct net *net, struct sock *sock); 710f29c768SAndrey Vagin int registered; 720f29c768SAndrey Vagin }; 730f29c768SAndrey Vagin 740f29c768SAndrey Vagin extern struct netlink_table *nl_table; 750f29c768SAndrey Vagin extern rwlock_t nl_table_lock; 760f29c768SAndrey Vagin 770f29c768SAndrey Vagin #endif 78