Add support for fdb flush filtering based on destination ifindex. The
ifindex must either match a port's device ifindex or the bridge's.

Signed-off-by: Nikolay Aleksandrov <[email protected]>
---
 include/uapi/linux/if_bridge.h | 1 +
 net/bridge/br_fdb.c            | 7 +++++++
 2 files changed, 8 insertions(+)

diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h
index 4638d7e39f2a..67ee12586844 100644
--- a/include/uapi/linux/if_bridge.h
+++ b/include/uapi/linux/if_bridge.h
@@ -819,6 +819,7 @@ enum {
        FDB_FLUSH_NDM_STATE_MASK,
        FDB_FLUSH_NDM_FLAGS,
        FDB_FLUSH_NDM_FLAGS_MASK,
+       FDB_FLUSH_PORT_IFINDEX,
        __FDB_FLUSH_MAX
 };
 #define FDB_FLUSH_MAX (__FDB_FLUSH_MAX - 1)
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
index 340a2ace1d5e..53208adf7474 100644
--- a/net/bridge/br_fdb.c
+++ b/net/bridge/br_fdb.c
@@ -628,6 +628,7 @@ static const struct nla_policy 
br_fdb_flush_policy[FDB_FLUSH_MAX + 1] = {
        [FDB_FLUSH_NDM_FLAGS]   = { .type = NLA_U16 },
        [FDB_FLUSH_NDM_STATE_MASK]      = { .type = NLA_U16 },
        [FDB_FLUSH_NDM_FLAGS_MASK]      = { .type = NLA_U16 },
+       [FDB_FLUSH_PORT_IFINDEX]        = { .type = NLA_S32 },
 };
 
 int br_fdb_flush_nlattr(struct net_bridge *br, struct nlattr *fdb_flush_attr,
@@ -664,6 +665,12 @@ int br_fdb_flush_nlattr(struct net_bridge *br, struct 
nlattr *fdb_flush_attr,
                ndm_flags_mask = 
nla_get_u16(fdb_flush_tb[FDB_FLUSH_NDM_FLAGS_MASK]);
                desc.flags_mask |= __ndm_flags_to_fdb_flags(ndm_flags_mask);
        }
+       if (fdb_flush_tb[FDB_FLUSH_PORT_IFINDEX]) {
+               int port_ifidx;
+
+               port_ifidx = nla_get_u32(fdb_flush_tb[FDB_FLUSH_PORT_IFINDEX]);
+               desc.port_ifindex = port_ifidx;
+       }
 
        br_debug(br, "flushing port ifindex: %d vlan id: %u flags: 0x%lx flags 
mask: 0x%lx\n",
                 desc.port_ifindex, desc.vlan_id, desc.flags, desc.flags_mask);
-- 
2.35.1

Reply via email to