mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	batman-adv: prevent using any virtual device created on batman-adv as hard-interface
Any virtual device created on top of a batman-adv mesh interface must be prevented to be used to create a new mesh network (this would lead to an unwanted batman-over-batman configuration) Signed-off-by: Antonio Quartulli <ordex@autistici.org>
This commit is contained in:
		
							parent
							
								
									a7528f8ddd
								
							
						
					
					
						commit
						b7eddd0b39
					
				
					 1 changed files with 40 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -59,6 +59,45 @@ batadv_hardif_get_by_netdev(const struct net_device *net_dev)
 | 
			
		|||
	return hard_iface;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * batadv_is_on_batman_iface - check if a device is a batman iface descendant
 | 
			
		||||
 * @net_dev: the device to check
 | 
			
		||||
 *
 | 
			
		||||
 * If the user creates any virtual device on top of a batman-adv interface, it
 | 
			
		||||
 * is important to prevent this new interface to be used to create a new mesh
 | 
			
		||||
 * network (this behaviour would lead to a batman-over-batman configuration).
 | 
			
		||||
 * This function recursively checks all the fathers of the device passed as
 | 
			
		||||
 * argument looking for a batman-adv soft interface.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns true if the device is descendant of a batman-adv mesh interface (or
 | 
			
		||||
 * if it is a batman-adv interface itself), false otherwise
 | 
			
		||||
 */
 | 
			
		||||
static bool batadv_is_on_batman_iface(const struct net_device *net_dev)
 | 
			
		||||
{
 | 
			
		||||
	struct net_device *parent_dev;
 | 
			
		||||
	bool ret;
 | 
			
		||||
 | 
			
		||||
	/* check if this is a batman-adv mesh interface */
 | 
			
		||||
	if (batadv_softif_is_valid(net_dev))
 | 
			
		||||
		return true;
 | 
			
		||||
 | 
			
		||||
	/* no more parents..stop recursion */
 | 
			
		||||
	if (net_dev->iflink == net_dev->ifindex)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	/* recurse over the parent device */
 | 
			
		||||
	parent_dev = dev_get_by_index(&init_net, net_dev->iflink);
 | 
			
		||||
	/* if we got a NULL parent_dev there is something broken.. */
 | 
			
		||||
	if (WARN(!parent_dev, "Cannot find parent device"))
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	ret = batadv_is_on_batman_iface(parent_dev);
 | 
			
		||||
 | 
			
		||||
	if (parent_dev)
 | 
			
		||||
		dev_put(parent_dev);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int batadv_is_valid_iface(const struct net_device *net_dev)
 | 
			
		||||
{
 | 
			
		||||
	if (net_dev->flags & IFF_LOOPBACK)
 | 
			
		||||
| 
						 | 
				
			
			@ -71,7 +110,7 @@ static int batadv_is_valid_iface(const struct net_device *net_dev)
 | 
			
		|||
		return 0;
 | 
			
		||||
 | 
			
		||||
	/* no batman over batman */
 | 
			
		||||
	if (batadv_softif_is_valid(net_dev))
 | 
			
		||||
	if (batadv_is_on_batman_iface(net_dev))
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue