Tobias Waldekranz
2022-Mar-15 00:25 UTC
[Bridge] [PATCH v4 net-next 04/15] net: bridge: mst: Notify switchdev drivers of MST mode changes
Trigger a switchdev event whenever the bridge's MST mode is
enabled/disabled. This allows constituent ports to either perform any
required hardware config, or refuse the change if it not supported.
Signed-off-by: Tobias Waldekranz <tobias at waldekranz.com>
---
include/net/switchdev.h | 2 ++
net/bridge/br_mst.c | 10 ++++++++++
2 files changed, 12 insertions(+)
diff --git a/include/net/switchdev.h b/include/net/switchdev.h
index 3e424d40fae3..85dd004dc9ad 100644
--- a/include/net/switchdev.h
+++ b/include/net/switchdev.h
@@ -27,6 +27,7 @@ enum switchdev_attr_id {
SWITCHDEV_ATTR_ID_BRIDGE_VLAN_PROTOCOL,
SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED,
SWITCHDEV_ATTR_ID_BRIDGE_MROUTER,
+ SWITCHDEV_ATTR_ID_BRIDGE_MST,
SWITCHDEV_ATTR_ID_MRP_PORT_ROLE,
};
@@ -48,6 +49,7 @@ struct switchdev_attr {
clock_t ageing_time; /* BRIDGE_AGEING_TIME */
bool vlan_filtering; /* BRIDGE_VLAN_FILTERING */
u16 vlan_protocol; /* BRIDGE_VLAN_PROTOCOL */
+ bool mst; /* BRIDGE_MST */
bool mc_disabled; /* MC_DISABLED */
u8 mrp_port_role; /* MRP_PORT_ROLE */
} u;
diff --git a/net/bridge/br_mst.c b/net/bridge/br_mst.c
index 355ad102d6b1..051b9358946b 100644
--- a/net/bridge/br_mst.c
+++ b/net/bridge/br_mst.c
@@ -99,8 +99,14 @@ void br_mst_vlan_init_state(struct net_bridge_vlan *v)
int br_mst_set_enabled(struct net_bridge *br, bool on,
struct netlink_ext_ack *extack)
{
+ struct switchdev_attr attr = {
+ .id = SWITCHDEV_ATTR_ID_BRIDGE_MST,
+ .orig_dev = br->dev,
+ .u.mst = on,
+ };
struct net_bridge_vlan_group *vg;
struct net_bridge_port *p;
+ int err;
list_for_each_entry(p, &br->port_list, list) {
vg = nbp_vlan_group(p);
@@ -116,6 +122,10 @@ int br_mst_set_enabled(struct net_bridge *br, bool on,
if (br_opt_get(br, BROPT_MST_ENABLED) == on)
return 0;
+ err = switchdev_port_attr_set(br->dev, &attr, extack);
+ if (err && err != -EOPNOTSUPP)
+ return err;
+
if (on)
static_branch_enable(&br_mst_used);
else
--
2.25.1
Jakub Kicinski
2022-Mar-15 05:32 UTC
[Bridge] [PATCH v4 net-next 04/15] net: bridge: mst: Notify switchdev drivers of MST mode changes
On Tue, 15 Mar 2022 01:25:32 +0100 Tobias Waldekranz wrote:> Trigger a switchdev event whenever the bridge's MST mode is > enabled/disabled. This allows constituent ports to either perform any > required hardware config, or refuse the change if it not supported. > > Signed-off-by: Tobias Waldekranz <tobias at waldekranz.com>../net/bridge/br_mst.c: In function ?br_mst_set_enabled?: ../net/bridge/br_mst.c:102:16: error: variable ?attr? has initializer but incomplete type 102 | struct switchdev_attr attr = { | ^~~~~~~~~~~~~~ ../net/bridge/br_mst.c:103:18: error: ?struct switchdev_attr? has no member named ?id? 103 | .id = SWITCHDEV_ATTR_ID_BRIDGE_MST, | ^~ ../net/bridge/br_mst.c:103:23: error: ?SWITCHDEV_ATTR_ID_BRIDGE_MST? undeclared (first use in this function) 103 | .id = SWITCHDEV_ATTR_ID_BRIDGE_MST, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../net/bridge/br_mst.c:103:23: note: each undeclared identifier is reported only once for each function it appears in ../net/bridge/br_mst.c:103:23: warning: excess elements in struct initializer ../net/bridge/br_mst.c:103:23: note: (near initialization for ?attr?) ../net/bridge/br_mst.c:104:18: error: ?struct switchdev_attr? has no member named ?orig_dev? 104 | .orig_dev = br->dev, | ^~~~~~~~ ../net/bridge/br_mst.c:104:29: warning: excess elements in struct initializer 104 | .orig_dev = br->dev, | ^~ ../net/bridge/br_mst.c:104:29: note: (near initialization for ?attr?) ../net/bridge/br_mst.c:105:18: error: ?struct switchdev_attr? has no member named ?u? 105 | .u.mst = on, | ^ ../net/bridge/br_mst.c:105:26: warning: excess elements in struct initializer 105 | .u.mst = on, | ^~ ../net/bridge/br_mst.c:105:26: note: (near initialization for ?attr?) ../net/bridge/br_mst.c:102:31: error: storage size of ?attr? isn?t known 102 | struct switchdev_attr attr = { | ^~~~ ../net/bridge/br_mst.c:125:15: error: implicit declaration of function ?switchdev_port_attr_set?; did you mean ?br_switchdev_port_vlan_del?? [-Werror=implicit-function-declaration] 125 | err = switchdev_port_attr_set(br->dev, &attr, extack); | ^~~~~~~~~~~~~~~~~~~~~~~ | br_switchdev_port_vlan_del ../net/bridge/br_mst.c:102:31: warning: unused variable ?attr? [-Wunused-variable] 102 | struct switchdev_attr attr = { | ^~~~