From c5335d737ff30f1cb23d245ef9e20ec23cc2d7ba Mon Sep 17 00:00:00 2001 From: Vivien Didelot Date: Sun, 25 Aug 2019 13:25:18 -0400 Subject: net: dsa: check bridge VLAN in slave operations The bridge VLANs are not offloaded by dsa_port_vlan_* if the port is not bridged or if its bridge is not VLAN aware. This is a good thing but other corners of DSA, such as the tag_8021q driver, may need to program VLANs regardless the bridge state. And also because bridge_dev is specific to user ports anyway, move these checks were it belongs, one layer up in the slave code. Signed-off-by: Vivien Didelot Suggested-by: Vladimir Oltean Signed-off-by: David S. Miller --- net/dsa/slave.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'net/dsa/slave.c') diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 8f5126c41282..82e48d247b81 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -323,6 +323,9 @@ static int dsa_slave_vlan_add(struct net_device *dev, if (obj->orig_dev != dev) return -EOPNOTSUPP; + if (dp->bridge_dev && !br_vlan_enabled(dp->bridge_dev)) + return 0; + vlan = *SWITCHDEV_OBJ_PORT_VLAN(obj); err = dsa_port_vlan_add(dp, &vlan, trans); @@ -377,6 +380,9 @@ static int dsa_slave_vlan_del(struct net_device *dev, if (obj->orig_dev != dev) return -EOPNOTSUPP; + if (dp->bridge_dev && !br_vlan_enabled(dp->bridge_dev)) + return 0; + return dsa_port_vlan_del(dp, SWITCHDEV_OBJ_PORT_VLAN(obj)); } @@ -1099,6 +1105,9 @@ static int dsa_slave_vlan_rx_add_vid(struct net_device *dev, __be16 proto, * need to emulate the switchdev prepare + commit phase. */ if (dp->bridge_dev) { + if (!br_vlan_enabled(dp->bridge_dev)) + return 0; + /* br_vlan_get_info() returns -EINVAL or -ENOENT if the * device, respectively the VID is not found, returning * 0 means success, which is a failure for us here. @@ -1126,6 +1135,9 @@ static int dsa_slave_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, * need to emulate the switchdev prepare + commit phase. */ if (dp->bridge_dev) { + if (!br_vlan_enabled(dp->bridge_dev)) + return 0; + /* br_vlan_get_info() returns -EINVAL or -ENOENT if the * device, respectively the VID is not found, returning * 0 means success, which is a failure for us here. -- cgit