summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2018-06-01 19:26:53 -0400
committerStephen Worley <sworley@cumulusnetworks.com>2019-05-23 12:21:15 -0400
commit776c3e90c161ed085897258754477e3fd183b1d2 (patch)
treeec5c2bd5a3389088a0b307bd97ced33645b26d9f
parent528628cb2ea4f5a522bf1f6d5b702bb188c4e30e (diff)
lib: Add nexthop_cmp
Add function to allow us to have a sorted order of nexthops. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
-rw-r--r--lib/nexthop.c57
-rw-r--r--lib/nexthop.h1
2 files changed, 58 insertions, 0 deletions
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,