public inbox for b.a.t.m.a.n@lists.open-mesh.org
 help / color / mirror / Atom feed
* [B.A.T.M.A.N.] [PATCHv3 1/2] batman-adv: free an hard-interface before adding it
@ 2013-02-16 13:42 Antonio Quartulli
  2013-02-16 13:42 ` [B.A.T.M.A.N.] [PATCHv3 2/2] batman-adv: remove interfacing enslaving loop private check Antonio Quartulli
  2013-02-27  6:28 ` [B.A.T.M.A.N.] [PATCHv3 1/2] batman-adv: free an hard-interface before adding it Marek Lindner
  0 siblings, 2 replies; 7+ messages in thread
From: Antonio Quartulli @ 2013-02-16 13:42 UTC (permalink / raw)
  To: b.a.t.m.a.n

When adding a new hard interface (e.h. wlan0) to a soft interface (e.g. bat0)
and the former is already enslaved in another virtual interface (e.g. a software
bridge) batman-adv has to free the it first and then continue with the
adding mechanism.

In this way the behaviour becomes consistent with what "ip link set master"
does. At the moment batman-adv enslaves the hard interface without checking for
the master device, possibly causing strange behaviours which are never wanted by
the users.

Reported-by: Marek Lindner <lindner_marek@yahoo.de>
Signed-off-by: Antonio Quartulli <ordex@autistici.org>
---
v2:
 - added compat code for netdev_master_upper_dev_get()
v3:
 - use #define instead of a static inline function in compat code

 compat.h         |  5 +++++
 hard-interface.c | 14 ++++++++------
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/compat.h b/compat.h
index 425b3d9..885e551 100644
--- a/compat.h
+++ b/compat.h
@@ -214,6 +214,11 @@ static int __batadv_interface_set_mac_addr(x, y)
 
 #define netdev_master_upper_dev_link netdev_set_master
 #define netdev_upper_dev_unlink(slave, master) netdev_set_master(slave, NULL)
+#define netdev_master_upper_dev_get(dev) \
+({\
+	ASSERT_RTNL();\
+	dev->master;\
+})
 
 #endif /* < KERNEL_VERSION(3, 9, 0) */
 
diff --git a/hard-interface.c b/hard-interface.c
index c08e39e..fd99e42 100644
--- a/hard-interface.c
+++ b/hard-interface.c
@@ -311,7 +311,7 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
 				   const char *iface_name)
 {
 	struct batadv_priv *bat_priv;
-	struct net_device *soft_iface;
+	struct net_device *soft_iface, *master;
 	__be16 ethertype = __constant_htons(ETH_P_BATMAN);
 	int ret;
 
@@ -321,11 +321,6 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
 	if (!atomic_inc_not_zero(&hard_iface->refcount))
 		goto out;
 
-	/* hard-interface is part of a bridge */
-	if (hard_iface->net_dev->priv_flags & IFF_BRIDGE_PORT)
-		pr_err("You are about to enable batman-adv on '%s' which already is part of a bridge. Unless you know exactly what you are doing this is probably wrong and won't work the way you think it would.\n",
-		       hard_iface->net_dev->name);
-
 	soft_iface = dev_get_by_name(&init_net, iface_name);
 
 	if (!soft_iface) {
@@ -347,6 +342,13 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
 		goto err_dev;
 	}
 
+	/* check if the interface is enslaved in another virtual one and
+	 * in that case unlink it first
+	 */
+	master = netdev_master_upper_dev_get(hard_iface->net_dev);
+	if (master)
+		netdev_upper_dev_unlink(hard_iface->net_dev, master);
+
 	hard_iface->soft_iface = soft_iface;
 	bat_priv = netdev_priv(hard_iface->soft_iface);
 
-- 
1.8.1.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-02-27 10:41 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-02-16 13:42 [B.A.T.M.A.N.] [PATCHv3 1/2] batman-adv: free an hard-interface before adding it Antonio Quartulli
2013-02-16 13:42 ` [B.A.T.M.A.N.] [PATCHv3 2/2] batman-adv: remove interfacing enslaving loop private check Antonio Quartulli
2013-02-27 10:09   ` Marek Lindner
2013-02-27 10:21     ` Marek Lindner
2013-02-27 10:27       ` Antonio Quartulli
2013-02-27 10:41         ` Marek Lindner
2013-02-27  6:28 ` [B.A.T.M.A.N.] [PATCHv3 1/2] batman-adv: free an hard-interface before adding it Marek Lindner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox