Hi,

On powerpc64 regress/usr.sbin/bgpd/config fails.  It parses a config
file, writes bgpd's config to stdout and compares it with an expected
output.

On powerpc64 the order of the set of communities is different.

The parser uses memcmp(3) to sort a struct of integers.  This depends
of the endianess.  The correct way is to compare the integer fields
in native byte order.

With this diff, the resulting order is the same on i386 and poerpc64.
Also on powerpc64 the fix does not change bgpd's output.  memcmp(3)
and field comparison are equivalent on big endian architectures.

ok?

bluhm

Index: usr.sbin/bgpd/parse.y
===================================================================
RCS file: /mount/openbsd/cvs/src/usr.sbin/bgpd/parse.y,v
retrieving revision 1.414
diff -u -p -r1.414 parse.y
--- usr.sbin/bgpd/parse.y       2 Mar 2021 09:45:07 -0000       1.414
+++ usr.sbin/bgpd/parse.y       14 Apr 2021 21:09:47 -0000
@@ -3558,6 +3558,28 @@ symget(const char *nam)
 }
 
 static int
+cmpcommunity(struct community *a, struct community *b)
+{
+       if (a->flags > b->flags)
+               return 1;
+       if (a->flags < b->flags)
+               return -1;
+       if (a->data1 > b->data1)
+               return 1;
+       if (a->data1 < b->data1)
+               return -1;
+       if (a->data2 > b->data2)
+               return 1;
+       if (a->data2 < b->data2)
+               return -1;
+       if (a->data3 > b->data3)
+               return 1;
+       if (a->data3 < b->data3)
+               return -1;
+       return 0;
+}
+
+static int
 getcommunity(char *s, int large, u_int32_t *val, u_int32_t *flag)
 {
        long long        max = USHRT_MAX;
@@ -4396,16 +4418,17 @@ filterset_add(struct filter_set_head *sh
                        switch (s->type) {
                        case ACTION_SET_COMMUNITY:
                        case ACTION_DEL_COMMUNITY:
-                               if (memcmp(&s->action.community,
-                                   &t->action.community,
-                                   sizeof(s->action.community)) < 0) {
+                               switch (cmpcommunity(&s->action.community,
+                                   &t->action.community)) {
+                               case -1:
                                        TAILQ_INSERT_BEFORE(t, s, entry);
                                        return;
-                               } else if (memcmp(&s->action.community,
-                                   &t->action.community,
-                                   sizeof(s->action.community)) == 0)
+                               case 0:
                                        break;
-                               continue;
+                               case 1:
+                                       continue;
+                               }
+                               break;
                        case ACTION_SET_NEXTHOP:
                                /* only last nexthop per AF matters */
                                if (s->action.nexthop.aid <
Index: regress/usr.sbin/bgpd/config/bgpd.conf.10.ok
===================================================================
RCS file: /mount/openbsd/cvs/src/regress/usr.sbin/bgpd/config/bgpd.conf.10.ok,v
retrieving revision 1.6
diff -u -p -r1.6 bgpd.conf.10.ok
--- regress/usr.sbin/bgpd/config/bgpd.conf.10.ok        17 Jul 2019 10:27:50 
-0000      1.6
+++ regress/usr.sbin/bgpd/config/bgpd.conf.10.ok        14 Apr 2021 21:14:42 
-0000
@@ -40,4 +40,4 @@ match from any large-community 1234:5678
 match from any large-community 1234:5678:1 large-community 1234:5678:2 
large-community 1234:5678:3 
 match from any community 1234:1 large-community 1234:5678:1 
 match from any large-community 1234:5678:1 community 1234:1 
-match from any set { community delete 1234:5678 community delete 1234:* 
community delete *:5678 community delete local-as:5678 community delete 
local-as:neighbor-as large-community delete 1234:15:5678 large-community delete 
*:15:5678 large-community delete local-as:15:5678 large-community delete 
local-as:15:* large-community delete local-as:15:neighbor-as large-community 
delete local-as:*:* community 1234:5678 community local-as:5678 community 
local-as:neighbor-as large-community 1234:15:5678 large-community 
local-as:15:5678 large-community local-as:15:neighbor-as }
+match from any set { community delete 1234:5678 large-community delete 
1234:15:5678 community delete *:5678 large-community delete *:15:5678 community 
delete local-as:5678 large-community delete local-as:15:5678 community delete 
1234:* community delete local-as:neighbor-as large-community delete 
local-as:15:* large-community delete local-as:*:* large-community delete 
local-as:15:neighbor-as community 1234:5678 large-community 1234:15:5678 
community local-as:5678 large-community local-as:15:5678 community 
local-as:neighbor-as large-community local-as:15:neighbor-as }
Index: regress/usr.sbin/bgpd/config/bgpd.conf.11.ok
===================================================================
RCS file: /mount/openbsd/cvs/src/regress/usr.sbin/bgpd/config/bgpd.conf.11.ok,v
retrieving revision 1.5
diff -u -p -r1.5 bgpd.conf.11.ok
--- regress/usr.sbin/bgpd/config/bgpd.conf.11.ok        17 Jul 2019 10:27:50 
-0000      1.5
+++ regress/usr.sbin/bgpd/config/bgpd.conf.11.ok        14 Apr 2021 21:14:09 
-0000
@@ -33,7 +33,7 @@ match from any ext-community ovs invalid
 match from any ext-community ovs not-found 
 match from any ext-community rt 64496:201 ext-community soo 64496:202 
 match from any ext-community rt 64496:301 ext-community soo 4200000001:302 
ext-community odi 127.0.0.1:303 
-match from any set { ext-community delete ovs valid ext-community delete odi 
127.0.0.1:6003 ext-community delete soo 4200000001:6002 ext-community delete 
ort 0x123456789abf ext-community delete rt 64496:6001 ext-community ovs valid 
ext-community odi 127.0.0.1:5003 ext-community soo 4200000001:5002 
ext-community ort 0x123456789abc ext-community rt 64496:5001 }
+match from any set { ext-community delete ovs valid ext-community delete ort 
0x123456789abf ext-community delete rt 64496:6001 ext-community delete odi 
127.0.0.1:6003 ext-community delete soo 4200000001:6002 ext-community ovs valid 
ext-community ort 0x123456789abc ext-community rt 64496:5001 ext-community odi 
127.0.0.1:5003 ext-community soo 4200000001:5002 }
 match from any ext-community * * 
 match from any ext-community rt * 
 match from any ext-community soo * 
@@ -47,7 +47,7 @@ match from any ext-community rt 127.0.0.
 match from any ext-community soo 64496:* 
 match from any ext-community soo 4200000001:* 
 match from any ext-community soo 127.0.0.1:* 
-match from any set { ext-community delete odi 127.0.0.1:* ext-community delete 
soo 4200000001:* ext-community delete rt 64496:* ext-community delete mac-mob * 
ext-community delete ovs * ext-community delete rt * ext-community delete soo * 
ext-community delete odi * ext-community delete ort * }
+match from any set { ext-community delete ort * ext-community delete mac-mob * 
ext-community delete ovs * ext-community delete rt * ext-community delete soo * 
ext-community delete odi * ext-community delete rt 64496:* ext-community delete 
odi 127.0.0.1:* ext-community delete soo 4200000001:* }
 match from any ext-community rt 64496:local-as 
 match from any ext-community soo 4200000001:local-as 
 match from any ext-community odi 127.0.0.1:local-as 

Reply via email to