mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +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;
 | 
						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)
 | 
					static int batadv_is_valid_iface(const struct net_device *net_dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (net_dev->flags & IFF_LOOPBACK)
 | 
						if (net_dev->flags & IFF_LOOPBACK)
 | 
				
			||||||
| 
						 | 
					@ -71,7 +110,7 @@ static int batadv_is_valid_iface(const struct net_device *net_dev)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* no batman over batman */
 | 
						/* no batman over batman */
 | 
				
			||||||
	if (batadv_softif_is_valid(net_dev))
 | 
						if (batadv_is_on_batman_iface(net_dev))
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue