On 1 November 2022 20:57:53 EET, Ido Schimmel <idosch@xxxxxxxxxx> wrote: >The following commands should result in all the dynamic FDB entries >being flushed, but instead all the non-local (non-permanent) entries are >flushed: > > # bridge fdb add 00:aa:bb:cc:dd:ee dev dummy1 master static > # bridge fdb add 00:11:22:33:44:55 dev dummy1 master dynamic > # ip link set dev br0 type bridge fdb_flush > # bridge fdb show brport dummy1 > 00:00:00:00:00:01 master br0 permanent > 33:33:00:00:00:01 self permanent > 01:00:5e:00:00:01 self permanent > >This is because br_fdb_flush() works with FDB flags and not the >corresponding enumerator values. Fix by passing the FDB flag instead. > >After the fix: > > # bridge fdb add 00:aa:bb:cc:dd:ee dev dummy1 master static > # bridge fdb add 00:11:22:33:44:55 dev dummy1 master dynamic > # ip link set dev br0 type bridge fdb_flush > # bridge fdb show brport dummy1 > 00:aa:bb:cc:dd:ee master br0 static > 00:00:00:00:00:01 master br0 permanent > 33:33:00:00:00:01 self permanent > 01:00:5e:00:00:01 self permanent > >Fixes: 1f78ee14eeac ("net: bridge: fdb: add support for fine-grained flushing") >Signed-off-by: Ido Schimmel <idosch@xxxxxxxxxx> >--- > net/bridge/br_netlink.c | 2 +- > net/bridge/br_sysfs_br.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > >diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c >index 5aeb3646e74c..d087fd4c784a 100644 >--- a/net/bridge/br_netlink.c >+++ b/net/bridge/br_netlink.c >@@ -1332,7 +1332,7 @@ static int br_changelink(struct net_device *brdev, struct nlattr *tb[], > > if (data[IFLA_BR_FDB_FLUSH]) { > struct net_bridge_fdb_flush_desc desc = { >- .flags_mask = BR_FDB_STATIC >+ .flags_mask = BIT(BR_FDB_STATIC) > }; > > br_fdb_flush(br, &desc); >diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c >index 612e367fff20..ea733542244c 100644 >--- a/net/bridge/br_sysfs_br.c >+++ b/net/bridge/br_sysfs_br.c >@@ -345,7 +345,7 @@ static int set_flush(struct net_bridge *br, unsigned long val, > struct netlink_ext_ack *extack) > { > struct net_bridge_fdb_flush_desc desc = { >- .flags_mask = BR_FDB_STATIC >+ .flags_mask = BIT(BR_FDB_STATIC) > }; > > br_fdb_flush(br, &desc); Oops. :) Acked-by: Nikolay Aleksandrov <razor@xxxxxxxxxxxxx>