bridge: Reflect MDB entries to hardware
Offload MDB changes per port to hardware Signed-off-by: Elad Raz <eladr@mellanox.com> 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>
This commit is contained in:
parent
4d41e12593
commit
f1fecb1d10
|
@ -7,6 +7,7 @@
|
||||||
#include <linux/if_ether.h>
|
#include <linux/if_ether.h>
|
||||||
#include <net/ip.h>
|
#include <net/ip.h>
|
||||||
#include <net/netlink.h>
|
#include <net/netlink.h>
|
||||||
|
#include <net/switchdev.h>
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
#include <net/ipv6.h>
|
#include <net/ipv6.h>
|
||||||
#include <net/addrconf.h>
|
#include <net/addrconf.h>
|
||||||
|
@ -210,10 +211,32 @@ static inline size_t rtnl_mdb_nlmsg_size(void)
|
||||||
static void __br_mdb_notify(struct net_device *dev, struct br_mdb_entry *entry,
|
static void __br_mdb_notify(struct net_device *dev, struct br_mdb_entry *entry,
|
||||||
int type)
|
int type)
|
||||||
{
|
{
|
||||||
|
struct switchdev_obj_port_mdb mdb = {
|
||||||
|
.obj = {
|
||||||
|
.id = SWITCHDEV_OBJ_ID_PORT_MDB,
|
||||||
|
.flags = SWITCHDEV_F_DEFER,
|
||||||
|
},
|
||||||
|
.vid = entry->vid,
|
||||||
|
};
|
||||||
|
struct net_device *port_dev;
|
||||||
struct net *net = dev_net(dev);
|
struct net *net = dev_net(dev);
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
int err = -ENOBUFS;
|
int err = -ENOBUFS;
|
||||||
|
|
||||||
|
port_dev = __dev_get_by_index(net, entry->ifindex);
|
||||||
|
if (entry->addr.proto == htons(ETH_P_IP))
|
||||||
|
ip_eth_mc_map(entry->addr.u.ip4, mdb.addr);
|
||||||
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
|
else
|
||||||
|
ipv6_eth_mc_map(&entry->addr.u.ip6, mdb.addr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
mdb.obj.orig_dev = port_dev;
|
||||||
|
if (port_dev && type == RTM_NEWMDB)
|
||||||
|
switchdev_port_obj_add(port_dev, &mdb.obj);
|
||||||
|
else if (port_dev && type == RTM_DELMDB)
|
||||||
|
switchdev_port_obj_del(port_dev, &mdb.obj);
|
||||||
|
|
||||||
skb = nlmsg_new(rtnl_mdb_nlmsg_size(), GFP_ATOMIC);
|
skb = nlmsg_new(rtnl_mdb_nlmsg_size(), GFP_ATOMIC);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto errout;
|
goto errout;
|
||||||
|
|
Loading…
Reference in a new issue