• Vladimir Oltean's avatar
    net: dsa: sja1105: Fix broken learning with vlan_filtering disabled · 6d7c7d94
    Vladimir Oltean authored
    When put under a bridge with vlan_filtering 0, the SJA1105 ports will
    flood all traffic as if learning was broken. This is because learning
    interferes with the rx_vid's configured by dsa_8021q as unique pvid's.
    
    So learning technically still *does* work, it's just that the learnt
    entries never get matched due to their unique VLAN ID.
    
    The setting that saves the day is Shared VLAN Learning, which on this
    switch family works exactly as desired: VLAN tagging still works
    (untagged traffic gets the correct pvid) and FDB entries are still
    populated with the correct contents including VID. Also, a frame cannot
    violate the forwarding domain restrictions enforced by its classified
    VLAN. It is just that the VID is ignored when looking up the FDB for
    taking a forwarding decision (selecting the egress port).
    
    This patch activates SVL, and the result is that frames with a learnt
    DMAC are no longer flooded in the scenario described above.
    
    Now exactly *because* SVL works as desired, we have to revisit some
    earlier patches:
    
    - It is no longer necessary to manipulate the VID of the 'bridge fdb
      {add,del}' command when vlan_filtering is off. This is because now,
      SVL is enabled for that case, so the actual VID does not matter*.
    
    - It is still desirable to hide dsa_8021q VID's in the FDB dump
      callback. But right now the dump callback should no longer hide
      duplicates (one per each front panel port's pvid, plus one for the
      VLAN that the CPU port is going to tag a TX frame with), because there
      shouldn't be any (the switch will match a single FDB entry no matter
      its VID anyway).
    
    * Not really... It's no longer necessary to transform a 'bridge fdb add'
      into 5 fdb add operations, but the user might still add a fdb entry with
      any vid, and all of them would appear as duplicates in 'bridge fdb
      show'. So force a 'bridge fdb add' to insert the VID of 0**, so that we
      can prune the duplicates at insertion time.
    
    ** The VID of 0 is better than 1 because it is always guaranteed to be
       in the ports' hardware filter. DSA also avoids putting the VID inside
       the netlink response message towards the bridge driver when we return
       this particular VID, which makes it suitable for FDB entries learnt
       with vlan_filtering off.
    
    Fixes: 227d07a0 ("net: dsa: sja1105: Add support for traffic through standalone ports")
    Signed-off-by: default avatarVladimir Oltean <olteanv@gmail.com>
    Signed-off-by: default avatarGeorg Waibel <georg.waibel@sensor-technik.de>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6d7c7d94
sja1105_main.c 63.1 KB