bridge: support for nexthop id in fdb entries

This patch adds support to assign a nexthop group
id to an fdb entry.

$bridge fdb add 02:02:00:00:00:13 dev vx10 nhid 102 self

Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
Signed-off-by: David Ahern <dsahern@gmail.com>
This commit is contained in:
Roopa Prabhu 2020-06-10 17:35:21 -07:00 committed by David Ahern
parent a56d17463c
commit 468f787f64
2 changed files with 29 additions and 6 deletions

View File

@ -37,9 +37,9 @@ static void usage(void)
fprintf(stderr, fprintf(stderr,
"Usage: bridge fdb { add | append | del | replace } ADDR dev DEV\n" "Usage: bridge fdb { add | append | del | replace } ADDR dev DEV\n"
" [ self ] [ master ] [ use ] [ router ] [ extern_learn ]\n" " [ self ] [ master ] [ use ] [ router ] [ extern_learn ]\n"
" [ sticky ] [ local | static | dynamic ] [ dst IPADDR ]\n" " [ sticky ] [ local | static | dynamic ] [ vlan VID ]\n"
" [ vlan VID ] [ port PORT] [ vni VNI ] [ via DEV ]\n" " { [ dst IPADDR ] [ port PORT] [ vni VNI ] | [ nhid NHID ] }\n"
" [ src_vni VNI ]\n" " [ via DEV ] [ src_vni VNI ]\n"
" bridge fdb [ show [ br BRDEV ] [ brport DEV ] [ vlan VID ] [ state STATE ] ]\n" " bridge fdb [ show [ br BRDEV ] [ brport DEV ] [ vlan VID ] [ state STATE ] ]\n"
" bridge fdb get ADDR [ br BRDEV ] { brport |dev } DEV [ vlan VID ]\n" " bridge fdb get ADDR [ br BRDEV ] { brport |dev } DEV [ vlan VID ]\n"
" [ vni VNI ]\n"); " [ vni VNI ]\n");
@ -237,6 +237,10 @@ int print_fdb(struct nlmsghdr *n, void *arg)
ll_index_to_name(ifindex)); ll_index_to_name(ifindex));
} }
if (tb[NDA_NH_ID])
print_uint(PRINT_ANY, "nhid", "nhid %u ",
rta_getattr_u32(tb[NDA_NH_ID]));
if (tb[NDA_LINK_NETNSID]) if (tb[NDA_LINK_NETNSID])
print_uint(PRINT_ANY, print_uint(PRINT_ANY,
"linkNetNsId", "link-netnsid %d ", "linkNetNsId", "link-netnsid %d ",
@ -390,6 +394,7 @@ static int fdb_modify(int cmd, int flags, int argc, char **argv)
unsigned int via = 0; unsigned int via = 0;
char *endptr; char *endptr;
short vid = -1; short vid = -1;
__u32 nhid = 0;
while (argc > 0) { while (argc > 0) {
if (strcmp(*argv, "dev") == 0) { if (strcmp(*argv, "dev") == 0) {
@ -401,6 +406,10 @@ static int fdb_modify(int cmd, int flags, int argc, char **argv)
duparg2("dst", *argv); duparg2("dst", *argv);
get_addr(&dst, *argv, preferred_family); get_addr(&dst, *argv, preferred_family);
dst_ok = 1; dst_ok = 1;
} else if (strcmp(*argv, "nhid") == 0) {
NEXT_ARG();
if (get_u32(&nhid, *argv, 0))
invarg("\"id\" value is invalid\n", *argv);
} else if (strcmp(*argv, "port") == 0) { } else if (strcmp(*argv, "port") == 0) {
NEXT_ARG(); NEXT_ARG();
@ -475,6 +484,11 @@ static int fdb_modify(int cmd, int flags, int argc, char **argv)
return -1; return -1;
} }
if (nhid && (dst_ok || port || vni != ~0)) {
fprintf(stderr, "dst, port, vni are mutually exclusive with nhid\n");
return -1;
}
/* Assume self */ /* Assume self */
if (!(req.ndm.ndm_flags&(NTF_SELF|NTF_MASTER))) if (!(req.ndm.ndm_flags&(NTF_SELF|NTF_MASTER)))
req.ndm.ndm_flags |= NTF_SELF; req.ndm.ndm_flags |= NTF_SELF;
@ -496,6 +510,8 @@ static int fdb_modify(int cmd, int flags, int argc, char **argv)
if (vid >= 0) if (vid >= 0)
addattr16(&req.n, sizeof(req), NDA_VLAN, vid); addattr16(&req.n, sizeof(req), NDA_VLAN, vid);
if (nhid > 0)
addattr32(&req.n, sizeof(req), NDA_NH_ID, nhid);
if (port) { if (port) {
unsigned short dport; unsigned short dport;

View File

@ -68,16 +68,18 @@ bridge \- show / manipulate bridge addresses and devices
.IR DEV " { " .IR DEV " { "
.BR local " | " static " | " dynamic " } [ " .BR local " | " static " | " dynamic " } [ "
.BR self " ] [ " master " ] [ " router " ] [ " use " ] [ " extern_learn " ] [ " sticky " ] [ " .BR self " ] [ " master " ] [ " router " ] [ " use " ] [ " extern_learn " ] [ " sticky " ] [ "
.B src_vni
.IR VNI " ] { ["
.B dst .B dst
.IR IPADDR " ] [ " .IR IPADDR " ] [ "
.B src_vni
.IR VNI " ] ["
.B vni .B vni
.IR VNI " ] [" .IR VNI " ] ["
.B port .B port
.IR PORT " ] [" .IR PORT " ] ["
.B via .B via
.IR DEVICE " ]" .IR DEVICE " ] | "
.B nhid
.IR NHID " } "
.ti -8 .ti -8
.BR "bridge fdb" " [ " show " ] [ " .BR "bridge fdb" " [ " show " ] [ "
@ -583,6 +585,11 @@ device name of the outgoing interface for the
VXLAN device driver to reach the VXLAN device driver to reach the
remote VXLAN tunnel endpoint. remote VXLAN tunnel endpoint.
.TP
.BI nhid " NHID "
ecmp nexthop group for the VXLAN device driver
to reach remote VXLAN tunnel endpoints.
.SS bridge fdb append - append a forwarding database entry .SS bridge fdb append - append a forwarding database entry
This command adds a new fdb entry with an already known This command adds a new fdb entry with an already known
.IR LLADDR . .IR LLADDR .