linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/4] bridge: multicast snooping exports #2
@ 2014-07-07  3:41 Linus Lüssing
  2014-07-07  3:41 ` [PATCH net-next 1/2] bridge: adding stubs for multicast exports Linus Lüssing
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Linus Lüssing @ 2014-07-07  3:41 UTC (permalink / raw)
  To: netdev
  Cc: bridge, Stephen Hemminger, David S. Miller, linux-kernel,
	b.a.t.m.a.n, Linus Lüssing

Hi,

Some people pointed out to me that it might be helpful to add stubs for
the newly added multicast exports. That way e.g. batman-adv should continue
to be compile and useable without having to have a kernel compiled
with bridge code in the future. This is what the first patch is supposed
to do.

The second patch adds a third multicast export for the bridge which
e.g. batman-adv is supposed to use, too, soon: Just like the bridge
disables its multicast snooping activities if no querier is present,
batman-adv needs to do the same if bridges are involved.


These three exports should be the final ones needed to marry the bridge
multicast snooping with the batman-adv multicast optimizations recently
added for the 3.15 kernel, allowing to use these optimzations in common
setups having a bridge on top of e.g. bat0, too. So far these bridged
setups would fall back to simple flooding through the batman-adv mesh
network for any multicast packet entering bat0.

More information about the batman-adv multicast optimizations currently
implemented can be found here:

http://www.open-mesh.org/projects/batman-adv/wiki/Basic-multicast-optimizations

The integration on the batman-adv side could afterwards look like this,
for instance (now including the third export):

http://git.open-mesh.org/batman-adv.git/commitdiff/61e4f6af4b7a21ed4040f2e711d50c778e5b6d93?hp=6ae4281474675fbca5bedcf768972a32db586eb6

Cheers, Linus


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

* [PATCH net-next 1/2] bridge: adding stubs for multicast exports
  2014-07-07  3:41 [PATCH net-next 0/4] bridge: multicast snooping exports #2 Linus Lüssing
@ 2014-07-07  3:41 ` Linus Lüssing
  2014-07-08 18:41   ` Cong Wang
  2014-07-07  3:41 ` [PATCH net-next 2/2] bridge: export knowledge about the presence of IGMP/MLD queriers Linus Lüssing
  2014-07-08 23:13 ` [PATCH net-next 0/4] bridge: multicast snooping exports #2 David Miller
  2 siblings, 1 reply; 5+ messages in thread
From: Linus Lüssing @ 2014-07-07  3:41 UTC (permalink / raw)
  To: netdev
  Cc: bridge, Stephen Hemminger, David S. Miller, linux-kernel,
	b.a.t.m.a.n, Linus Lüssing

To make users (e.g. batman-adv soon) load- and runnable even if the
bridge was compiled without snooping capabilities - or even if the
kernel was compiled without any bridge code at all.

Signed-off-by: Linus Lüssing <linus.luessing@web.de>
---
 include/linux/if_bridge.h |   14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h
index fd22789..e0c575c 100644
--- a/include/linux/if_bridge.h
+++ b/include/linux/if_bridge.h
@@ -36,8 +36,22 @@ extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __use
 
 typedef int br_should_route_hook_t(struct sk_buff *skb);
 extern br_should_route_hook_t __rcu *br_should_route_hook;
+
+#if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING)
 int br_multicast_list_adjacent(struct net_device *dev,
 			       struct list_head *br_ip_list);
 bool br_multicast_has_querier_adjacent(struct net_device *dev, int proto);
+#else
+static inline int br_multicast_list_adjacent(struct net_device *dev,
+					     struct list_head *br_ip_list)
+{
+	return 0;
+}
+static inline bool br_multicast_has_querier_adjacent(struct net_device *dev,
+						     int proto)
+{
+	return false;
+}
+#endif
 
 #endif
-- 
1.7.10.4


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

* [PATCH net-next 2/2] bridge: export knowledge about the presence of IGMP/MLD queriers
  2014-07-07  3:41 [PATCH net-next 0/4] bridge: multicast snooping exports #2 Linus Lüssing
  2014-07-07  3:41 ` [PATCH net-next 1/2] bridge: adding stubs for multicast exports Linus Lüssing
