• Vladimir Oltean's avatar
    net: bridge: don't notify switchdev for local FDB addresses · 6ab4c311
    Vladimir Oltean authored
    As explained in this discussion:
    https://lore.kernel.org/netdev/20210117193009.io3nungdwuzmo5f7@skbuf/
    
    the switchdev notifiers for FDB entries managed to have a zero-day bug.
    The bridge would not say that this entry is local:
    
    ip link add br0 type bridge
    ip link set swp0 master br0
    bridge fdb add dev swp0 00:01:02:03:04:05 master local
    
    and the switchdev driver would be more than happy to offload it as a
    normal static FDB entry. This is despite the fact that 'local' and
    non-'local' entries have completely opposite directions: a local entry
    is locally terminated and not forwarded, whereas a static entry is
    forwarded and not locally terminated. So, for example, DSA would install
    this entry on swp0 instead of installing it on the CPU port as it should.
    
    There is an even sadder part, which is that the 'local' flag is implicit
    if 'static' is not specified, meaning that this command produces the
    same result of adding a 'local' entry:
    
    bridge fdb add dev swp0 00:01:02:03:04:05 master
    
    I've updated the man pages for 'bridge', and after reading it now, it
    should be pretty clear to any user that the commands above were broken
    and should have never resulted in the 00:01:02:03:04:05 address being
    forwarded (this behavior is coherent with non-switchdev interfaces):
    https://patchwork.kernel.org/project/netdevbpf/cover/20210211104502.2081443-1-olteanv@gmail.com/
    If you're a user reading this and this is what you want, just use:
    
    bridge fdb add dev swp0 00:01:02:03:04:05 master static
    
    Because switchdev should have given drivers the means from day one to
    classify FDB entries as local/non-local, but didn't, it means that all
    drivers are currently broken. So we can just as well omit the switchdev
    notifications for local FDB entries, which is exactly what this patch
    does to close the bug in stable trees. For further development work
    where drivers might want to trap the local FDB entries to the host, we
    can add a 'bool is_local' to br_switchdev_fdb_call_notifiers(), and
    selectively make drivers act upon that bit, while all the others ignore
    those entries if the 'is_local' bit is set.
    
    Fixes: 6b26b51b ("net: bridge: Add support for notifying devices about FDB add/del")
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6ab4c311
br_switchdev.c 4.2 KB