* [Patch v4 net-next 0/3] Add support for mdb offload failure notification
@ 2025-04-08 15:41 Joseph Huang
2025-04-08 15:41 ` [Patch v4 net-next 1/3] net: bridge: mcast: Add offload failed mdb flag Joseph Huang
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Joseph Huang @ 2025-04-08 15:41 UTC (permalink / raw)
To: netdev
Cc: Joseph Huang, Joseph Huang, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Roopa Prabhu,
Nikolay Aleksandrov, Simon Horman, linux-kernel, bridge
Currently the bridge does not provide real-time feedback to user space
on whether or not an attempt to offload an mdb entry was successful.
This patch set adds support to notify user space about failed offload
attempts, and is controlled by a new knob mdb_offload_fail_notification.
A break-down of the patches in the series:
Patch 1 adds offload failed flag to indicate that the offload attempt
has failed. The flag is reflected in netlink mdb entry flags.
Patch 2 adds the new bridge bool option mdb_offload_fail_notification.
Patch 3 notifies user space when the result is known, controlled by
mdb_offload_fail_notification setting.
Joseph Huang (3):
net: bridge: mcast: Add offload failed mdb flag
net: bridge: Add offload_fail_notification bopt
net: bridge: mcast: Notify on mdb offload failure
include/uapi/linux/if_bridge.h | 10 ++++++----
net/bridge/br.c | 5 +++++
net/bridge/br_mdb.c | 28 +++++++++++++++++++++++-----
net/bridge/br_private.h | 30 +++++++++++++++++++++++++-----
net/bridge/br_switchdev.c | 13 +++++++++----
5 files changed, 68 insertions(+), 18 deletions(-)
---
v1: https://lore.kernel.org/netdev/20250318224255.143683-1-Joseph.Huang@garmin.com/
iproute2 link:
https://lore.kernel.org/netdev/20250318225026.145501-1-Joseph.Huang@garmin.com/
v2: https://lore.kernel.org/netdev/20250403234412.1531714-1-Joseph.Huang@garmin.com/
iproute2 link:
https://lore.kernel.org/netdev/20250403235452.1534269-1-Joseph.Huang@garmin.com/
Add br_multicast_pg_set_offload_flags helper to set offload flags
Change multi-valued option mdb_notify_on_flag_change to bool option
mdb_offload_fail_notification
Change _br_mdb_notify to __br_mdb_notify
Drop all #ifdef CONFIG_NET_SWITCHDEV
Add br_mdb_should_notify helper and reorganize code in
br_switch_mdb_complete
v3: https://lore.kernel.org/netdev/20250404212940.1837879-1-Joseph.Huang@garmin.com/
iproute2 link:
https://lore.kernel.org/netdev/20250403235452.1534269-1-Joseph.Huang@garmin.com/
Patch 1/3 Do not set offload flags when switchdev returns -EOPNOTSUPP
v4: No change (re-post due to merge window open)
--
2.49.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Patch v4 net-next 1/3] net: bridge: mcast: Add offload failed mdb flag
2025-04-08 15:41 [Patch v4 net-next 0/3] Add support for mdb offload failure notification Joseph Huang
@ 2025-04-08 15:41 ` Joseph Huang
2025-04-11 3:13 ` Jakub Kicinski
2025-04-08 15:41 ` [Patch v4 net-next 2/3] net: bridge: Add offload_fail_notification bopt Joseph Huang
2025-04-08 15:41 ` [Patch v4 net-next 3/3] net: bridge: mcast: Notify on mdb offload failure Joseph Huang
2 siblings, 1 reply; 5+ messages in thread
From: Joseph Huang @ 2025-04-08 15:41 UTC (permalink / raw)
To: netdev
Cc: Joseph Huang, Joseph Huang, Nikolay Aleksandrov, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Roopa Prabhu, Simon Horman, linux-kernel, bridge
Add MDB_FLAGS_OFFLOAD_FAILED and MDB_PG_FLAGS_OFFLOAD_FAILED to indicate
that an attempt to offload the MDB entry to switchdev has failed.
Signed-off-by: Joseph Huang <Joseph.Huang@garmin.com>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
---
include/uapi/linux/if_bridge.h | 9 +++++----
net/bridge/br_mdb.c | 2 ++
net/bridge/br_private.h | 20 +++++++++++++++-----
net/bridge/br_switchdev.c | 9 +++++----
4 files changed, 27 insertions(+), 13 deletions(-)
diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h
index a5b743a2f775..f2a6de424f3f 100644
--- a/include/uapi/linux/if_bridge.h
+++ b/include/uapi/linux/if_bridge.h
@@ -699,10 +699,11 @@ struct br_mdb_entry {
#define MDB_TEMPORARY 0
#define MDB_PERMANENT 1
__u8 state;
-#define MDB_FLAGS_OFFLOAD (1 << 0)
-#define MDB_FLAGS_FAST_LEAVE (1 << 1)
-#define MDB_FLAGS_STAR_EXCL (1 << 2)
-#define MDB_FLAGS_BLOCKED (1 << 3)
+#define MDB_FLAGS_OFFLOAD (1 << 0)
+#define MDB_FLAGS_FAST_LEAVE (1 << 1)
+#define MDB_FLAGS_STAR_EXCL (1 << 2)
+#define MDB_FLAGS_BLOCKED (1 << 3)
+#define MDB_FLAGS_OFFLOAD_FAILED (1 << 4)
__u8 flags;
__u16 vid;
struct {
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c
index 1a52a0bca086..0639691cd19b 100644
--- a/net/bridge/br_mdb.c
+++ b/net/bridge/br_mdb.c
@@ -144,6 +144,8 @@ static void __mdb_entry_fill_flags(struct br_mdb_entry *e, unsigned char flags)
e->flags |= MDB_FLAGS_STAR_EXCL;
if (flags & MDB_PG_FLAGS_BLOCKED)
e->flags |= MDB_FLAGS_BLOCKED;
+ if (flags & MDB_PG_FLAGS_OFFLOAD_FAILED)
+ e->flags |= MDB_FLAGS_OFFLOAD_FAILED;
}
static void __mdb_entry_to_br_ip(struct br_mdb_entry *entry, struct br_ip *ip,
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 1054b8a88edc..5f9d6075017e 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -306,11 +306,12 @@ struct net_bridge_fdb_flush_desc {
u16 vlan_id;
};
-#define MDB_PG_FLAGS_PERMANENT BIT(0)
-#define MDB_PG_FLAGS_OFFLOAD BIT(1)
-#define MDB_PG_FLAGS_FAST_LEAVE BIT(2)
-#define MDB_PG_FLAGS_STAR_EXCL BIT(3)
-#define MDB_PG_FLAGS_BLOCKED BIT(4)
+#define MDB_PG_FLAGS_PERMANENT BIT(0)
+#define MDB_PG_FLAGS_OFFLOAD BIT(1)
+#define MDB_PG_FLAGS_FAST_LEAVE BIT(2)
+#define MDB_PG_FLAGS_STAR_EXCL BIT(3)
+#define MDB_PG_FLAGS_BLOCKED BIT(4)
+#define MDB_PG_FLAGS_OFFLOAD_FAILED BIT(5)
#define PG_SRC_ENT_LIMIT 32
@@ -1343,6 +1344,15 @@ br_multicast_ctx_matches_vlan_snooping(const struct net_bridge_mcast *brmctx)
return !!(vlan_snooping_enabled == br_multicast_ctx_is_vlan(brmctx));
}
+
+static inline void
+br_multicast_set_pg_offload_flags(struct net_bridge_port_group *p,
+ bool offloaded)
+{
+ p->flags &= ~(MDB_PG_FLAGS_OFFLOAD | MDB_PG_FLAGS_OFFLOAD_FAILED);
+ p->flags |= (offloaded ? MDB_PG_FLAGS_OFFLOAD :
+ MDB_PG_FLAGS_OFFLOAD_FAILED);
+}
#else
static inline int br_multicast_rcv(struct net_bridge_mcast **brmctx,
struct net_bridge_mcast_port **pmctx,
diff --git a/net/bridge/br_switchdev.c b/net/bridge/br_switchdev.c
index 7b41ee8740cb..57e1863edf93 100644
--- a/net/bridge/br_switchdev.c
+++ b/net/bridge/br_switchdev.c
@@ -505,8 +505,8 @@ static void br_switchdev_mdb_complete(struct net_device *dev, int err, void *pri
struct net_bridge_port *port = data->port;
struct net_bridge *br = port->br;
- if (err)
- goto err;
+ if (err == -EOPNOTSUPP)
+ goto notsupp;
spin_lock_bh(&br->multicast_lock);
mp = br_mdb_ip_get(br, &data->ip);
@@ -516,11 +516,12 @@ static void br_switchdev_mdb_complete(struct net_device *dev, int err, void *pri
pp = &p->next) {
if (p->key.port != port)
continue;
- p->flags |= MDB_PG_FLAGS_OFFLOAD;
+
+ br_multicast_set_pg_offload_flags(p, !err);
}
out:
spin_unlock_bh(&br->multicast_lock);
-err:
+notsupp:
kfree(priv);
}
--
2.49.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Patch v4 net-next 2/3] net: bridge: Add offload_fail_notification bopt
2025-04-08 15:41 [Patch v4 net-next 0/3] Add support for mdb offload failure notification Joseph Huang
2025-04-08 15:41 ` [Patch v4 net-next 1/3] net: bridge: mcast: Add offload failed mdb flag Joseph Huang
@ 2025-04-08 15:41 ` Joseph Huang
2025-04-08 15:41 ` [Patch v4 net-next 3/3] net: bridge: mcast: Notify on mdb offload failure Joseph Huang
2 siblings, 0 replies; 5+ messages in thread
From: Joseph Huang @ 2025-04-08 15:41 UTC (permalink / raw)
To: netdev
Cc: Joseph Huang, Joseph Huang, Nikolay Aleksandrov, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Roopa Prabhu, Simon Horman, linux-kernel, bridge
Add BR_BOOLOPT_MDB_OFFLOAD_FAIL_NOTIFICATION bool option.
Signed-off-by: Joseph Huang <Joseph.Huang@garmin.com>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
---
include/uapi/linux/if_bridge.h | 1 +
net/bridge/br.c | 5 +++++
net/bridge/br_private.h | 1 +
3 files changed, 7 insertions(+)
diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h
index f2a6de424f3f..73876c0e2bba 100644
--- a/include/uapi/linux/if_bridge.h
+++ b/include/uapi/linux/if_bridge.h
@@ -831,6 +831,7 @@ enum br_boolopt_id {
BR_BOOLOPT_NO_LL_LEARN,
BR_BOOLOPT_MCAST_VLAN_SNOOPING,
BR_BOOLOPT_MST_ENABLE,
+ BR_BOOLOPT_MDB_OFFLOAD_FAIL_NOTIFICATION,
BR_BOOLOPT_MAX
};
diff --git a/net/bridge/br.c b/net/bridge/br.c
index 183fcb362f9e..25dda554ca5b 100644
--- a/net/bridge/br.c
+++ b/net/bridge/br.c
@@ -284,6 +284,9 @@ int br_boolopt_toggle(struct net_bridge *br, enum br_boolopt_id opt, bool on,
case BR_BOOLOPT_MST_ENABLE:
err = br_mst_set_enabled(br, on, extack);
break;
+ case BR_BOOLOPT_MDB_OFFLOAD_FAIL_NOTIFICATION:
+ br_opt_toggle(br, BROPT_MDB_OFFLOAD_FAIL_NOTIFICATION, on);
+ break;
default:
/* shouldn't be called with unsupported options */
WARN_ON(1);
@@ -302,6 +305,8 @@ int br_boolopt_get(const struct net_bridge *br, enum br_boolopt_id opt)
return br_opt_get(br, BROPT_MCAST_VLAN_SNOOPING_ENABLED);
case BR_BOOLOPT_MST_ENABLE:
return br_opt_get(br, BROPT_MST_ENABLED);
+ case BR_BOOLOPT_MDB_OFFLOAD_FAIL_NOTIFICATION:
+ return br_opt_get(br, BROPT_MDB_OFFLOAD_FAIL_NOTIFICATION);
default:
/* shouldn't be called with unsupported options */
WARN_ON(1);
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 5f9d6075017e..02188b7ff8e6 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -484,6 +484,7 @@ enum net_bridge_opts {
BROPT_VLAN_BRIDGE_BINDING,
BROPT_MCAST_VLAN_SNOOPING_ENABLED,
BROPT_MST_ENABLED,
+ BROPT_MDB_OFFLOAD_FAIL_NOTIFICATION,
};
struct net_bridge {
--
2.49.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Patch v4 net-next 3/3] net: bridge: mcast: Notify on mdb offload failure
2025-04-08 15:41 [Patch v4 net-next 0/3] Add support for mdb offload failure notification Joseph Huang
2025-04-08 15:41 ` [Patch v4 net-next 1/3] net: bridge: mcast: Add offload failed mdb flag Joseph Huang
2025-04-08 15:41 ` [Patch v4 net-next 2/3] net: bridge: Add offload_fail_notification bopt Joseph Huang
@ 2025-04-08 15:41 ` Joseph Huang
2 siblings, 0 replies; 5+ messages in thread
From: Joseph Huang @ 2025-04-08 15:41 UTC (permalink / raw)
To: netdev
Cc: Joseph Huang, Joseph Huang, Nikolay Aleksandrov, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Roopa Prabhu, Simon Horman, linux-kernel, bridge
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>
---
net/bridge/br_mdb.c | 26 +++++++++++++++++++++-----
net/bridge/br_private.h | 9 +++++++++
net/bridge/br_switchdev.c | 4 ++++
3 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c
index 0639691cd19b..5f53f387d251 100644
--- a/net/bridge/br_mdb.c
+++ b/net/bridge/br_mdb.c
@@ -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 @@ void br_mdb_notify(struct net_device *dev,
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,
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 02188b7ff8e6..fc43ccc06ccb 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -1005,6 +1005,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,
@@ -1354,6 +1356,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,
diff --git a/net/bridge/br_switchdev.c b/net/bridge/br_switchdev.c
index 57e1863edf93..bbdf6a3ba941 100644
--- a/net/bridge/br_switchdev.c
+++ b/net/bridge/br_switchdev.c
@@ -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 notsupp;
@@ -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);
--
2.49.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Patch v4 net-next 1/3] net: bridge: mcast: Add offload failed mdb flag
2025-04-08 15:41 ` [Patch v4 net-next 1/3] net: bridge: mcast: Add offload failed mdb flag Joseph Huang
@ 2025-04-11 3:13 ` Jakub Kicinski
0 siblings, 0 replies; 5+ messages in thread
From: Jakub Kicinski @ 2025-04-11 3:13 UTC (permalink / raw)
To: Joseph Huang
Cc: netdev, Joseph Huang, Nikolay Aleksandrov, Andrew Lunn,
David S. Miller, Eric Dumazet, Paolo Abeni, Roopa Prabhu,
Simon Horman, linux-kernel, bridge
On Tue, 8 Apr 2025 11:41:09 -0400 Joseph Huang wrote:
> - if (err)
> - goto err;
> + if (err == -EOPNOTSUPP)
> + goto notsupp;
>
> spin_lock_bh(&br->multicast_lock);
> mp = br_mdb_ip_get(br, &data->ip);
> @@ -516,11 +516,12 @@ static void br_switchdev_mdb_complete(struct net_device *dev, int err, void *pri
> pp = &p->next) {
> if (p->key.port != port)
> continue;
> - p->flags |= MDB_PG_FLAGS_OFFLOAD;
> +
> + br_multicast_set_pg_offload_flags(p, !err);
> }
> out:
> spin_unlock_bh(&br->multicast_lock);
> -err:
> +notsupp:
One small nit, please name the jump label after the target,
not the reason for the jump. So here "out_free" would be
a good name.
> kfree(priv);
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-04-11 3:13 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-08 15:41 [Patch v4 net-next 0/3] Add support for mdb offload failure notification Joseph Huang
2025-04-08 15:41 ` [Patch v4 net-next 1/3] net: bridge: mcast: Add offload failed mdb flag Joseph Huang
2025-04-11 3:13 ` Jakub Kicinski
2025-04-08 15:41 ` [Patch v4 net-next 2/3] net: bridge: Add offload_fail_notification bopt Joseph Huang
2025-04-08 15:41 ` [Patch v4 net-next 3/3] net: bridge: mcast: Notify on mdb offload failure Joseph Huang
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).