Skip to content

Commit

Permalink
batman-adv: prevent using any virtual device created on batman-adv as…
Browse files Browse the repository at this point in the history
… 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>
  • Loading branch information
Antonio Quartulli committed Nov 14, 2012
1 parent a7528f8 commit b7eddd0
Showing 1 changed file with 40 additions and 1 deletion.
41 changes: 40 additions & 1 deletion net/batman-adv/hard-interface.c
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit b7eddd0

Please sign in to comment.