Thread (8 messages) 8 messages, 4 authors, 2026-03-25

Re: [PATCH net-next 1/3] net: bridge: add stp_mode attribute for STP mode selection

From: Nikolay Aleksandrov <razor@blackwall.org>
Date: 2026-03-25 07:46:36
Also in: bridge, linux-doc, linux-kselftest, lkml

On 24/03/2026 20:49, Andy Roulin wrote:
The bridge-stp usermode helper is currently restricted to the initial
network namespace, preventing userspace STP daemons (e.g. mstpd) from
operating on bridges in other network namespaces. Since commit
ff62198553e4 ("bridge: Only call /sbin/bridge-stp for the initial
network namespace"), bridges in non-init namespaces silently fall back
to kernel STP with no way to use userspace STP.

Add a new bridge attribute IFLA_BR_STP_MODE that allows explicit
per-bridge control over STP mode selection:

   BR_STP_MODE_AUTO (default) - Existing behavior: invoke the
     /sbin/bridge-stp helper in init_net only; fall back to kernel STP
     if it fails or in non-init namespaces.

   BR_STP_MODE_USER - Directly enable userspace STP (BR_USER_STP)
     without invoking the helper. Works in any network namespace. The
     caller is responsible for registering the bridge with the STP
     daemon after enabling STP.

   BR_STP_MODE_KERNEL - Directly enable kernel STP (BR_KERNEL_STP)
     without invoking the helper.

The mode can only be changed while STP is disabled (-EBUSY otherwise).
IFLA_BR_STP_MODE is processed before IFLA_BR_STP_STATE in
br_changelink(), so both can be set atomically in a single netlink
message.

This eliminates the need for call_usermodehelper() in user/kernel
modes, addressing the security concerns discussed in the thread at
https://lore.kernel.org/netdev/565B7F7D.80208@nod.at/ (local) and providing
a cleaner alternative to extending the helper into namespaces.

Suggested-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Assisted-by: Claude:claude-opus-4-6
Signed-off-by: Andy Roulin <redacted>
---
  include/uapi/linux/if_link.h | 40 ++++++++++++++++++++++++++++++++++++
  net/bridge/br_device.c       |  1 +
  net/bridge/br_netlink.c      | 18 +++++++++++++++-
  net/bridge/br_private.h      |  1 +
  net/bridge/br_stp_if.c       | 17 ++++++++-------
  5 files changed, 69 insertions(+), 8 deletions(-)
[snip]
quoted hunk ↗ jump to hunk
  #ifdef CONFIG_BRIDGE_VLAN_FILTERING
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 6dbca845e625d..e4bb9c3f28726 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -540,6 +540,7 @@ struct net_bridge {
  		BR_KERNEL_STP,		/* old STP in kernel */
  		BR_USER_STP,		/* new RSTP in userspace */
  	} stp_enabled;
+	u32				stp_mode;
  
  	struct net_bridge_mcast		multicast_ctx;
  
[snip]

Not critical but there's a 4 byte hole in the same cache line betwen root_port
and max_age, if you move stp_mode there we get:

/* size: 1728, cachelines: 27, members: 53 */
/* sum members: 1722, holes: 2, sum holes: 6 */

vs

/* size: 1736, cachelines: 28, members: 53 */
/* sum members: 1722, holes: 4, sum holes: 14 */


Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help