summaryrefslogtreecommitdiff
path: root/lib/nexthop_group.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2018-09-20 13:59:35 -0400
committerStephen Worley <sworley@cumulusnetworks.com>2019-06-25 22:58:47 -0400
commit6c8b51e172a67c8e575299ad493f1702a0608336 (patch)
tree3788f202434dc6c23fe4e4761468cd11879dfc5c /lib/nexthop_group.c
parentf3afd0a4e18f3b1fe11f687f9fceba1befbdb06d (diff)
lib: Add a couple functions to nexthop_group.c
Add nexthop_group_copy and nexthop_group_add_sorted functions. nexthop_group_copy -> Copy src nexthop_group into dst nexthop_group nexthop_group_add_sorted -> Adds a new nexthop to the nexthop group in a sorted manner. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'lib/nexthop_group.c')
-rw-r--r--lib/nexthop_group.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/nexthop_group.c b/lib/nexthop_group.c
index 10f610db37..d250e0e9b6 100644
--- a/lib/nexthop_group.c
+++ b/lib/nexthop_group.c
@@ -100,6 +100,12 @@ struct nexthop_group *nexthop_group_new(void)
return XCALLOC(MTYPE_NEXTHOP_GROUP, sizeof(struct nexthop_group));
}
+void nexthop_group_copy(struct nexthop_group *to, struct nexthop_group *from)
+{
+ /* Copy everything, including recursive info */
+ copy_nexthops(&to->nexthop, from->nexthop, NULL);
+}
+
void nexthop_group_delete(struct nexthop_group **nhg)
{
XFREE(MTYPE_NEXTHOP_GROUP, *nhg);
@@ -119,6 +125,35 @@ void nexthop_add(struct nexthop **target, struct nexthop *nexthop)
nexthop->prev = last;
}
+void nexthop_group_add_sorted(struct nexthop_group *nhg,
+ struct nexthop *nexthop)
+{
+ struct nexthop *position, *prev;
+
+ for (position = nhg->nexthop, prev = NULL; position;
+ prev = position, position = position->next) {
+ if (nexthop_cmp(position, nexthop) > 0) {
+ nexthop->next = position;
+ nexthop->prev = prev;
+
+ if (nexthop->prev)
+ nexthop->prev->next = nexthop;
+ else
+ nhg->nexthop = nexthop;
+
+ position->prev = nexthop;
+ return;
+ }
+ }
+
+ nexthop->prev = prev;
+ if (prev)
+ prev->next = nexthop;
+ else
+ nhg->nexthop = nexthop;
+
+}
+
/* Delete nexthop from a nexthop list. */
void nexthop_del(struct nexthop_group *nhg, struct nexthop *nh)
{