summaryrefslogtreecommitdiff
path: root/lib/nexthop_group.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2019-12-06 12:28:38 -0500
committerDonald Sharp <sharpd@cumulusnetworks.com>2019-12-09 13:39:59 -0500
commit597371a615b9f062642dfd97b4d81c05e7a9bd55 (patch)
tree5931883602bc7e885aa64d0560b377191034a99f /lib/nexthop_group.c
parentbd054c1aa288b232fb0bab48af855035df5c62bc (diff)
lib: Add weight to nexthop for nexthop-group nexthops
Add the ability to read in the weight of a nexthop and store/handle it appropriately nexthop-group BLUE nexthop 192.168.201.44 weight 33 nexthop 192.168.201.45 weight 66 nexthop 192.168.201.46 weight 99 Is appropriately read in and handled as appropriate. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'lib/nexthop_group.c')
-rw-r--r--lib/nexthop_group.c55
1 files changed, 35 insertions, 20 deletions
diff --git a/lib/nexthop_group.c b/lib/nexthop_group.c
index b810d13a5a..991843a047 100644
--- a/lib/nexthop_group.c
+++ b/lib/nexthop_group.c
@@ -42,6 +42,7 @@ struct nexthop_hold {
union sockunion *addr;
char *intf;
char *labels;
+ uint32_t weight;
};
struct nexthop_group_hooks {
@@ -526,8 +527,8 @@ DEFUN_NOSH(no_nexthop_group, no_nexthop_group_cmd, "no nexthop-group NHGNAME",
static void nexthop_group_save_nhop(struct nexthop_group_cmd *nhgc,
const char *nhvrf_name,
const union sockunion *addr,
- const char *intf,
- const char *labels)
+ const char *intf, const char *labels,
+ const uint32_t weight)
{
struct nexthop_hold *nh;
@@ -542,23 +543,26 @@ static void nexthop_group_save_nhop(struct nexthop_group_cmd *nhgc,
if (labels)
nh->labels = XSTRDUP(MTYPE_TMP, labels);
+ nh->weight = weight;
+
listnode_add_sort(nhgc->nhg_list, nh);
}
static void nexthop_group_unsave_nhop(struct nexthop_group_cmd *nhgc,
const char *nhvrf_name,
const union sockunion *addr,
- const char *intf,
- const char *labels)
+ const char *intf, const char *labels,
+ const uint32_t weight)
{
struct nexthop_hold *nh;
struct listnode *node;
for (ALL_LIST_ELEMENTS_RO(nhgc->nhg_list, node, nh)) {
- if (nhgc_cmp_helper(nhvrf_name, nh->nhvrf_name) == 0 &&
- nhgc_addr_cmp_helper(addr, nh->addr) == 0 &&
- nhgc_cmp_helper(intf, nh->intf) == 0 &&
- nhgc_cmp_helper(labels, nh->labels) == 0)
+ if (nhgc_cmp_helper(nhvrf_name, nh->nhvrf_name) == 0
+ && nhgc_addr_cmp_helper(addr, nh->addr) == 0
+ && nhgc_cmp_helper(intf, nh->intf) == 0
+ && nhgc_cmp_helper(labels, nh->labels) == 0
+ && weight == nh->weight)
break;
}
@@ -581,8 +585,8 @@ static void nexthop_group_unsave_nhop(struct nexthop_group_cmd *nhgc,
static bool nexthop_group_parse_nexthop(struct nexthop *nhop,
const union sockunion *addr,
const char *intf, const char *name,
- const char *labels,
- int *lbl_ret)
+ const char *labels, int *lbl_ret,
+ uint32_t weight)
{
int ret = 0;
struct vrf *vrf;
@@ -639,6 +643,8 @@ static bool nexthop_group_parse_nexthop(struct nexthop *nhop,
num, larray);
}
+ nhop->weight = weight;
+
return true;
}
@@ -648,11 +654,9 @@ static bool nexthop_group_parse_nexthop(struct nexthop *nhop,
static bool nexthop_group_parse_nhh(struct nexthop *nhop,
const struct nexthop_hold *nhh)
{
- return (nexthop_group_parse_nexthop(nhop, nhh->addr,
- nhh->intf,
- nhh->nhvrf_name,
- nhh->labels,
- NULL));
+ return (nexthop_group_parse_nexthop(nhop, nhh->addr, nhh->intf,
+ nhh->nhvrf_name, nhh->labels, NULL,
+ nhh->weight));
}
DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
@@ -664,6 +668,7 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
[{ \
nexthop-vrf NAME$vrf_name \
|label WORD \
+ |weight (1-255) \
}]",
NO_STR
"Specify one of the nexthops in this ECMP group\n"
@@ -674,7 +679,9 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
"If the nexthop is in a different vrf tell us\n"
"The nexthop-vrf Name\n"
"Specify label(s) for this nexthop\n"
- "One or more labels in the range (16-1048575) separated by '/'\n")
+ "One or more labels in the range (16-1048575) separated by '/'\n"
+ "Weight to be used by the nexthop for purposes of ECMP\n"
+ "Weight value to be used\n")
{
VTY_DECLVAR_CONTEXT(nexthop_group_cmd, nhgc);
struct nexthop nhop;
@@ -682,8 +689,8 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
int lbl_ret = 0;
bool legal;
- legal = nexthop_group_parse_nexthop(&nhop, addr, intf, vrf_name,
- label, &lbl_ret);
+ legal = nexthop_group_parse_nexthop(&nhop, addr, intf, vrf_name, label,
+ &lbl_ret, weight);
if (nhop.type == NEXTHOP_TYPE_IPV6
&& IN6_IS_ADDR_LINKLOCAL(&nhop.gate.ipv6)) {
@@ -716,7 +723,8 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
nh = nexthop_exists(&nhgc->nhg, &nhop);
if (no) {
- nexthop_group_unsave_nhop(nhgc, vrf_name, addr, intf, label);
+ nexthop_group_unsave_nhop(nhgc, vrf_name, addr, intf, label,
+ weight);
if (nh) {
_nexthop_del(&nhgc->nhg, nh);
@@ -734,7 +742,8 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
_nexthop_add(&nhgc->nhg.nexthop, nh);
}
- nexthop_group_save_nhop(nhgc, vrf_name, addr, intf, label);
+ nexthop_group_save_nhop(nhgc, vrf_name, addr, intf, label,
+ weight);
if (legal && nhg_hooks.add_nexthop)
nhg_hooks.add_nexthop(nhgc, nh);
@@ -794,6 +803,9 @@ void nexthop_group_write_nexthop(struct vty *vty, struct nexthop *nh)
vty_out(vty, " label %s", buf);
}
+ if (nh->weight)
+ vty_out(vty, " weight %u", nh->weight);
+
vty_out(vty, "\n");
}
@@ -816,6 +828,9 @@ static void nexthop_group_write_nexthop_internal(struct vty *vty,
if (nh->labels)
vty_out(vty, " label %s", nh->labels);
+ if (nh->weight)
+ vty_out(vty, " weight %u", nh->weight);
+
vty_out(vty, "\n");
}