lib: Add nexthop_cmp

Add function to allow us to have a sorted order
of nexthops.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2018-06-01 19:26:53 -04:00 committed by Stephen Worley
parent 528628cb2e
commit 776c3e90c1
2 changed files with 58 additions and 0 deletions

View File

@ -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)

View File

@ -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,