bridge: fdb: support match on nexthop ID in flush command

Extend "fdb flush" command to match fdb entries with a specific nexthop ID.

Example:
$ bridge fdb flush dev vx10 nhid 2
This will flush all fdb entries pointing to vx10 with nexthop ID 2.

Signed-off-by: Amit Cohen <amcohen@nvidia.com>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Signed-off-by: David Ahern <dsahern@kernel.org>
This commit is contained in:
Amit Cohen 2023-10-17 13:55:27 +03:00 committed by David Ahern
parent 69b0310e82
commit f3c34db4be
2 changed files with 16 additions and 1 deletions

View File

@ -46,7 +46,8 @@ static void usage(void)
" bridge fdb get [ to ] LLADDR [ br BRDEV ] { brport | dev } DEV\n" " bridge fdb get [ to ] LLADDR [ br BRDEV ] { brport | dev } DEV\n"
" [ vlan VID ] [ vni VNI ] [ self ] [ master ] [ dynamic ]\n" " [ vlan VID ] [ vni VNI ] [ self ] [ master ] [ dynamic ]\n"
" bridge fdb flush dev DEV [ brport DEV ] [ vlan VID ] [ src_vni VNI ]\n" " bridge fdb flush dev DEV [ brport DEV ] [ vlan VID ] [ src_vni VNI ]\n"
" [ self ] [ master ] [ [no]permanent | [no]static | [no]dynamic ]\n" " [ nhid NHID ] [ self ] [ master ]\n"
" [ [no]permanent | [no]static | [no]dynamic ]\n"
" [ [no]added_by_user ] [ [no]extern_learn ] [ [no]sticky ]\n" " [ [no]added_by_user ] [ [no]extern_learn ] [ [no]sticky ]\n"
" [ [no]offloaded ]\n"); " [ [no]offloaded ]\n");
exit(-1); exit(-1);
@ -701,6 +702,7 @@ static int fdb_flush(int argc, char **argv)
unsigned short ndm_flags = 0; unsigned short ndm_flags = 0;
unsigned short ndm_state = 0; unsigned short ndm_state = 0;
unsigned long src_vni = ~0; unsigned long src_vni = ~0;
__u32 nhid = 0;
char *endptr; char *endptr;
while (argc > 0) { while (argc > 0) {
@ -769,6 +771,10 @@ static int fdb_flush(int argc, char **argv)
if ((endptr && *endptr) || if ((endptr && *endptr) ||
(src_vni >> 24) || src_vni == ULONG_MAX) (src_vni >> 24) || src_vni == ULONG_MAX)
invarg("invalid src VNI\n", *argv); invarg("invalid src VNI\n", *argv);
} else if (strcmp(*argv, "nhid") == 0) {
NEXT_ARG();
if (get_u32(&nhid, *argv, 0))
invarg("\"nid\" value is invalid\n", *argv);
} else if (strcmp(*argv, "help") == 0) { } else if (strcmp(*argv, "help") == 0) {
NEXT_ARG(); NEXT_ARG();
} else { } else {
@ -817,6 +823,8 @@ static int fdb_flush(int argc, char **argv)
addattr16(&req.n, sizeof(req), NDA_VLAN, vid); addattr16(&req.n, sizeof(req), NDA_VLAN, vid);
if (src_vni != ~0) if (src_vni != ~0)
addattr32(&req.n, sizeof(req), NDA_SRC_VNI, src_vni); addattr32(&req.n, sizeof(req), NDA_SRC_VNI, src_vni);
if (nhid > 0)
addattr32(&req.n, sizeof(req), NDA_NH_ID, nhid);
if (ndm_flags_mask) if (ndm_flags_mask)
addattr8(&req.n, sizeof(req), NDA_NDM_FLAGS_MASK, addattr8(&req.n, sizeof(req), NDA_NDM_FLAGS_MASK,
ndm_flags_mask); ndm_flags_mask);

View File

@ -130,6 +130,8 @@ bridge \- show / manipulate bridge addresses and devices
.IR VID " ] [ " .IR VID " ] [ "
.B src_vni .B src_vni
.IR VNI " ] [ " .IR VNI " ] [ "
.B nhid
.IR NHID " ] ["
.BR self " ] [ " master " ] [ " .BR self " ] [ " master " ] [ "
.BR [no]permanent " | " [no]static " | " [no]dynamic " ] [ " .BR [no]permanent " | " [no]static " | " [no]dynamic " ] [ "
.BR [no]added_by_user " ] [ " [no]extern_learn " ] [ " .BR [no]added_by_user " ] [ " [no]extern_learn " ] [ "
@ -900,6 +902,11 @@ the src VNI Network Identifier (or VXLAN Segment ID) for the operation. Match
forwarding table entries only with the specified VNI. Valid if the referenced forwarding table entries only with the specified VNI. Valid if the referenced
device is a VXLAN type device. device is a VXLAN type device.
.TP
.BI nhid " NHID"
the ECMP nexthop group for the operation. Match forwarding table entries only
with the specified NHID. Valid if the referenced device is a VXLAN type device.
.TP .TP
.B self .B self
the operation is fulfilled directly by the driver for the specified network the operation is fulfilled directly by the driver for the specified network