This adjusts the roa_cmp() function to result in the same order on big and
little endian systems. This should help with regress tests where the order
matters.
I also change the prefixset_cmp function to use memcmp for both IPv4 and
IPv6 addresses.
OK?
--
:wq Claudio
Index: config.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/config.c,v
retrieving revision 1.97
diff -u -p -r1.97 config.c
--- config.c 29 Dec 2020 15:30:34 -0000 1.97
+++ config.c 4 Jan 2021 10:30:15 -0000
@@ -551,22 +551,20 @@ prefixset_cmp(struct prefixset_item *a,
switch (a->p.addr.aid) {
case AID_INET:
- if (ntohl(a->p.addr.v4.s_addr) < ntohl(b->p.addr.v4.s_addr))
- return (-1);
- if (ntohl(a->p.addr.v4.s_addr) > ntohl(b->p.addr.v4.s_addr))
- return (1);
+ i = memcmp(&a->p.addr.v4, &b->p.addr.v4,
+ sizeof(struct in_addr));
break;
case AID_INET6:
i = memcmp(&a->p.addr.v6, &b->p.addr.v6,
sizeof(struct in6_addr));
- if (i > 0)
- return (1);
- if (i < 0)
- return (-1);
break;
default:
fatalx("%s: unknown af", __func__);
}
+ if (i > 0)
+ return (1);
+ if (i < 0)
+ return (-1);
if (a->p.len < b->p.len)
return (-1);
if (a->p.len > b->p.len)
@@ -587,16 +585,45 @@ RB_GENERATE(prefixset_tree, prefixset_it
static inline int
roa_cmp(struct roa *a, struct roa *b)
{
- size_t len = 4 + sizeof(a->asnum);
+ int i;
+
+ if (a->aid < b->aid)
+ return (-1);
+ if (a->aid > b->aid)
+ return (1);
- if (a->aid == b->aid) {
- if (a->aid == AID_INET)
- len += sizeof(a->prefix.inet);
- else
- len += sizeof(a->prefix.inet6);
+ switch (a->aid) {
+ case AID_INET:
+ i = memcmp(&a->prefix.inet, &b->prefix.inet,
+ sizeof(struct in_addr));
+ break;
+ case AID_INET6:
+ i = memcmp(&a->prefix.inet6, &b->prefix.inet6,
+ sizeof(struct in6_addr));
+ break;
+ default:
+ fatalx("%s: unknown af", __func__);
}
+ if (i > 0)
+ return (1);
+ if (i < 0)
+ return (-1);
+ if (a->prefixlen < b->prefixlen)
+ return (-1);
+ if (a->prefixlen > b->prefixlen)
+ return (1);
- return memcmp(&a->aid, &b->aid, len);
+ if (a->asnum < b->asnum)
+ return (-1);
+ if (a->asnum > b->asnum)
+ return (1);
+
+ if (a->maxlen < b->maxlen)
+ return (-1);
+ if (a->maxlen > b->maxlen)
+ return (1);
+
+ return (0);
}
RB_GENERATE(roa_tree, roa, entry, roa_cmp);