mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 04:26:12 +00:00
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:
parent
528628cb2e
commit
776c3e90c1
@ -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)
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user