• Vladimir Oltean's avatar
    net: switchdev: fix FDB entries towards foreign ports not getting propagated to us · 2b0a5688
    Vladimir Oltean authored
    The newly introduced switchdev_handle_fdb_{add,del}_to_device helpers
    solved a problem but introduced another one. They have a severe design
    bug: they do not propagate FDB events on foreign interfaces to us, i.e.
    this use case:
    
             br0
            /   \
           /     \
          /       \
         /         \
       swp0       eno0
    (switchdev)  (foreign)
    
    when an address is learned on eno0, what is supposed to happen is that
    this event should also be propagated towards swp0. Somehow I managed to
    convince myself that this did work correctly, but obviously it does not.
    
    The trouble with foreign interfaces is that we must reach a switchdev
    net_device pointer through a foreign net_device that has no direct
    upper/lower relationship with it. So we need to do exploratory searching
    through the lower interfaces of the foreign net_device's bridge upper
    (to reach swp0 from eno0, we must check its upper, br0, for lower
    interfaces that pass the check_cb and foreign_dev_check_cb). This is
    something that the previous code did not do, it just assumed that "dev"
    will become a switchdev interface at some point, somehow, probably by
    magic.
    
    With this patch, assisted address learning on the CPU port works again
    in DSA:
    
    ip link add br0 type bridge
    ip link set swp0 master br0
    ip link set eno0 master br0
    ip link set br0 up
    
    [   46.708929] mscc_felix 0000:00:00.5 swp0: Adding FDB entry towards eno0, addr 00:04:9f:05:f4:ab vid 0 as host address
    
    Fixes: 8ca07176
    
     ("net: switchdev: introduce a fanout helper for SWITCHDEV_FDB_{ADD,DEL}_TO_DEVICE")
    Reported-by: default avatarEric Woudstra <ericwouds@gmail.com>
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    2b0a5688
switchdev.c 23 KB