From 776c3e90c161ed085897258754477e3fd183b1d2 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 1 Jun 2018 19:26:53 -0400 Subject: [PATCH] lib: Add nexthop_cmp Add function to allow us to have a sorted order of nexthops. Signed-off-by: Donald Sharp --- lib/nexthop.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ lib/nexthop.h | 1 + 2 files changed, 58 insertions(+) diff --git a/lib/nexthop.c b/lib/nexthop.c index 8e16e70590..2a65c4d546 100644 --- a/lib/nexthop.c +++ b/lib/nexthop.c @@ -36,6 +36,63 @@ DEFINE_MTYPE_STATIC(LIB, NEXTHOP, "Nexthop") DEFINE_MTYPE_STATIC(LIB, NH_LABEL, "Nexthop label") +int nexthop_cmp(const struct nexthop *next1, const struct nexthop *next2) +{ + int ret; + uint32_t n1, n2; + + if (next1->vrf_id < next2->vrf_id) + return -1; + + if (next1->vrf_id > next2->vrf_id) + return 1; + + if (next1->type < next2->type) + return -1; + + if (next1->type > next2->type) + return 1; + + switch(next1->type) { + case NEXTHOP_TYPE_IPV4: + n1 = ntohl(next1->gate.ipv4.s_addr); + n2 = ntohl(next2->gate.ipv4.s_addr); + if (n1 < n2) + return -1; + if (n1 > n2) + return 1; + break; + case NEXTHOP_TYPE_IPV6: + ret = memcmp(&next1->gate, &next2->gate, sizeof(union g_addr)); + if (!ret) + return ret; + break; + case NEXTHOP_TYPE_IPV4_IFINDEX: + case NEXTHOP_TYPE_IPV6_IFINDEX: + ret = memcmp(&next1->gate, &next2->gate, sizeof(union g_addr)); + if (!ret) + return ret; + /* Intentional Fall-Through */ + case NEXTHOP_TYPE_IFINDEX: + if (next1->ifindex < next2->ifindex) + return -1; + + if (next1->ifindex > next2->ifindex) + return 1; + break; + case NEXTHOP_TYPE_BLACKHOLE: + if (next1->bh_type < next2->bh_type) + return -1; + + if (next1->bh_type > next2->bh_type) + return 1; + break; + } + + ret = memcmp(&next1->src, &next2->src, sizeof(union g_addr)); + return ret; +} + /* check if nexthops are same, non-recursive */ int nexthop_same_no_recurse(const struct nexthop *next1, const struct nexthop *next2) diff --git a/lib/nexthop.h b/lib/nexthop.h index 663acaeb69..58e8e0ebb6 100644 --- a/lib/nexthop.h +++ b/lib/nexthop.h @@ -139,6 +139,7 @@ void nexthop_del_labels(struct nexthop *); uint32_t nexthop_hash(const struct nexthop *nexthop); extern bool nexthop_same(const struct nexthop *nh1, const struct nexthop *nh2); +extern int nexthop_cmp(const struct nexthop *nh1, const struct nexthop *nh2); extern const char *nexthop_type_to_str(enum nexthop_types_t nh_type); extern int nexthop_same_no_recurse(const struct nexthop *next1, -- 2.39.5