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

Reply via email to