• Vladimir Oltean's avatar
    net: dsa: request drivers to perform FDB isolation · c2693363
    Vladimir Oltean authored
    For DSA, to encourage drivers to perform FDB isolation simply means to
    track which bridge does each FDB and MDB entry belong to. It then
    becomes the driver responsibility to use something that makes the FDB
    entry from one bridge not match the FDB lookup of ports from other
    bridges.
    
    The top-level functions where the bridge is determined are:
    - dsa_port_fdb_{add,del}
    - dsa_port_host_fdb_{add,del}
    - dsa_port_mdb_{add,del}
    - dsa_port_host_mdb_{add,del}
    
    aka the pre-crosschip-notifier functions.
    
    Changing the API to pass a reference to a bridge is not superfluous, and
    looking at the passed bridge argument is not the same as having the
    driver look at dsa_to_port(ds, port)->bridge from the ->port_fdb_add()
    method.
    
    DSA installs FDB and MDB entries on shared (CPU and DSA) ports as well,
    and those do not have any dp->bridge information to retrieve, because
    they are not in any bridge - they are merely the pipes that serve the
    user ports that are in one or multiple bridges.
    
    The struct dsa_bridge associated with each FDB/MDB entry is encapsulated
    in a larger "struct dsa_db" database. Although only databases associated
    to bridges are notified for now, this API will be the starting point for
    implementing IFF_UNICAST_FLT in DSA. There, the idea is to install FDB
    entries on the CPU port which belong to the corresponding user port's
    port database. These are supposed to match only when the port is
    standalone.
    
    It is better to introduce the API in its expected final form than to
    introduce it for bridges first, then to have to change drivers which may
    have made one or more assumptions.
    
    Drivers can use the provided bridge.num, but they can also use a
    different numbering scheme that is more convenient.
    
    DSA must perform refcounting on the CPU and DSA ports by also taking
    into account the bridge number. So if two bridges request the same local
    address, DSA must notify the driver twice, once for each bridge.
    
    In fact, if the driver supports FDB isolation, DSA must perform
    refcounting per bridge, but if the driver doesn't, DSA must refcount
    host addresses across all bridges, otherwise it would be telling the
    driver to delete an FDB entry for a bridge and the driver would delete
    it for all bridges. So introduce a bool fdb_isolation in drivers which
    would make all bridge databases passed to the cross-chip notifier have
    the same number (0). This makes dsa_mac_addr_find() -> dsa_db_equal()
    say that all bridge databases are the same database - which is
    essentially the legacy behavior.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    c2693363
switch.c 25.7 KB