• Vladimir Oltean's avatar
    net: dsa: introduce a separate cross-chip notifier type for host MDBs · b8e997c4
    Vladimir Oltean authored
    Commit abd49535 ("net: dsa: execute dsa_switch_mdb_add only for
    routing port in cross-chip topologies") does a surprisingly good job
    even for the SWITCHDEV_OBJ_ID_HOST_MDB use case, where DSA simply
    translates a switchdev object received on dp into a cross-chip notifier
    for dp->cpu_dp.
    
    To visualize how that works, imagine the daisy chain topology below and
    consider a SWITCHDEV_OBJ_ID_HOST_MDB object emitted on sw2p0. How does
    the cross-chip notifier know to match on all the right ports (sw0p4, the
    dedicated CPU port, sw1p4, an upstream DSA link, and sw2p4, another
    upstream DSA link)?
    
                                                    |
           sw0p0     sw0p1     sw0p2     sw0p3     sw0p4
        [  user ] [  user ] [  user ] [  dsa  ] [  cpu  ]
        [       ] [       ] [       ] [       ] [   x   ]
                                          |
                                          +---------+
                                                    |
           sw1p0     sw1p1     sw1p2     sw1p3     sw1p4
        [  user ] [  user ] [  user ] [  dsa  ] [  dsa  ]
        [       ] [       ] [       ] [       ] [   x   ]
                                          |
                                          +---------+
                                                    |
           sw2p0     sw2p1     sw2p2     sw2p3     sw2p4
        [  user ] [  user ] [  user ] [  user ] [  dsa  ]
        [       ] [       ] [       ] [       ] [   x   ]
    
    The answer is simple: the dedicated CPU port of sw2p0 is sw0p4, and
    dsa_routing_port returns the upstream port for all switches.
    
    That is fine, but there are other topologies where this does not work as
    well. There are trees with "H" topologies in the wild, where there are 2
    or more switches with DSA links between them, but every switch has its
    dedicated CPU port. For these topologies, it seems stupid for the neighbor
    switches to install an MDB entry on the routing port, since these
    multicast addresses are fundamentally different than the usual ones we
    support (and that is the justification for this patch, to introduce the
    concept of a termination plane multicast MAC address, as opposed to a
    forwarding plane multicast MAC address).
    
    For example, when a SWITCHDEV_OBJ_ID_HOST_MDB would get added to sw0p0,
    without this patch, it would get treated as a regular port MDB on sw0p2
    and it would match on the ports below (including the sw1p3 routing port).
    
                             |                                  |
        sw0p0     sw0p1     sw0p2     sw0p3          sw1p3     sw1p2     sw1p1     sw1p0
     [  user ] [  user ] [  cpu  ] [  dsa  ]      [  dsa  ] [  cpu  ] [  user ] [  user ]
     [       ] [       ] [   x   ] [       ] ---- [   x   ] [       ] [       ] [       ]
    
    With the patch, the host MDB notifier on sw0p0 matches only on the local
    switch, which is what we want for a termination plane address.
    
                             |                                  |
        sw0p0     sw0p1     sw0p2     sw0p3          sw1p3     sw1p2     sw1p1     sw1p0
     [  user ] [  user ] [  cpu  ] [  dsa  ]      [  dsa  ] [  cpu  ] [  user ] [  user ]
     [       ] [       ] [   x   ] [       ] ---- [       ] [       ] [       ] [       ]
    
    Name this new matching function "dsa_switch_host_address_match" since we
    will be reusing it soon for host FDB entries as well.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b8e997c4
switch.c 13.8 KB