Skip to content

Commit

Permalink
vxlan: vxlan_core: Support FDB flushing by destination IP
Browse files Browse the repository at this point in the history
Add support for flush VXLAN FDB entries by destination IP. FDB entry is
stored as {MAC, SRC_VNI} + remote. The destination IP is an attribute of
the remote. For multicast entries, the VXLAN driver stores a linked list
of remotes for a given key.

In user space, each remote is represented as a separate entry, so when
flush is sent with filter of 'destination IP', flush only the match
remotes. In case that there are no additional remotes, destroy the entry.

For example, the following are stored as one entry with several remotes:
$ bridge fdb show dev vx10
00:00:00:00:00:00 dst 192.1.1.3 self permanent
00:00:00:00:00:00 dst 192.1.1.1 self permanent
00:00:00:00:00:00 dst 192.1.1.2 self permanent
00:00:00:00:00:00 dst 192.1.1.1 vni 1000 self permanent

When user flush by destination IP x, only the relevant remotes will be
flushed:
$ bridge fdb flush dev vx10 dst 192.1.1.1

$ bridge fdb show dev vx10
00:00:00:00:00:00 dst 192.1.1.3 self permanent
00:00:00:00:00:00 dst 192.1.1.2 self permanent

Signed-off-by: Amit Cohen <amcohen@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Amit Cohen authored and David S. Miller committed Oct 13, 2023
1 parent ac0db4d commit 2dcd220
Showing 1 changed file with 20 additions and 1 deletion.
21 changes: 20 additions & 1 deletion drivers/net/vxlan/vxlan_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -3032,6 +3032,7 @@ struct vxlan_fdb_flush_desc {
u32 nhid;
__be32 vni;
__be16 port;
union vxlan_addr dst_ip;
};

static bool vxlan_fdb_is_default_entry(const struct vxlan_fdb *f,
Expand Down Expand Up @@ -3072,7 +3073,7 @@ static bool vxlan_fdb_flush_matches(const struct vxlan_fdb *f,
static bool
vxlan_fdb_flush_should_match_remotes(const struct vxlan_fdb_flush_desc *desc)
{
return desc->vni || desc->port;
return desc->vni || desc->port || desc->dst_ip.sa.sa_family;
}

static bool
Expand All @@ -3085,6 +3086,10 @@ vxlan_fdb_flush_remote_matches(const struct vxlan_fdb_flush_desc *desc,
if (desc->port && rd->remote_port != desc->port)
return false;

if (desc->dst_ip.sa.sa_family &&
!vxlan_addr_equal(&rd->remote_ip, &desc->dst_ip))
return false;

return true;
}

Expand Down Expand Up @@ -3146,6 +3151,8 @@ static const struct nla_policy vxlan_del_bulk_policy[NDA_MAX + 1] = {
[NDA_NH_ID] = { .type = NLA_U32 },
[NDA_VNI] = { .type = NLA_U32 },
[NDA_PORT] = { .type = NLA_U16 },
[NDA_DST] = NLA_POLICY_RANGE(NLA_BINARY, sizeof(struct in_addr),
sizeof(struct in6_addr)),
[NDA_NDM_STATE_MASK] = { .type = NLA_U16 },
[NDA_NDM_FLAGS_MASK] = { .type = NLA_U8 },
};
Expand Down Expand Up @@ -3202,6 +3209,18 @@ static int vxlan_fdb_delete_bulk(struct nlmsghdr *nlh, struct net_device *dev,
if (tb[NDA_PORT])
desc.port = nla_get_be16(tb[NDA_PORT]);

if (tb[NDA_DST]) {
union vxlan_addr ip;

err = vxlan_nla_get_addr(&ip, tb[NDA_DST]);
if (err) {
NL_SET_ERR_MSG_ATTR(extack, tb[NDA_DST],
"Unsupported address family");
return err;
}
desc.dst_ip = ip;
}

vxlan_flush(vxlan, &desc);

return 0;
Expand Down

0 comments on commit 2dcd220

Please sign in to comment.