@ 2014-07-07  3:41 ` Linus Lüssing
  2014-07-08 23:13 ` [PATCH net-next 0/4] bridge: multicast snooping exports #2 David Miller
  2 siblings, 0 replies; 5+ messages in thread
From: Linus Lüssing @ 2014-07-07  3:41 UTC (permalink / raw)
  To: netdev
  Cc: bridge, Stephen Hemminger, David S. Miller, linux-kernel,
	b.a.t.m.a.n, Linus Lüssing

With this patch other modules are able to ask the bridge whether an
IGMP or MLD querier exists on the according, bridged link layer.

Multicast snooping can only be performed if a valid, selected querier
exists on a link.

Just like the bridge only enables its multicast snooping if a querier
exists, e.g. batman-adv too can only activate its multicast
snooping in bridged scenarios if a querier is present.

For instance this export avoids having to reimplement IGMP/MLD
querier message snooping and parsing in e.g. batman-adv, when
multicast optimizations for bridged scenarios are added in the
future.

Signed-off-by: Linus Lüssing <linus.luessing@web.de>
---
 include/linux/if_bridge.h |    6 ++++++
 net/bridge/br_multicast.c |   37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h
index e0c575c..808dcb8 100644
--- a/include/linux/if_bridge.h
+++ b/include/linux/if_bridge.h
@@ -40,6 +40,7 @@ extern br_should_route_hook_t __rcu *br_should_route_hook;
 #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING)
 int br_multicast_list_adjacent(struct net_device *dev,
 			       struct list_head *br_ip_list);
