| 
									
										
										
										
											2013-03-21 20:33:47 +04:00
										 |  |  | #ifndef _AF_NETLINK_H
 | 
					
						
							|  |  |  | #define _AF_NETLINK_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <net/sock.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define NLGRPSZ(x)	(ALIGN(x, sizeof(unsigned long) * 8) / 8)
 | 
					
						
							|  |  |  | #define NLGRPLONGS(x)	(NLGRPSZ(x)/sizeof(unsigned long))
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-17 06:47:01 +00:00
										 |  |  | struct netlink_ring { | 
					
						
							|  |  |  | 	void			**pg_vec; | 
					
						
							|  |  |  | 	unsigned int		head; | 
					
						
							|  |  |  | 	unsigned int		frames_per_block; | 
					
						
							|  |  |  | 	unsigned int		frame_size; | 
					
						
							|  |  |  | 	unsigned int		frame_max; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	unsigned int		pg_vec_order; | 
					
						
							|  |  |  | 	unsigned int		pg_vec_pages; | 
					
						
							|  |  |  | 	unsigned int		pg_vec_len; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	atomic_t		pending; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-21 20:33:47 +04:00
										 |  |  | struct netlink_sock { | 
					
						
							|  |  |  | 	/* struct sock has to be the first member of netlink_sock */ | 
					
						
							|  |  |  | 	struct sock		sk; | 
					
						
							|  |  |  | 	u32			portid; | 
					
						
							|  |  |  | 	u32			dst_portid; | 
					
						
							|  |  |  | 	u32			dst_group; | 
					
						
							|  |  |  | 	u32			flags; | 
					
						
							|  |  |  | 	u32			subscriptions; | 
					
						
							|  |  |  | 	u32			ngroups; | 
					
						
							|  |  |  | 	unsigned long		*groups; | 
					
						
							|  |  |  | 	unsigned long		state; | 
					
						
							| 
									
										
										
										
											2014-03-07 12:02:33 -08:00
										 |  |  | 	size_t			max_recvmsg_len; | 
					
						
							| 
									
										
										
										
											2013-03-21 20:33:47 +04:00
										 |  |  | 	wait_queue_head_t	wait; | 
					
						
							| 
									
										
										
										
											2013-08-15 15:31:06 -07:00
										 |  |  | 	bool			cb_running; | 
					
						
							|  |  |  | 	struct netlink_callback	cb; | 
					
						
							| 
									
										
										
										
											2013-03-21 20:33:47 +04:00
										 |  |  | 	struct mutex		*cb_mutex; | 
					
						
							|  |  |  | 	struct mutex		cb_def_mutex; | 
					
						
							|  |  |  | 	void			(*netlink_rcv)(struct sk_buff *skb); | 
					
						
							| 
									
										
										
										
											2014-04-22 21:31:54 -04:00
										 |  |  | 	int			(*netlink_bind)(int group); | 
					
						
							|  |  |  | 	void			(*netlink_unbind)(int group); | 
					
						
							| 
									
										
										
										
											2013-03-21 20:33:47 +04:00
										 |  |  | 	struct module		*module; | 
					
						
							| 
									
										
										
										
											2013-04-17 06:47:01 +00:00
										 |  |  | #ifdef CONFIG_NETLINK_MMAP
 | 
					
						
							|  |  |  | 	struct mutex		pg_vec_lock; | 
					
						
							|  |  |  | 	struct netlink_ring	rx_ring; | 
					
						
							|  |  |  | 	struct netlink_ring	tx_ring; | 
					
						
							|  |  |  | 	atomic_t		mapped; | 
					
						
							|  |  |  | #endif /* CONFIG_NETLINK_MMAP */
 | 
					
						
							| 
									
										
										
										
											2013-03-21 20:33:47 +04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline struct netlink_sock *nlk_sk(struct sock *sk) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return container_of(sk, struct netlink_sock, sk); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct nl_portid_hash { | 
					
						
							|  |  |  | 	struct hlist_head	*table; | 
					
						
							|  |  |  | 	unsigned long		rehash_time; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	unsigned int		mask; | 
					
						
							|  |  |  | 	unsigned int		shift; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	unsigned int		entries; | 
					
						
							|  |  |  | 	unsigned int		max_shift; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	u32			rnd; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct netlink_table { | 
					
						
							|  |  |  | 	struct nl_portid_hash	hash; | 
					
						
							|  |  |  | 	struct hlist_head	mc_list; | 
					
						
							|  |  |  | 	struct listeners __rcu	*listeners; | 
					
						
							|  |  |  | 	unsigned int		flags; | 
					
						
							|  |  |  | 	unsigned int		groups; | 
					
						
							|  |  |  | 	struct mutex		*cb_mutex; | 
					
						
							|  |  |  | 	struct module		*module; | 
					
						
							| 
									
										
										
										
											2014-04-22 21:31:54 -04:00
										 |  |  | 	int			(*bind)(int group); | 
					
						
							|  |  |  | 	void			(*unbind)(int group); | 
					
						
							| 
									
										
										
										
											2013-06-06 14:49:11 +08:00
										 |  |  | 	bool			(*compare)(struct net *net, struct sock *sock); | 
					
						
							| 
									
										
										
										
											2013-03-21 20:33:47 +04:00
										 |  |  | 	int			registered; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern struct netlink_table *nl_table; | 
					
						
							|  |  |  | extern rwlock_t nl_table_lock; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |