summaryrefslogtreecommitdiff
path: root/lib/nexthop_group.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/nexthop_group.c')
-rw-r--r--lib/nexthop_group.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/lib/nexthop_group.c b/lib/nexthop_group.c
index 7e27798062..fd7eee213c 100644
--- a/lib/nexthop_group.c
+++ b/lib/nexthop_group.c
@@ -41,6 +41,7 @@ struct nexthop_hold {
char *intf;
bool onlink;
char *labels;
+ vni_t vni;
uint32_t weight;
char *backup_str;
};
@@ -803,12 +804,13 @@ static bool nexthop_group_parse_nexthop(struct nexthop *nhop,
const union sockunion *addr,
const char *intf, bool onlink,
const char *name, const char *labels,
- int *lbl_ret, uint32_t weight,
- const char *backup_str)
+ vni_t vni, int *lbl_ret,
+ uint32_t weight, const char *backup_str)
{
int ret = 0;
struct vrf *vrf;
int num;
+ uint8_t labelnum = 0;
memset(nhop, 0, sizeof(*nhop));
@@ -849,10 +851,9 @@ static bool nexthop_group_parse_nexthop(struct nexthop *nhop,
nhop->type = NEXTHOP_TYPE_IFINDEX;
if (labels) {
- uint8_t num = 0;
mpls_label_t larray[MPLS_MAX_LABELS];
- ret = mpls_str2label(labels, &num, larray);
+ ret = mpls_str2label(labels, &labelnum, larray);
/* Return label parse result */
if (lbl_ret)
@@ -860,9 +861,14 @@ static bool nexthop_group_parse_nexthop(struct nexthop *nhop,
if (ret < 0)
return false;
- else if (num > 0)
- nexthop_add_labels(nhop, ZEBRA_LSP_NONE,
- num, larray);
+ else if (labelnum > 0)
+ nexthop_add_labels(nhop, ZEBRA_LSP_NONE, labelnum,
+ larray);
+ } else if (vni) {
+ mpls_label_t label = MPLS_INVALID_LABEL;
+
+ vni2label(vni, &label);
+ nexthop_add_labels(nhop, ZEBRA_LSP_EVPN, 1, &label);
}
nhop->weight = weight;
@@ -889,7 +895,7 @@ static bool nexthop_group_parse_nhh(struct nexthop *nhop,
{
return (nexthop_group_parse_nexthop(
nhop, nhh->addr, nhh->intf, nhh->onlink, nhh->nhvrf_name,
- nhh->labels, NULL, nhh->weight, nhh->backup_str));
+ nhh->labels, nhh->vni, NULL, nhh->weight, nhh->backup_str));
}
DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
@@ -901,6 +907,7 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
[{ \
nexthop-vrf NAME$vrf_name \
|label WORD \
+ |vni (1-16777215) \
|weight (1-255) \
|backup-idx WORD \
}]",
@@ -915,6 +922,8 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
"The nexthop-vrf Name\n"
"Specify label(s) for this nexthop\n"
"One or more labels in the range (16-1048575) separated by '/'\n"
+ "Specify VNI(s) for this nexthop\n"
+ "VNI in the range (1-16777215)\n"
"Weight to be used by the nexthop for purposes of ECMP\n"
"Weight value to be used\n"
"Specify backup nexthop indexes in another group\n"
@@ -939,8 +948,8 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
}
legal = nexthop_group_parse_nexthop(&nhop, addr, intf, !!onlink,
- vrf_name, label, &lbl_ret, weight,
- backup_idx);
+ vrf_name, label, vni, &lbl_ret,
+ weight, backup_idx);
if (nhop.type == NEXTHOP_TYPE_IPV6
&& IN6_IS_ADDR_LINKLOCAL(&nhop.gate.ipv6)) {
@@ -1166,6 +1175,9 @@ static void nexthop_group_write_nexthop_internal(struct vty *vty,
if (nh->labels)
vty_out(vty, " label %s", nh->labels);
+ if (nh->vni)
+ vty_out(vty, " vni %u", nh->vni);
+
if (nh->weight)
vty_out(vty, " weight %u", nh->weight);