diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2018-09-20 13:59:35 -0400 |
|---|---|---|
| committer | Stephen Worley <sworley@cumulusnetworks.com> | 2019-06-25 22:58:47 -0400 |
| commit | 6c8b51e172a67c8e575299ad493f1702a0608336 (patch) | |
| tree | 3788f202434dc6c23fe4e4761468cd11879dfc5c /lib/nexthop_group.c | |
| parent | f3afd0a4e18f3b1fe11f687f9fceba1befbdb06d (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.c | 35 |
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) { |
