summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/nexthop_group.c35
-rw-r--r--lib/nexthop_group.h4
2 files changed, 39 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)
{
diff --git a/lib/nexthop_group.h b/lib/nexthop_group.h
index 5adf2db937..104e2051f5 100644
--- a/lib/nexthop_group.h
+++ b/lib/nexthop_group.h
@@ -43,6 +43,10 @@ struct nexthop_group *nexthop_group_new(void);
void nexthop_group_delete(struct nexthop_group **nhg);
void nexthop_add(struct nexthop **target, struct nexthop *nexthop);
+void nexthop_group_add_sorted(struct nexthop_group *nhg,
+ struct nexthop *nexthop);
+void nexthop_group_copy(struct nexthop_group *to,
+ struct nexthop_group *from);
void nexthop_del(struct nexthop_group *nhg, struct nexthop *nexthop);
void copy_nexthops(struct nexthop **tnh, const struct nexthop *nh,
struct nexthop *rparent);