Patch "net: bridge: don't notify switchdev for local FDB addresses" has been added to the 5.11-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: bridge: don't notify switchdev for local FDB addresses

to the 5.11-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-bridge-don-t-notify-switchdev-for-local-fdb-addr.patch
and it can be found in the queue-5.11 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 8eedbd1b9fc2482678d97ddbe0275f6e0f9afdc5
Author: Vladimir Oltean <vladimir.oltean@xxxxxxx>
Date:   Mon Mar 22 20:21:08 2021 +0200

    net: bridge: don't notify switchdev for local FDB addresses
    
    [ Upstream commit 6ab4c3117aec4e08007d9e971fa4133e1de1082d ]
    
    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@xxxxxxxxx/
    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: 6b26b51b1d13 ("net: bridge: Add support for notifying devices about FDB add/del")
    Signed-off-by: Vladimir Oltean <vladimir.oltean@xxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/bridge/br_switchdev.c b/net/bridge/br_switchdev.c
index 015209bf44aa..3c42095fa75f 100644
--- a/net/bridge/br_switchdev.c
+++ b/net/bridge/br_switchdev.c
@@ -123,6 +123,8 @@ br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type)
 {
 	if (!fdb->dst)
 		return;
+	if (test_bit(BR_FDB_LOCAL, &fdb->flags))
+		return;
 
 	switch (type) {
 	case RTM_DELNEIGH:



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux