• Vladimir Oltean's avatar
    net: dsa: sja1105: update existing VLANs from the bridge VLAN list · b38e659d
    Vladimir Oltean authored
    When running this sequence of operations:
    
    ip link add br0 type bridge vlan_filtering 1
    ip link set swp4 master br0
    bridge vlan add dev swp4 vid 1
    
    We observe the traffic sent on swp4 is still untagged, even though the
    bridge has overwritten the existing VLAN entry:
    
    port    vlan ids
    swp4     1 PVID
    
    br0      1 PVID Egress Untagged
    
    This happens because we didn't consider that the 'bridge vlan add'
    command just overwrites VLANs like it's nothing. We treat the 'vid 1
    pvid untagged' and the 'vid 1' as two separate VLANs, and the first
    still has precedence when calling sja1105_build_vlan_table. Obviously
    there is a disagreement regarding semantics, and we end up doing
    something unexpected from the PoV of the bridge.
    
    Let's actually consider an "existing VLAN" to be one which is on the
    same port, and has the same VLAN ID, as one we already have, and update
    it if it has different flags than we do.
    
    The first blamed commit is the one introducing the bug, the second one
    is the latest on top of which the bugfix still applies.
    
    Fixes: ec5ae610 ("net: dsa: sja1105: save/restore VLANs using a delta commit method")
    Fixes: 5899ee36 ("net: dsa: tag_8021q: add a context structure")
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b38e659d
sja1105_main.c 104 KB