Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Russell King and committed by
David S. Miller
07c6f980 9baeea50

+9
+9
net/switchdev/switchdev.c
··· 475 475 * necessary to go through this helper. 476 476 */ 477 477 netdev_for_each_lower_dev(dev, lower_dev, iter) { 478 + if (netif_is_bridge_master(lower_dev)) 479 + continue; 480 + 478 481 err = __switchdev_handle_port_obj_add(lower_dev, port_obj_info, 479 482 check_cb, add_cb); 480 483 if (err && err != -EOPNOTSUPP) ··· 529 526 * necessary to go through this helper. 530 527 */ 531 528 netdev_for_each_lower_dev(dev, lower_dev, iter) { 529 + if (netif_is_bridge_master(lower_dev)) 530 + continue; 531 + 532 532 err = __switchdev_handle_port_obj_del(lower_dev, port_obj_info, 533 533 check_cb, del_cb); 534 534 if (err && err != -EOPNOTSUPP) ··· 582 576 * necessary to go through this helper. 583 577 */ 584 578 netdev_for_each_lower_dev(dev, lower_dev, iter) { 579 + if (netif_is_bridge_master(lower_dev)) 580 + continue; 581 + 585 582 err = __switchdev_handle_port_attr_set(lower_dev, port_attr_info, 586 583 check_cb, set_cb); 587 584 if (err && err != -EOPNOTSUPP)