bridge: Export multicast enabled state
authorIdo Schimmel <idosch@mellanox.com>
Fri, 26 May 2017 06:37:24 +0000 (08:37 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 26 May 2017 19:18:44 +0000 (15:18 -0400)
During enslavement to a bridge, after the CHANGEUPPER is sent, the
multicast enabled state of the bridge isn't propagated down to the
offloading driver unless it's changed.

This patch allows such drivers to query the multicast enabled state from
the bridge, so that they'll be able to correctly configure their flood
tables during port enslavement.

In case multicast is disabled, unregistered multicast packets can be
treated as broadcast and be flooded through all the bridge ports.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/if_bridge.h
net/bridge/br_multicast.c

index d6cd103eb165d18dd71077c5048d27f3aa08f5da..3cd18ac0697f8293e42fbabd699b50d96a9abd02 100644 (file)
@@ -62,6 +62,7 @@ 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);
+bool br_multicast_enabled(const struct net_device *dev);
 #else
 static inline int br_multicast_list_adjacent(struct net_device *dev,
                                             struct list_head *br_ip_list)
@@ -78,6 +79,10 @@ static inline bool br_multicast_has_querier_adjacent(struct net_device *dev,
 {
        return false;
 }
+static inline bool br_multicast_enabled(const struct net_device *dev)
+{
+       return false;
+}
 #endif
 
 #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_VLAN_FILTERING)
index faa7261a992fa6df54afd4656b0e810102d59c30..8dc5c8d69bcd732ff365cd52cd54c386c874335e 100644 (file)
@@ -2176,6 +2176,14 @@ unlock:
        return err;
 }
 
+bool br_multicast_enabled(const struct net_device *dev)
+{
+       struct net_bridge *br = netdev_priv(dev);
+
+       return !br->multicast_disabled;
+}
+EXPORT_SYMBOL_GPL(br_multicast_enabled);
+
 int br_multicast_set_querier(struct net_bridge *br, unsigned long val)
 {
        unsigned long max_delay;