mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-16 02:02:18 +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, NEXTHOP, "Nexthop")
|
||||||
DEFINE_MTYPE_STATIC(LIB, NH_LABEL, "Nexthop label")
|
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 */
|
/* check if nexthops are same, non-recursive */
|
||||||
int nexthop_same_no_recurse(const struct nexthop *next1,
|
int nexthop_same_no_recurse(const struct nexthop *next1,
|
||||||
const struct nexthop *next2)
|
const struct nexthop *next2)
|
||||||
|
@ -139,6 +139,7 @@ void nexthop_del_labels(struct nexthop *);
|
|||||||
uint32_t nexthop_hash(const struct nexthop *nexthop);
|
uint32_t nexthop_hash(const struct nexthop *nexthop);
|
||||||
|
|
||||||
extern bool nexthop_same(const struct nexthop *nh1, const struct nexthop *nh2);
|
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 const char *nexthop_type_to_str(enum nexthop_types_t nh_type);
|
||||||
extern int nexthop_same_no_recurse(const struct nexthop *next1,
|
extern int nexthop_same_no_recurse(const struct nexthop *next1,
|
||||||
|
Loading…
Reference in New Issue
Block a user