net: bridge: mcast: Notify on mdb offload failure
Notify user space on mdb offload failure if mdb_offload_fail_notification is enabled. Signed-off-by: Joseph Huang <Joseph.Huang@garmin.com> Acked-by: Nikolay Aleksandrov <razor@blackwall.org> Link: https://patch.msgid.link/20250411150323.1117797-4-Joseph.Huang@garmin.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>pull/1112/head
parent
9fbe1e3e61
commit
c428d43d4f
|
|
@ -519,16 +519,17 @@ static size_t rtnl_mdb_nlmsg_size(const struct net_bridge_port_group *pg)
|
|||
rtnl_mdb_nlmsg_pg_size(pg);
|
||||
}
|
||||
|
||||
void br_mdb_notify(struct net_device *dev,
|
||||
struct net_bridge_mdb_entry *mp,
|
||||
struct net_bridge_port_group *pg,
|
||||
int type)
|
||||
static void __br_mdb_notify(struct net_device *dev,
|
||||
struct net_bridge_mdb_entry *mp,
|
||||
struct net_bridge_port_group *pg,
|
||||
int type, bool notify_switchdev)
|
||||
{
|
||||
struct net *net = dev_net(dev);
|
||||
struct sk_buff *skb;
|
||||
int err = -ENOBUFS;
|
||||
|
||||
br_switchdev_mdb_notify(dev, mp, pg, type);
|
||||
if (notify_switchdev)
|
||||
br_switchdev_mdb_notify(dev, mp, pg, type);
|
||||
|
||||
skb = nlmsg_new(rtnl_mdb_nlmsg_size(pg), GFP_ATOMIC);
|
||||
if (!skb)
|
||||
|
|
@ -546,6 +547,21 @@ errout:
|
|||
rtnl_set_sk_err(net, RTNLGRP_MDB, err);
|
||||
}
|
||||
|
||||
void br_mdb_notify(struct net_device *dev,
|
||||
struct net_bridge_mdb_entry *mp,
|
||||
struct net_bridge_port_group *pg,
|
||||
int type)
|
||||
{
|
||||
__br_mdb_notify(dev, mp, pg, type, true);
|
||||
}
|
||||
|
||||
void br_mdb_flag_change_notify(struct net_device *dev,
|
||||
struct net_bridge_mdb_entry *mp,
|
||||
struct net_bridge_port_group *pg)
|
||||
{
|
||||
__br_mdb_notify(dev, mp, pg, RTM_NEWMDB, false);
|
||||
}
|
||||
|
||||
static int nlmsg_populate_rtr_fill(struct sk_buff *skb,
|
||||
struct net_device *dev,
|
||||
int ifindex, u16 vid, u32 pid,
|
||||
|
|
|
|||
|
|
@ -1004,6 +1004,8 @@ int br_mdb_hash_init(struct net_bridge *br);
|
|||
void br_mdb_hash_fini(struct net_bridge *br);
|
||||
void br_mdb_notify(struct net_device *dev, struct net_bridge_mdb_entry *mp,
|
||||
struct net_bridge_port_group *pg, int type);
|
||||
void br_mdb_flag_change_notify(struct net_device *dev, struct net_bridge_mdb_entry *mp,
|
||||
struct net_bridge_port_group *pg);
|
||||
void br_rtr_notify(struct net_device *dev, struct net_bridge_mcast_port *pmctx,
|
||||
int type);
|
||||
void br_multicast_del_pg(struct net_bridge_mdb_entry *mp,
|
||||
|
|
@ -1353,6 +1355,13 @@ br_multicast_set_pg_offload_flags(struct net_bridge_port_group *p,
|
|||
p->flags |= (offloaded ? MDB_PG_FLAGS_OFFLOAD :
|
||||
MDB_PG_FLAGS_OFFLOAD_FAILED);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
br_mdb_should_notify(const struct net_bridge *br, u8 changed_flags)
|
||||
{
|
||||
return br_opt_get(br, BROPT_MDB_OFFLOAD_FAIL_NOTIFICATION) &&
|
||||
(changed_flags & MDB_PG_FLAGS_OFFLOAD_FAILED);
|
||||
}
|
||||
#else
|
||||
static inline int br_multicast_rcv(struct net_bridge_mcast **brmctx,
|
||||
struct net_bridge_mcast_port **pmctx,
|
||||
|
|
|
|||
|
|
@ -504,6 +504,7 @@ static void br_switchdev_mdb_complete(struct net_device *dev, int err, void *pri
|
|||
struct net_bridge_mdb_entry *mp;
|
||||
struct net_bridge_port *port = data->port;
|
||||
struct net_bridge *br = port->br;
|
||||
u8 old_flags;
|
||||
|
||||
if (err == -EOPNOTSUPP)
|
||||
goto out_free;
|
||||
|
|
@ -517,7 +518,10 @@ static void br_switchdev_mdb_complete(struct net_device *dev, int err, void *pri
|
|||
if (p->key.port != port)
|
||||
continue;
|
||||
|
||||
old_flags = p->flags;
|
||||
br_multicast_set_pg_offload_flags(p, !err);
|
||||
if (br_mdb_should_notify(br, old_flags ^ p->flags))
|
||||
br_mdb_flag_change_notify(br->dev, mp, p);
|
||||
}
|
||||
out:
|
||||
spin_unlock_bh(&br->multicast_lock);
|
||||
|
|
|
|||
Loading…
Reference in New Issue