• Vladimir Oltean's avatar
    net: dsa: sja1105: invalidate dynamic FDB entries learned concurrently with statically added ones · 6c5fc159
    Vladimir Oltean authored
    The procedure to add a static FDB entry in sja1105 is concurrent with
    dynamic learning performed on all bridge ports and the CPU port.
    
    The switch looks up the FDB from left to right, and also learns
    dynamically from left to right, so it is possible that between the
    moment when we pick up a free slot to install an FDB entry, another slot
    to the left of that one becomes free due to an address ageing out, and
    that other slot is then immediately used by the switch to learn
    dynamically the same address as we're trying to add statically.
    
    The result is that we succeeded to add our static FDB entry, but it is
    being shadowed by a dynamic FDB entry to its left, and the switch will
    behave as if our static FDB entry did not exist.
    
    We cannot really prevent this from happening unless we make the entire
    process to add a static FDB entry a huge critical section where address
    learning is temporarily disabled on _all_ ports, and then re-enabled
    according to the configuration done by sja1105_port_set_learning.
    However, that is kind of disruptive for the operation of the network.
    
    What we can do alternatively is to simply read back the FDB for dynamic
    entries located before our newly added static one, and delete them.
    This will guarantee that our static FDB entry is now operational. It
    will still not guarantee that there aren't dynamic FDB entries to the
    _right_ of that static FDB entry, but at least those entries will age
    out by themselves since they aren't hit, and won't bother anyone.
    
    Fixes: 291d1e72 ("net: dsa: sja1105: Add support for FDB and MDB management")
    Fixes: 1da73821 ("net: dsa: sja1105: Add FDB operations for P/Q/R/S series")
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6c5fc159
sja1105_main.c 109 KB