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