diff --git a/build_patches/openwrt/0020-kernel-5.4-backport-fix-to-allow-bridge-in-bridge-co.patch b/build_patches/openwrt/0020-kernel-5.4-backport-fix-to-allow-bridge-in-bridge-co.patch new file mode 100644 index 00000000..a55de5d9 --- /dev/null +++ b/build_patches/openwrt/0020-kernel-5.4-backport-fix-to-allow-bridge-in-bridge-co.patch @@ -0,0 +1,101 @@ +From c50ece58c41647880cc74c927d98b465cdfbdad8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabian=20Bl=C3=A4se?= +Date: Sun, 29 Aug 2021 21:21:35 +0200 +Subject: [PATCH] kernel: backport switchdev fix for bridge in bridge + configurations +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This patch fixes the forwarding behavior of bridge in bridge +configurations with DSA. + +Without it, the configuration of the upper bridge might overwrite +settings of the lower bridge. For example, a vlan-aware bridge +with DSA interfaces in it might be offloaded to the DSA hardware. If the +bridge interface itself gets slave of a different bridge without vlan +filtering, the vlan filtering setting of the lower bridge is overwritten +by the upper bridge, which results in an incorrect hardware +configuration. + +This was backported from kernel 5.7. + +Ref: https://lore.kernel.org/netdev/20191222192235.GK25745@shell.armlinux.org.uk/ +Fixes: FS#3996 +Signed-off-by: Fabian Bläse +--- + ...-not-propagate-bridge-updates-across.patch | 60 +++++++++++++++++++ + 1 file changed, 60 insertions(+) + create mode 100644 target/linux/generic/backport-5.4/790-v5.7-net-switchdev-do-not-propagate-bridge-updates-across.patch + +diff --git a/target/linux/generic/backport-5.4/790-v5.7-net-switchdev-do-not-propagate-bridge-updates-across.patch b/target/linux/generic/backport-5.4/790-v5.7-net-switchdev-do-not-propagate-bridge-updates-across.patch +new file mode 100644 +index 000000000000..bc8014b772f8 +--- /dev/null ++++ b/target/linux/generic/backport-5.4/790-v5.7-net-switchdev-do-not-propagate-bridge-updates-across.patch +@@ -0,0 +1,60 @@ ++From 07c6f9805f12f1bb538ef165a092b300350384aa Mon Sep 17 00:00:00 2001 ++From: Russell King ++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 ++Tested-by: Ido Schimmel ++Signed-off-by: Russell King ++Reviewed-by: Florian Fainelli ++Signed-off-by: David S. Miller ++--- ++ net/switchdev/switchdev.c | 9 +++++++++ ++ 1 file changed, 9 insertions(+) ++ ++diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c ++index 60630762a748b7..f25604d68337cf 100644 ++--- 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) +-- +2.33.0 +