On Thu, Feb 11, 2021 at 11:35:27AM +0200, Vladimir Oltean wrote: > On Thu, Feb 11, 2021 at 09:44:43AM +0200, Ido Schimmel wrote: > > On Thu, Feb 11, 2021 at 01:23:52AM +0200, Vladimir Oltean wrote: > > > On Wed, Feb 10, 2021 at 12:59:49PM +0200, Ido Schimmel wrote: > > > > > > The reverse, during unlinking, would be to refuse unlinking if the upper > > > > > > has uppers of its own. netdev_upper_dev_unlink() needs to learn to > > > > > > return an error and callers such as team/bond need to learn to handle > > > > > > it, but it seems patchable. > > > > > > > > > > Again, this was treated prior to my deletion in this series and not by > > > > > erroring out, I just really didn't think it through. > > > > > > > > > > So you're saying that if we impose that all switchdev drivers restrict > > > > > the house of cards to be constructed from the bottom up, and destructed > > > > > from the top down, then the notification of bridge port flags can stay > > > > > in the bridge layer? > > > > > > > > I actually don't think it's a good idea to have this in the bridge in > > > > any case. I understand that it makes sense for some devices where > > > > learning, flooding, etc are port attributes, but in other devices these > > > > can be {port,vlan} attributes and then you need to take care of them > > > > when a vlan is added / deleted and not only when a port is removed from > > > > the bridge. So for such devices this really won't save anything. I would > > > > thus leave it to the lower levels to decide. > > > > > > Just for my understanding, how are per-{port,vlan} attributes such as > > > learning and flooding managed by the Linux bridge? How can I disable > > > flooding only in a certain VLAN? > > > > You can't (currently). But it does not change the fact that in some > > devices these are {port,vlan} attributes and we are talking here about > > the interface towards these devices. Having these as {port,vlan} > > attributes allows you to support use cases such as a port being enslaved > > to a VLAN-aware bridge and its VLAN upper(s) enslaved to VLAN unaware > > bridge(s). > > I don't think I understand the use case really. You mean something like this? > > br1 (vlan_filtering=0) > / \ > / \ > swp0.100 \ > | \ > |(vlan_filtering \ > | br0 =1) \ > | / \ \ > |/ \ \ > swp0 swp1 swp2 > > A packet received on swp0 with VLAN tag 100 will go to swp0.100 which > will be forwarded according to the FDB of br1, and will be delivered to > swp2 as untagged? Respectively in the other direction, a packet received > on swp2 will have a VLAN 100 tag pushed on egress towards swp0, even if > it is already VLAN-tagged? > > What do you even use this for? The more common use case is to have multiple VLAN-unaware bridges instead of one VLAN-aware bridge. I'm not aware of users that use the hybrid model (VLAN-aware + VLAN-unaware). But regardless, this entails treating above mentioned attributes as {port,vlan} attributes. A device that only supports them as port attributes will have problems supporting such a model. > And also: if the {port,vlan} attributes can be simulated by making the > bridge port be an 8021q upper of a physical interface, then as far as > the bridge is concerned, they still are per-port attributes, and they > are per-{port,vlan} only as far as the switch driver is concerned - > therefore I don't see why it isn't okay for the bridge to notify the > brport flags in exactly the same way for them too. Look at this hunk from the patch: @@ -343,6 +360,8 @@ static void del_nbp(struct net_bridge_port *p) update_headroom(br, get_max_headroom(br)); netdev_reset_rx_headroom(dev); + nbp_flags_notify(p, BR_PORT_DEFAULT_FLAGS & ~BR_LEARNING, + BR_PORT_DEFAULT_FLAGS); nbp_vlan_flush(p); br_fdb_delete_by_port(br, p, 0, 1); switchdev_deferred_process(); Devices that treat these attributes as {port,vlan} attributes will undo this change upon the call to nbp_vlan_flush() when all the VLANs are flushed. > > > Obviously you need to ensure there is no conflict between the > > VLANs used by the VLAN-aware bridge and the VLAN device(s). > > On the other hand I think I have a more real-life use case that I think > is in conflict with this last phrase. > I have a VLAN-aware bridge and I want to run PTP in VLAN 7, but I also > need to add VLAN 7 in the VLAN table of the bridge ports so that it > doesn't drop traffic. PTP is link-local, so I need to run it on VLAN > uppers of the switch ports. Like this: > > ip link add br0 type bridge vlan_filtering 1 > ip link set swp0 master br0 > ip link set swp1 master br0 > bridge vlan add dev swp0 vid 7 master > bridge vlan add dev swp1 vid 7 master > bridge vlan add dev br0 vid 7 self > ip link add link swp0 name swp0.7 type vlan id 7 > ip link add link swp1 name swp0.7 type vlan id 7 > ptp4l -i swp0.7 -i swp1.7 -m > > How can I do that considering that you recommend avoiding conflicts > between the VLAN-aware bridge and 8021q uppers? Or is that true only > when the 8021q uppers are bridged? The problem is with the statement "I also need to add VLAN 7 in the VLAN table of the bridge ports so that it doesn't drop traffic". Packets with VLAN 7 received by swp0 will be processed by swp0.7. br0 is irrelevant and configuring swp0.7 should be enough in order to enable the VLAN filter for VLAN 7 on swp0. I don't know the internals of the HW you are working with, but I imagine that you would need to create a HW bridge between {swp0, VLAN 7} and the CPU port so that all the traffic with VLAN 7 will be sent / flooded to the CPU.