mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-05 05:24:20 +00:00
61 lines
2.2 KiB
Diff
61 lines
2.2 KiB
Diff
|
From 07c6f9805f12f1bb538ef165a092b300350384aa Mon Sep 17 00:00:00 2001
|
||
|
From: Russell King <rmk+kernel@armlinux.org.uk>
|
||
|
Date: Wed, 26 Feb 2020 17:14:21 +0000
|
||
|
Subject: [PATCH] net: switchdev: do not propagate bridge updates across
|
||
|
bridges
|
||
|
|
||
|
When configuring a tree of independent bridges, propagating changes
|
||
|
from the upper bridge across a bridge master to the lower bridge
|
||
|
ports brings surprises.
|
||
|
|
||
|
For example, a lower bridge may have vlan filtering enabled. It
|
||
|
may have a vlan interface attached to the bridge master, which may
|
||
|
then be incorporated into another bridge. As soon as the lower
|
||
|
bridge vlan interface is attached to the upper bridge, the lower
|
||
|
bridge has vlan filtering disabled.
|
||
|
|
||
|
This occurs because switchdev recursively applies its changes to
|
||
|
all lower devices no matter what.
|
||
|
|
||
|
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
|
||
|
Tested-by: Ido Schimmel <idosch@mellanox.com>
|
||
|
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
|
||
|
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
|
||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||
|
---
|
||
|
net/switchdev/switchdev.c | 9 +++++++++
|
||
|
1 file changed, 9 insertions(+)
|
||
|
|
||
|
--- a/net/switchdev/switchdev.c
|
||
|
+++ b/net/switchdev/switchdev.c
|
||
|
@@ -476,6 +476,9 @@ static int __switchdev_handle_port_obj_a
|
||
|
* necessary to go through this helper.
|
||
|
*/
|
||
|
netdev_for_each_lower_dev(dev, lower_dev, iter) {
|
||
|
+ if (netif_is_bridge_master(lower_dev))
|
||
|
+ continue;
|
||
|
+
|
||
|
err = __switchdev_handle_port_obj_add(lower_dev, port_obj_info,
|
||
|
check_cb, add_cb);
|
||
|
if (err && err != -EOPNOTSUPP)
|
||
|
@@ -528,6 +531,9 @@ static int __switchdev_handle_port_obj_d
|
||
|
* necessary to go through this helper.
|
||
|
*/
|
||
|
netdev_for_each_lower_dev(dev, lower_dev, iter) {
|
||
|
+ if (netif_is_bridge_master(lower_dev))
|
||
|
+ continue;
|
||
|
+
|
||
|
err = __switchdev_handle_port_obj_del(lower_dev, port_obj_info,
|
||
|
check_cb, del_cb);
|
||
|
if (err && err != -EOPNOTSUPP)
|
||
|
@@ -579,6 +585,9 @@ static int __switchdev_handle_port_attr_
|
||
|
* necessary to go through this helper.
|
||
|
*/
|
||
|
netdev_for_each_lower_dev(dev, lower_dev, iter) {
|
||
|
+ if (netif_is_bridge_master(lower_dev))
|
||
|
+ continue;
|
||
|
+
|
||
|
err = __switchdev_handle_port_attr_set(lower_dev, port_attr_info,
|
||
|
check_cb, set_cb);
|
||
|
if (err && err != -EOPNOTSUPP)
|