• Vladimir Oltean's avatar
    net: dsa: allow masters to join a LAG · acc43b7b
    Vladimir Oltean authored
    There are 2 ways in which a DSA user port may become handled by 2 CPU
    ports in a LAG:
    
    (1) its current DSA master joins a LAG
    
     ip link del bond0 && ip link add bond0 type bond mode 802.3ad
     ip link set eno2 master bond0
    
    When this happens, all user ports with "eno2" as DSA master get
    automatically migrated to "bond0" as DSA master.
    
    (2) it is explicitly configured as such by the user
    
     # Before, the DSA master was eno3
     ip link set swp0 type dsa master bond0
    
    The design of this configuration is that the LAG device dynamically
    becomes a DSA master through dsa_master_setup() when the first physical
    DSA master becomes a LAG slave, and stops being so through
    dsa_master_teardown() when the last physical DSA master leaves.
    
    A LAG interface is considered as a valid DSA master only if it contains
    existing DSA masters, and no other lower interfaces. Therefore, we
    mainly rely on method (1) to enter this configuration.
    
    Each physical DSA master (LAG slave) retains its dev->dsa_ptr for when
    it becomes a standalone DSA master again. But the LAG master also has a
    dev->dsa_ptr, and this is actually duplicated from one of the physical
    LAG slaves, and therefore needs to be balanced when LAG slaves come and
    go.
    
    To the switch driver, putting DSA masters in a LAG is seen as putting
    their associated CPU ports in a LAG.
    
    We need to prepare cross-chip host FDB notifiers for CPU ports in a LAG,
    by calling the driver's ->lag_fdb_add method rather than ->port_fdb_add.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    acc43b7b
port.c 49.2 KB