 da12c90e09
			
		
	
	
	da12c90e09
	
	
	
		
			
			As we know, netlink sockets are private resource of net namespace, they can communicate with each other only when they in the same net namespace. this works well until we try to add namespace support for other subsystems which use netlink. Don't like ipv4 and route table.., it is not suited to make these subsytems belong to net namespace, Such as audit and crypto subsystems,they are more suitable to user namespace. So we must have the ability to make the netlink sockets in same user namespace can communicate with each other. This patch adds a new function pointer "compare" for netlink_table, we can decide if the netlink sockets can communicate with each other through this netlink_table self-defined compare function. The behavior isn't changed if we don't provide the compare function for netlink_table. Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com> Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			83 lines
		
	
	
	
		
			1.7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			1.7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #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))
 | |
| 
 | |
| 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;
 | |
| };
 | |
| 
 | |
| 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;
 | |
| 	wait_queue_head_t	wait;
 | |
| 	struct netlink_callback	*cb;
 | |
| 	struct mutex		*cb_mutex;
 | |
| 	struct mutex		cb_def_mutex;
 | |
| 	void			(*netlink_rcv)(struct sk_buff *skb);
 | |
| 	void			(*netlink_bind)(int group);
 | |
| 	struct module		*module;
 | |
| #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 */
 | |
| };
 | |
| 
 | |
| 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;
 | |
| 	void			(*bind)(int group);
 | |
| 	bool			(*compare)(struct net *net, struct sock *sock);
 | |
| 	int			registered;
 | |
| };
 | |
| 
 | |
| extern struct netlink_table *nl_table;
 | |
| extern rwlock_t nl_table_lock;
 | |
| 
 | |
| #endif
 |