On 9.10.2017 11:15, Jiri Pirko wrote: > From: Yotam Gigi <yot...@mellanox.com> > > Add an access function that, given a bridge netdevice, returns whether the > bridge device is currently an mrouter or not. The function uses the already > existing br_multicast_is_router function to check that. > > This function is needed in order to allow ports that join an already > existing bridge to know the current mrouter state of the bridge device. > Together with the bridge device mrouter ports switchdev notifications, it > is possible to have full offloading of the semantics of the bridge device > mcast router state. > > Due to the fact that the bridge multicast router status can change in > packet RX path, take the multicast_router bridge spinlock to protect the > read. > > Signed-off-by: Yotam Gigi <yot...@mellanox.com> > Reviewed-by: Nogah Frankel <nog...@mellanox.com> > Reviewed-by: Nikolay Aleksandrov <niko...@cumulusnetworks.com> > Signed-off-by: Jiri Pirko <j...@mellanox.com> > --- > include/linux/if_bridge.h | 5 +++++ > net/bridge/br_multicast.c | 12 ++++++++++++ > 2 files changed, 17 insertions(+) > > diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h > index 316ee11..02639eb 100644 > --- a/include/linux/if_bridge.h > +++ b/include/linux/if_bridge.h > @@ -64,6 +64,7 @@ int br_multicast_list_adjacent(struct net_device *dev, > 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); > +bool br_multicast_router(const struct net_device *dev); > #else > static inline int br_multicast_list_adjacent(struct net_device *dev, > struct list_head *br_ip_list) > @@ -84,6 +85,10 @@ static inline bool br_multicast_enabled(const struct > net_device *dev) > { > return false; > } > +static inline bool br_multicast_router(const struct net_device *dev) > +{ > + return false; > +} > #endif > > #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_VLAN_FILTERING) > diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c > index bd50550..7947e04 100644 > --- a/net/bridge/br_multicast.c > +++ b/net/bridge/br_multicast.c > @@ -2216,6 +2216,18 @@ bool br_multicast_enabled(const struct net_device *dev) > } > EXPORT_SYMBOL_GPL(br_multicast_enabled); > > +bool br_multicast_router(const struct net_device *dev) > +{ > + struct net_bridge *br = netdev_priv(dev); > + bool is_router; > + > + spin_lock_bh(&br->multicast_lock); > + is_router = br_multicast_is_router(br); > + spin_unlock_bh(&br->multicast_lock); > + return is_router; > +} > +EXPORT_SYMBOL_GPL(br_multicast_router); > + > int br_multicast_set_querier(struct net_bridge *br, unsigned long val) > { > unsigned long max_delay; >
Reviewed by: Ivan Vecera <ivec...@redhat.com>