+bool br_multicast_has_querier_anywhere(struct net_device *dev, int proto);
 bool br_multicast_has_querier_adjacent(struct net_device *dev, int proto);
 #else
 static inline int br_multicast_list_adjacent(struct net_device *dev,
@@ -47,6 +48,11 @@ static inline int br_multicast_list_adjacent(struct net_device *dev,
 {
 	return 0;
 }
+static inline bool br_multicast_has_querier_anywhere(struct net_device *dev,
+						     int proto)
+{
+	return false;
+}
 static inline bool br_multicast_has_querier_adjacent(struct net_device *dev,
 						     int proto)
 {
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index abfa0b65..b4845f4 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -2216,6 +2216,43 @@ unlock:
 EXPORT_SYMBOL_GPL(br_multicast_list_adjacent);
 
 /**
+ * br_multicast_has_querier_anywhere - Checks for a querier on a bridge
+ * @dev: The bridge port providing the bridge on which to check for a querier
+ * @proto: The protocol family to check for: IGMP -> ETH_P_IP, MLD -> ETH_P_IPV6
+ *
+ * Checks whether the given interface has a bridge on top and if so returns
+ * true if a valid querier exists anywhere on the bridged link layer.
+ * Otherwise returns false.
+ */
+bool br_multicast_has_querier_anywhere(struct net_device *dev, int proto)
+{
+	struct net_bridge *br;
+	struct net_bridge_port *port;
+	struct ethhdr eth;
+	bool ret = false;
+
+	rcu_read_lock();
+	if (!br_port_exists(dev))
+		goto unlock;
+
+	port = br_port_get_rcu(dev);
+	if (!port || !port->br)
+		goto unlock;
+
+	br = port->br;
+
+	memset(&eth, 0, sizeof(eth));
+	eth.h_proto = htons(proto);
+
+	ret = br_multicast_querier_exists(br, &eth);
+
+unlock:
+	rcu_read_unlock();
+	return ret;
+}
+EXPORT_SYMBOL_GPL(br_multicast_has_querier_anywhere);
+
+/**
  * br_multicast_has_querier_adjacent - Checks for a querier behind a bridge port
  * @dev: The bridge port adjacent to which to check for a querier
  * @proto: The protocol family to check for: IGMP -> ETH_P_IP, MLD -> ETH_P_IPV6
-- 
1.7.10.4


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

* Re: [PATCH net-next 1/2] bridge: adding stubs for multicast exports
  2014-07-07  3:41 ` [PATCH net-next 1/2] bridge: adding stubs for multicast exports Linus Lüssing
@ 2014-07-08 18:41   ` Cong Wang
  0 siblings, 0 replies; 5+ messages in thread
From: Cong Wang @ 2014-07-08 18:41 UTC (permalink / raw)
  To: Linus Lüssing
  Cc: netdev, bridge, Stephen Hemminger, David S. Miller, linux-kernel,
	b.a.t.m.a.n

On Sun, Jul 6, 2014 at 8:41 PM, Linus Lüssing <linus.luessing@web.de> wrote:
> diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h
> index fd22789..e0c575c 100644
> --- a/include/linux/if_bridge.h
> +++ b/include/linux/if_bridge.h
> @@ -36,8 +36,22 @@ extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __use
>
>  typedef int br_should_route_hook_t(struct sk_buff *skb);
>  extern br_should_route_hook_t __rcu *br_should_route_hook;
> +
> +#if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING)

Nit: CONFIG_BRIDGE_IGMP_SNOOPING depends CONFIG_BRIDGE,
so you can just check CONFIG_BRIDGE_IGMP_SNOOPING.

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

* Re: [PATCH net-next 0/4] bridge: multicast snooping exports #2
  2014-07-07  3:41 [PATCH net-next 0/4] bridge: multicast snooping exports #2 Linus Lüssing
  2014-07-07  3:41 ` [PATCH net-next 1/2] bridge: adding stubs for multicast exports Linus Lüssing
  2014-07-07  3:41 ` [PATCH net-next 2/2] bridge: export knowledge about the presence of IGMP/MLD queriers Linus Lüssing
@ 2014-07-08 23:13 ` David Miller
  2 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2014-07-08 23:13 UTC (permalink / raw)
  To: linus.luessing; +Cc: netdev, bridge, stephen, linux-kernel, b.a.t.m.a.n

From: Linus Lüssing <linus.luessing@web.de>
Date: Mon,  7 Jul 2014 05:41:15 +0200


"0/4"?  Surely you meant "0/2" :-)

> Some people pointed out to me that it might be helpful to add stubs for
> the newly added multicast exports. That way e.g. batman-adv should continue
> to be compile and useable without having to have a kernel compiled
> with bridge code in the future. This is what the first patch is supposed
> to do.
> 
> The second patch adds a third multicast export for the bridge which
> e.g. batman-adv is supposed to use, too, soon: Just like the bridge
> disables its multicast snooping activities if no querier is present,
> batman-adv needs to do the same if bridges are involved.
> 
> 
> These three exports should be the final ones needed to marry the bridge
> multicast snooping with the batman-adv multicast optimizations recently
> added for the 3.15 kernel, allowing to use these optimzations in common
> setups having a bridge on top of e.g. bat0, too. So far these bridged
> setups would fall back to simple flooding through the batman-adv mesh
> network for any multicast packet entering bat0.
> 
> More information about the batman-adv multicast optimizations currently
> implemented can be found here:
> 
> http://www.open-mesh.org/projects/batman-adv/wiki/Basic-multicast-optimizations
> 
> The integration on the batman-adv side could afterwards look like this,
> for instance (now including the third export):
> 
> http://git.open-mesh.org/batman-adv.git/commitdiff/61e4f6af4b7a21ed4040f2e711d50c778e5b6d93?hp=6ae4281474675fbca5bedcf768972a32db586eb6

Series applied, thanks.

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

end of thread, other threads:[~2014-07-08 23:13 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-07-07  3:41 [PATCH net-next 0/4] bridge: multicast snooping exports #2 Linus Lüssing
2014-07-07  3:41 ` [PATCH net-next 1/2] bridge: adding stubs for multicast exports Linus Lüssing
2014-07-08 18:41   ` Cong Wang
2014-07-07  3:41 ` [PATCH net-next 2/2] bridge: export knowledge about the presence of IGMP/MLD queriers Linus Lüssing
2014-07-08 23:13 ` [PATCH net-next 0/4] bridge: multicast snooping exports #2 David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).