Since the first bit of ROA sets is in here some refactoring of the code.
Split up as_set into a set_table and an as_set. The first is what does
the lookup and will now also be used in roa-set tries. The as_set is glue
to add the name and dirty flag. Add an accessor to get the set data so
that the imsg sending and printing can be moved into the right places.
This is done mainly because roa-sets need similar but slightly different
versions and this is the best way fixing this.

This diff is agains /usr/src since it includes bgpctl and regress changes
as well.

As usual looking for OKs :)
-- 
:wq Claudio

Index: usr.sbin/bgpctl/bgpctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/bgpctl.c,v
retrieving revision 1.216
diff -u -p -r1.216 bgpctl.c
--- usr.sbin/bgpctl/bgpctl.c    14 Sep 2018 10:22:55 -0000      1.216
+++ usr.sbin/bgpctl/bgpctl.c    18 Sep 2018 15:55:45 -0000
@@ -2656,8 +2656,8 @@ msg_type(u_int8_t type)
        return (msgtypenames[type]);
 }
 
-void *
+int
 as_set_match(const struct as_set *a, u_int32_t asnum)
 {
-       return (NULL);
+       return (0);
 }
Index: usr.sbin/bgpd/bgpd.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.c,v
retrieving revision 1.198
diff -u -p -r1.198 bgpd.c
--- usr.sbin/bgpd/bgpd.c        9 Sep 2018 11:00:51 -0000       1.198
+++ usr.sbin/bgpd/bgpd.c        18 Sep 2018 15:55:45 -0000
@@ -436,6 +436,7 @@ reconfigure(char *conffile, struct bgpd_
        struct listen_addr      *la;
        struct rde_rib          *rr;
        struct rdomain          *rd;
+       struct as_set           *aset;
        struct prefixset        *ps;
        struct prefixset_item   *psi;
 
@@ -521,10 +522,36 @@ reconfigure(char *conffile, struct bgpd_
        }
 
        /* as-sets for filters in the RDE */
-       if (as_sets_send(ibuf_rde, conf->as_sets) == -1)
-               return (-1);
-       as_sets_free(conf->as_sets);
-       conf->as_sets = NULL;
+       while ((aset = SIMPLEQ_FIRST(conf->as_sets)) != NULL) {
+               struct ibuf *wbuf;
+               u_int32_t *as;
+               size_t i, l, n;
+
+               SIMPLEQ_REMOVE_HEAD(conf->as_sets, entry);
+
+               as = set_get(aset->set, &n);
+               if ((wbuf = imsg_create(ibuf_rde, IMSG_RECONF_AS_SET, 0, 0,
+                   sizeof(n) + sizeof(aset->name))) == NULL)
+                       return -1;
+               if (imsg_add(wbuf, &n, sizeof(n)) == -1 ||
+                   imsg_add(wbuf, aset->name, sizeof(aset->name)) == -1)
+                       return -1;
+               imsg_close(ibuf_rde, wbuf);
+
+               for (i = 0; i < n; i += l) {
+                       l = (n - i > 1024 ? 1024 : n - i);
+                       if (imsg_compose(ibuf_rde, IMSG_RECONF_AS_SET_ITEMS,
+                           0, 0, -1, as + i, l) == -1)
+                               return -1;
+               }
+
+               if (imsg_compose(ibuf_rde, IMSG_RECONF_AS_SET_DONE, 0, 0, -1,
+                   NULL, 0) == -1)
+                       return -1;
+               
+               set_free(aset->set);
+               free(aset);
+       }
 
        /* filters for the RDE */
        while ((r = TAILQ_FIRST(conf->filters)) != NULL) {
Index: usr.sbin/bgpd/bgpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.h,v
retrieving revision 1.341
diff -u -p -r1.341 bgpd.h
--- usr.sbin/bgpd/bgpd.h        18 Sep 2018 15:14:07 -0000      1.341
+++ usr.sbin/bgpd/bgpd.h        18 Sep 2018 15:55:45 -0000
@@ -215,6 +215,7 @@ SIMPLEQ_HEAD(prefixset_head, prefixset);
 struct rde_prefixset_head;
 struct rde_prefixset;
 
+struct set_table;
 struct as_set;
 SIMPLEQ_HEAD(as_set_head, as_set);
 
@@ -970,6 +971,13 @@ struct prefixset {
        SIMPLEQ_ENTRY(prefixset)         entry;
 };
 
+struct as_set {
+       char                             name[SET_NAME_LEN];
+       SIMPLEQ_ENTRY(as_set)            entry;
+       struct set_table                *set;
+       int                              dirty;
+};
+
 struct rdomain {
        SIMPLEQ_ENTRY(rdomain)          entry;
        char                            descr[PEER_DESCR_LEN];
@@ -1169,20 +1177,21 @@ void             filterset_move(struct filter_set_
 const char     *filterset_name(enum action_types);
 
 /* rde_sets.c */
-void            as_sets_insert(struct as_set_head *, struct as_set *);
 struct as_set  *as_sets_lookup(struct as_set_head *, const char *);
+struct as_set  *as_sets_new(struct as_set_head *, const char *, size_t,
+                   size_t);
 void            as_sets_free(struct as_set_head *);
-void            as_sets_print(struct as_set_head *);
-int             as_sets_send(struct imsgbuf *, struct as_set_head *);
 void            as_sets_mark_dirty(struct as_set_head *, struct as_set_head *);
+int             as_set_match(const struct as_set *, u_int32_t);
 
-struct as_set  *as_set_new(const char *, size_t, size_t);
-void            as_set_free(struct as_set *);
-int             as_set_add(struct as_set *, void *, size_t);
-void            as_set_prep(struct as_set *);
-void           *as_set_match(const struct as_set *, u_int32_t);
-int             as_set_equal(const struct as_set *, const struct as_set *);
-int             as_set_dirty(const struct as_set *);
+struct set_table       *set_new(size_t, size_t);
+void                    set_free(struct set_table *);
+int                     set_add(struct set_table *, void *, size_t);
+void                   *set_get(struct set_table *, size_t *);
+void                    set_prep(struct set_table *);
+void                   *set_match(const struct set_table *, u_int32_t);
+int                     set_equal(const struct set_table *,
+                           const struct set_table *);
 
 /* util.c */
 const char     *log_addr(const struct bgpd_addr *);
Index: usr.sbin/bgpd/parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/parse.y,v
retrieving revision 1.353
diff -u -p -r1.353 parse.y
--- usr.sbin/bgpd/parse.y       14 Sep 2018 10:22:11 -0000      1.353
+++ usr.sbin/bgpd/parse.y       18 Sep 2018 15:55:46 -0000
@@ -4172,7 +4172,7 @@ get_rule(enum action_types type)
        return (r);
 }
 
-struct as_set *curaset;
+struct set_table *curset;
 static int
 new_as_set(char *name)
 {
@@ -4183,29 +4183,28 @@ new_as_set(char *name)
                return -1;
        }
 
-       aset = as_set_new(name, 0, sizeof(u_int32_t));
+       aset = as_sets_new(conf->as_sets, name, 0, sizeof(u_int32_t));
        if (aset == NULL)
                fatal(NULL);
-       as_sets_insert(conf->as_sets, aset);
 
-       curaset = aset;
+       curset = aset->set;
        return 0;
 }
 
 static void
 add_as_set(u_int32_t as)
 {
-       if (curaset == NULL)
+       if (curset == NULL)
                fatalx("%s: bad mojo jojo", __func__);
 
-       if (as_set_add(curaset, &as, 1) != 0)
+       if (set_add(curset, &as, 1) != 0)
                fatal(NULL);
 }
 
 static void
 done_as_set(void)
 {
-       curaset = NULL;
+       curset = NULL;
 }
 
 static int
Index: usr.sbin/bgpd/printconf.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/printconf.c,v
retrieving revision 1.119
diff -u -p -r1.119 printconf.c
--- usr.sbin/bgpd/printconf.c   13 Sep 2018 11:25:41 -0000      1.119
+++ usr.sbin/bgpd/printconf.c   18 Sep 2018 15:55:46 -0000
@@ -40,6 +40,7 @@ void           print_rdomain_targets(struct filt
 void            print_rdomain(struct rdomain *);
 const char     *print_af(u_int8_t);
 void            print_network(struct network_config *, const char *);
+void            print_as_sets(struct as_set_head *);
 void            print_prefixsets(struct prefixset_head *);
 void            print_peer(struct peer_config *, struct bgpd_config *,
                    const char *);
@@ -443,6 +444,28 @@ print_network(struct network_config *n, 
 }
 
 void
+print_as_sets(struct as_set_head *as_sets)
+{
+       struct as_set *aset;
+       u_int32_t *as;
+       size_t i, n;
+       int len;
+
+       SIMPLEQ_FOREACH(aset, as_sets, entry) {
+               printf("as-set \"%s\" {\n\t", aset->name);
+               as = set_get(aset->set, &n);
+               for (i = 0, len = 8; i < n; i++) {
+                       if (len > 72) {
+                               printf("\n\t");
+                               len = 8;
+                       }
+                       len += printf("%u ", as[i]);
+               }
+               printf("\n}\n\n");
+       }
+}
+
+void
 print_prefixsets(struct prefixset_head *psh)
 {
        struct prefixset        *ps;
@@ -867,7 +890,7 @@ print_config(struct bgpd_config *conf, s
 
        print_mainconf(conf);
        print_prefixsets(conf->prefixsets);
-       as_sets_print(conf->as_sets);
+       print_as_sets(conf->as_sets);
        TAILQ_FOREACH(n, net_l, entry)
                print_network(&n->net, "");
        if (!SIMPLEQ_EMPTY(rdom_l))
Index: usr.sbin/bgpd/rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.423
diff -u -p -r1.423 rde.c
--- usr.sbin/bgpd/rde.c 14 Sep 2018 10:22:11 -0000      1.423
+++ usr.sbin/bgpd/rde.c 18 Sep 2018 15:55:47 -0000
@@ -908,18 +908,17 @@ rde_dispatch_imsg_parent(struct imsgbuf 
                        name = (char *)imsg.data + sizeof(nmemb);
                        if (as_sets_lookup(as_sets_tmp, name) != NULL)
                                fatalx("duplicate as-set %s", name);
-                       last_as_set = as_set_new(name, nmemb,
+                       last_as_set = as_sets_new(as_sets_tmp, name, nmemb,
                            sizeof(u_int32_t));
                        break;
                case IMSG_RECONF_AS_SET_ITEMS:
                        nmemb = imsg.hdr.len - IMSG_HEADER_SIZE;
                        nmemb /= sizeof(u_int32_t);
-                       if (as_set_add(last_as_set, imsg.data, nmemb) != 0)
+                       if (set_add(last_as_set->set, imsg.data, nmemb) != 0)
                                fatal(NULL);
                        break;
                case IMSG_RECONF_AS_SET_DONE:
-                       as_set_prep(last_as_set);
-                       as_sets_insert(as_sets_tmp, last_as_set);
+                       set_prep(last_as_set->set);
                        last_as_set = NULL;
                        break;
                case IMSG_RECONF_RDOMAIN:
Index: usr.sbin/bgpd/rde.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v
retrieving revision 1.191
diff -u -p -r1.191 rde.h
--- usr.sbin/bgpd/rde.h 18 Sep 2018 15:14:07 -0000      1.191
+++ usr.sbin/bgpd/rde.h 18 Sep 2018 15:55:47 -0000
@@ -586,7 +586,7 @@ int          up_dump_mp_reach(u_char *, u_int16
 int    trie_add(struct trie_head *, struct bgpd_addr *, u_int8_t, u_int8_t,
            u_int8_t);
 int    trie_roa_add(struct trie_head *, struct bgpd_addr *, u_int8_t,
-           struct as_set *);
+           struct set_table *);
 void   trie_free(struct trie_head *);
 int    trie_match(struct trie_head *, struct bgpd_addr *, u_int8_t, int);
 int    trie_roa_check(struct trie_head *, struct bgpd_addr *, u_int8_t,
Index: usr.sbin/bgpd/rde_filter.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_filter.c,v
retrieving revision 1.106
diff -u -p -r1.106 rde_filter.c
--- usr.sbin/bgpd/rde_filter.c  9 Sep 2018 14:08:11 -0000       1.106
+++ usr.sbin/bgpd/rde_filter.c  18 Sep 2018 15:55:47 -0000
@@ -622,7 +622,7 @@ rde_filter_equal(struct filter_head *a, 
                }
 
                if ((fa->match.as.flags & AS_FLAG_AS_SET) &&
-                   as_set_dirty(fa->match.as.aset)) {
+                   fa->match.as.aset->dirty) {
                        log_debug("%s: as-set %s has changed",
                            __func__, fa->match.as.name);
                        return (0);
Index: usr.sbin/bgpd/rde_sets.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_sets.c,v
retrieving revision 1.4
diff -u -p -r1.4 rde_sets.c
--- usr.sbin/bgpd/rde_sets.c    14 Sep 2018 10:22:11 -0000      1.4
+++ usr.sbin/bgpd/rde_sets.c    18 Sep 2018 15:55:47 -0000
@@ -27,20 +27,35 @@
 
 #include "rde.h"
 
-struct as_set {
-       char                     name[SET_NAME_LEN];
+struct set_table {
        void                    *set;
-       SIMPLEQ_ENTRY(as_set)    entry;
        size_t                   nmemb;
        size_t                   size;
        size_t                   max;
-       int                      dirty;
 };
 
-void
-as_sets_insert(struct as_set_head *as_sets, struct as_set *aset)
+struct as_set *
+as_sets_new(struct as_set_head *as_sets, const char *name, size_t nmemb,
+    size_t size)
 {
+       struct as_set *aset;
+       size_t len;
+
+       aset = calloc(1, sizeof(*aset));
+       if (aset == NULL)
+               return NULL;
+
+       len = strlcpy(aset->name, name, sizeof(aset->name));
+       assert(len < sizeof(aset->name));
+
+       aset->set = set_new(nmemb, size);
+       if (aset->set == NULL) {
+               free(aset);
+               return NULL;
+       }
+
        SIMPLEQ_INSERT_TAIL(as_sets, aset, entry);
+       return aset;
 }
 
 struct as_set *
@@ -66,146 +81,99 @@ as_sets_free(struct as_set_head *as_sets
        while (!SIMPLEQ_EMPTY(as_sets)) {
                aset = SIMPLEQ_FIRST(as_sets);
                SIMPLEQ_REMOVE_HEAD(as_sets, entry);
-               as_set_free(aset);
+               set_free(aset->set);
+               free(aset);
        }
        free(as_sets);
 }
 
 void
-as_sets_print(struct as_set_head *as_sets)
-{
-       struct as_set *aset;
-       size_t i;
-       int len;
-
-       if (as_sets == NULL)
-               return;
-       SIMPLEQ_FOREACH(aset, as_sets, entry) {
-               printf("as-set \"%s\" {\n\t", aset->name);
-               for (i = 0, len = 8; i < aset->nmemb; i++) {
-                       if (len > 72) {
-                               printf("\n\t");
-                               len = 8;
-                       }
-                       len += printf("%u ", *(u_int32_t *)
-                           ((u_int8_t *)aset->set + i * aset->size));
-               }
-               printf("\n}\n\n");
-       }
-}
-
-int
-as_sets_send(struct imsgbuf *ibuf, struct as_set_head *as_sets)
-{
-       struct as_set *aset;
-       struct ibuf *wbuf;
-       size_t i, l;
-
-       if (as_sets == NULL)
-               return 0;
-       SIMPLEQ_FOREACH(aset, as_sets, entry) {
-               if ((wbuf = imsg_create(ibuf, IMSG_RECONF_AS_SET, 0, 0,
-                   sizeof(aset->nmemb) + sizeof(aset->name))) == NULL)
-                       return -1;
-               if (imsg_add(wbuf, &aset->nmemb, sizeof(aset->nmemb)) == -1 ||
-                   imsg_add(wbuf, aset->name, sizeof(aset->name)) == -1)
-                       return -1;
-               imsg_close(ibuf, wbuf);
-
-               for (i = 0; i < aset->nmemb; i += l) {
-                       l = (aset->nmemb - i > 1024 ? 1024 : aset->nmemb - i);
-
-                       if (imsg_compose(ibuf, IMSG_RECONF_AS_SET_ITEMS, 0, 0,
-                           -1, (u_int8_t *)aset->set + i * aset->size,
-                           l * aset->size) == -1)
-                               return -1;
-               }
-
-               if (imsg_compose(ibuf, IMSG_RECONF_AS_SET_DONE, 0, 0, -1,
-                   NULL, 0) == -1)
-                       return -1;
-       }
-       return 0;
-}
-
-void
 as_sets_mark_dirty(struct as_set_head *old, struct as_set_head *new)
 {
        struct as_set   *n, *o;
 
        SIMPLEQ_FOREACH(n, new, entry) {
                if (old == NULL || (o = as_sets_lookup(old, n->name)) == NULL ||
-                   !as_set_equal(n, o))
+                   !set_equal(n->set, o->set))
                        n->dirty = 1;
        }
 }
 
-struct as_set *
-as_set_new(const char *name, size_t nmemb, size_t size)
+int
+as_set_match(const struct as_set *aset, u_int32_t asnum)
 {
-       struct as_set *aset;
-       size_t len;
+       return set_match(aset->set, asnum) != NULL;
+}
 
-       aset = calloc(1, sizeof(*aset));
-       if (aset == NULL)
-               return NULL;
+struct set_table *
+set_new(size_t nmemb, size_t size)
+{
+       struct set_table *set;
 
-       len = strlcpy(aset->name, name, sizeof(aset->name));
-       assert(len < sizeof(aset->name));
+       set = calloc(1, sizeof(*set));
+       if (set == NULL)
+               return NULL;
 
        if (nmemb == 0)
                nmemb = 4;
 
-       aset->size = size;
-       aset->max = nmemb;
-       aset->set = calloc(nmemb, aset->size);
-       if (aset->set == NULL) {
-               free(aset);
+       set->size = size;
+       set->max = nmemb;
+       set->set = calloc(nmemb, set->size);
+       if (set->set == NULL) {
+               free(set);
                return NULL;
        }
 
-       return aset;
+       return set;
 }
 
 void
-as_set_free(struct as_set *aset)
+set_free(struct set_table *set)
 {
-       if (aset == NULL)
+       if (set == NULL)
                return;
-       free(aset->set);
-       free(aset);
+       free(set->set);
+       free(set);
 }
 
 int
-as_set_add(struct as_set *aset, void *elms, size_t nelms)
+set_add(struct set_table *set, void *elms, size_t nelms)
 {
-       if (aset->max < nelms || aset->max - nelms < aset->nmemb) {
+       if (set->max < nelms || set->max - nelms < set->nmemb) {
                u_int32_t *s;
                size_t new_size;
 
-               if (aset->nmemb >= SIZE_T_MAX - 4096 - nelms) {
+               if (set->nmemb >= SIZE_T_MAX - 4096 - nelms) {
                        errno = ENOMEM;
                        return -1;
                }
-               for (new_size = aset->max; new_size < aset->nmemb + nelms; )
+               for (new_size = set->max; new_size < set->nmemb + nelms; )
                     new_size += (new_size < 4096 ? new_size : 4096);
 
-               s = reallocarray(aset->set, new_size, aset->size);
+               s = reallocarray(set->set, new_size, set->size);
                if (s == NULL)
                        return -1;
-               aset->set = s;
-               aset->max = new_size;
+               set->set = s;
+               set->max = new_size;
        }
 
-       memcpy((u_int8_t *)aset->set + aset->nmemb * aset->size, elms,
-           nelms * aset->size);
-       aset->nmemb += nelms;
+       memcpy((u_int8_t *)set->set + set->nmemb * set->size, elms,
+           nelms * set->size);
+       set->nmemb += nelms;
 
        return 0;
 }
 
+void *
+set_get(struct set_table *set, size_t *nelms)
+{
+       *nelms = set->nmemb;
+       return set->set;
+}
+
 static int
-as_set_cmp(const void *ap, const void *bp)
+set_cmp(const void *ap, const void *bp)
 {
        const u_int32_t *a = ap;
        const u_int32_t *b = bp;
@@ -218,33 +186,33 @@ as_set_cmp(const void *ap, const void *b
 }
 
 void
-as_set_prep(struct as_set *aset)
+set_prep(struct set_table *set)
 {
-       if (aset == NULL)
+       if (set == NULL)
                return;
-       qsort(aset->set, aset->nmemb, aset->size, as_set_cmp);
+       qsort(set->set, set->nmemb, set->size, set_cmp);
 }
 
 void *
-as_set_match(const struct as_set *a, u_int32_t asnum)
+set_match(const struct set_table *a, u_int32_t asnum)
 {
        if (a == NULL)
                return NULL;
-       return bsearch(&asnum, a->set, a->nmemb, a->size, as_set_cmp);
+       return bsearch(&asnum, a->set, a->nmemb, a->size, set_cmp);
 }
 
 int
-as_set_equal(const struct as_set *a, const struct as_set *b)
+set_equal(const struct set_table *a, const struct set_table *b)
 {
+       /* allow NULL pointers to be passed */
+       if (a == NULL && b == NULL)
+               return 1;
+       if (a == NULL || b == NULL)
+               return 0;
+
        if (a->nmemb != b->nmemb)
                return 0;
        if (memcmp(a->set, b->set, a->nmemb * a->size) != 0)
                return 0;
        return 1;
-}
-
-int
-as_set_dirty(const struct as_set *a)
-{
-       return (a->dirty);
 }
Index: usr.sbin/bgpd/rde_trie.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_trie.c,v
retrieving revision 1.6
diff -u -p -r1.6 rde_trie.c
--- usr.sbin/bgpd/rde_trie.c    18 Sep 2018 15:14:07 -0000      1.6
+++ usr.sbin/bgpd/rde_trie.c    18 Sep 2018 15:55:47 -0000
@@ -57,7 +57,7 @@
  */
 struct tentry_v4 {
        struct tentry_v4        *trie[2];
-       struct as_set           *aset;  /* for roa source-as set */
+       struct set_table        *set;   /* for roa source-as set */
        struct in_addr           addr;
        struct in_addr           plenmask;
        u_int8_t                 plen;
@@ -66,7 +66,7 @@ struct tentry_v4 {
 
 struct tentry_v6 {
        struct tentry_v6        *trie[2];
-       struct as_set           *aset;  /* for roa source-as set */
+       struct set_table        *set;   /* for roa source-as set */
        struct in6_addr          addr;
        struct in6_addr          plenmask;
        u_int8_t                 plen;
@@ -362,7 +362,7 @@ trie_add(struct trie_head *th, struct bg
 }
 
 /*
- * Insert a ROA entry for prefix/plen. The prefix will insert an as_set with
+ * Insert a ROA entry for prefix/plen. The prefix will insert a set with
  * source_as and the maxlen as data. This makes it possible to validate if a
  * prefix is matching this ROA record. It is possible to insert prefixes with
  * source_as = 0. These entries will never return ROA_VALID on check and can
@@ -371,11 +371,11 @@ trie_add(struct trie_head *th, struct bg
  */
 int
 trie_roa_add(struct trie_head *th, struct bgpd_addr *prefix, u_int8_t plen,
-    struct as_set *aset)
+    struct set_table *set)
 {
        struct tentry_v4 *n4;
        struct tentry_v6 *n6;
-       struct as_set **ap;
+       struct set_table **stp;
 
        /* ignore possible default route since it does not make sense */
 
@@ -387,7 +387,7 @@ trie_roa_add(struct trie_head *th, struc
                n4 = trie_add_v4(th, &prefix->v4, plen);
                if (n4 == NULL)
                        return -1;
-               ap = &n4->aset;
+               stp = &n4->set;
                break;
        case AID_INET6:
                if (plen > 128)
@@ -396,17 +396,17 @@ trie_roa_add(struct trie_head *th, struc
                n6 = trie_add_v6(th, &prefix->v6, plen);
                if (n6 == NULL)
                        return -1;
-               ap = &n6->aset;
+               stp = &n6->set;
                break;
        default:
                /* anything else fails */
                return -1;
        }
 
-       /* aset already set, error out */
-       if (*ap != NULL)
+       /* set_table already set, error out */
+       if (*stp != NULL)
                return -1;
-       *ap = aset;
+       *stp = set;
 
        return 0;
 }
@@ -418,7 +418,7 @@ trie_free_v4(struct tentry_v4 *n)
                return;
        trie_free_v4(n->trie[0]);
        trie_free_v4(n->trie[1]);
-       as_set_free(n->aset);
+       set_free(n->set);
        free(n);
 }
 
@@ -429,7 +429,7 @@ trie_free_v6(struct tentry_v6 *n)
                return;
        trie_free_v6(n->trie[0]);
        trie_free_v6(n->trie[1]);
-       as_set_free(n->aset);
+       set_free(n->set);
        free(n);
 }
 
@@ -567,7 +567,7 @@ trie_roa_check_v4(struct trie_head *th, 
 
                        /* Treat AS 0 as NONE which can never be matched */
                        if (as != 0) {
-                               rs = as_set_match(n->aset, as);
+                               rs = set_match(n->set, as);
                                if (rs && plen <= rs->maxlen)
                                        return ROA_VALID;
                        }
@@ -614,7 +614,7 @@ trie_roa_check_v6(struct trie_head *th, 
 
                        /* Treat AS 0 as NONE which can never be matched */
                        if (as != 0) {
-                               if ((rs = as_set_match(n->aset, as)) != NULL)
+                               if ((rs = set_match(n->set, as)) != NULL)
                                    if (plen == n->plen || plen <= rs->maxlen)
                                        return ROA_VALID;
                        }
@@ -668,6 +668,9 @@ trie_equal_v4(struct tentry_v4 *a, struc
            a->plenmask.s_addr != b->plenmask.s_addr)
                return 0;
 
+       if (set_equal(a->set, b->set) == 0)
+               return 0;
+
        if (trie_equal_v4(a->trie[0], b->trie[0]) == 0 ||
            trie_equal_v4(a->trie[1], b->trie[1]) == 0)
                return 0;
@@ -687,6 +690,9 @@ trie_equal_v6(struct tentry_v6 *a, struc
            a->plen != b->plen ||
            a->node != b->node ||
            memcmp(&a->plenmask, &b->plenmask, sizeof(a->plenmask)) != 0)
+               return 0;
+
+       if (set_equal(a->set, b->set) == 0)
                return 0;
 
        if (trie_equal_v6(a->trie[0], b->trie[0]) == 0 ||
Index: usr.sbin/bgpd/util.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/util.c,v
retrieving revision 1.35
diff -u -p -r1.35 util.c
--- usr.sbin/bgpd/util.c        14 Sep 2018 10:22:11 -0000      1.35
+++ usr.sbin/bgpd/util.c        18 Sep 2018 15:55:47 -0000
@@ -320,7 +320,7 @@ as_compare(struct filter_as *f, u_int32_
        if (f->flags & AS_FLAG_AS_SET_NAME)     /* should not happen */
                return (0);
        if (f->flags & AS_FLAG_AS_SET)
-               return (as_set_match(f->aset, as) != NULL);
+               return (as_set_match(f->aset, as));
 
        if (f->flags & AS_FLAG_NEIGHBORAS)
                match = neighas;
Index: regress/usr.sbin/bgpd/unittests/rde_sets_test.c
===================================================================
RCS file: /cvs/src/regress/usr.sbin/bgpd/unittests/rde_sets_test.c,v
retrieving revision 1.3
diff -u -p -r1.3 rde_sets_test.c
--- regress/usr.sbin/bgpd/unittests/rde_sets_test.c     14 Sep 2018 10:23:42 
-0000      1.3
+++ regress/usr.sbin/bgpd/unittests/rde_sets_test.c     18 Sep 2018 15:55:48 
-0000
@@ -18,8 +18,9 @@
 #include <sys/types.h>
 #include <sys/queue.h>
 
-#include <stdio.h>
 #include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
 
 #include "rde.h"
 
@@ -28,17 +29,19 @@ u_int32_t vaa[] = { 125, 14, 76, 32, 19 
 u_int32_t vb[] = { 256, 1024, 512, 4096, 2048, 512 };
 u_int32_t vc[] = { 42 };
 
+struct as_set_head *as_sets;
+
 static struct as_set *
 build_set(const char *name, u_int32_t *mem, size_t nmemb, size_t initial)
 {
        struct as_set *a;
 
-       a = as_set_new(name, initial, sizeof(*mem));
+       a = as_sets_new(as_sets, name, initial, sizeof(*mem));
        if (a == NULL)
                err(1, "as_set_new %s", name);
-       if (as_set_add(a, mem, nmemb) != 0)
+       if (set_add(a->set, mem, nmemb) != 0)
                err(1, "as_set_add %s", name);
-       as_set_prep(a);
+       set_prep(a->set);
 
        return a;
 }
@@ -49,6 +52,10 @@ main(int argc, char **argv)
        struct as_set *a, *aa, *b, *c, *empty;
        size_t i;
 
+       if ((as_sets = malloc(sizeof(*as_sets))) == NULL)
+               err(1, NULL);
+       SIMPLEQ_INIT(as_sets);
+
        a = build_set("a", va, sizeof(va) / sizeof(va[0]),
            sizeof(va) / sizeof(va[0]));
        aa = build_set("aa", vaa, sizeof(vaa) / sizeof(vaa[0]), 0);
@@ -56,12 +63,12 @@ main(int argc, char **argv)
        c = build_set("c", vc, sizeof(vc) / sizeof(vc[0]), 1);
        empty = build_set("empty", NULL, 0, 0);
 
-       if (!as_set_equal(a, a))
-               errx(1, "as_set_equal(a, a) non equal");
-       if (!as_set_equal(a, aa))
-               errx(1, "as_set_equal(a, aa) non equal");
-       if (as_set_equal(a, b))
-               errx(1, "as_set_equal(a, b) equal");
+       if (!set_equal(a->set, a->set))
+               errx(1, "set_equal(a, a) non equal");
+       if (!set_equal(a->set, aa->set))
+               errx(1, "set_equal(a, aa) non equal");
+       if (set_equal(a->set, b->set))
+               errx(1, "set_equal(a, b) equal");
 
        for (i = 0; i < sizeof(va) / sizeof(va[0]); i++)
                if (!as_set_match(a, va[i]))
@@ -75,16 +82,12 @@ main(int argc, char **argv)
        if (as_set_match(c, 7))
                errx(1, "as_set_match(c, %u) matched but should not", 7);
        
-       if (!as_set_equal(empty, empty))
-               errx(1, "as_set_equal(empty, empty) non equal");
+       if (!set_equal(empty->set, empty->set))
+               errx(1, "set_equal(empty, empty) non equal");
        if (as_set_match(empty, 42))
                errx(1, "as_set_match(empty, %u) matched but should not", 42);
 
-       as_set_free(a);
-       as_set_free(aa);
-       as_set_free(b);
-       as_set_free(c);
-       as_set_free(empty);
+       as_sets_free(as_sets);
 
        printf("OK\n");
        return 0;
Index: regress/usr.sbin/bgpd/unittests/rde_trie_test.c
===================================================================
RCS file: /cvs/src/regress/usr.sbin/bgpd/unittests/rde_trie_test.c,v
retrieving revision 1.5
diff -u -p -r1.5 rde_trie_test.c
--- regress/usr.sbin/bgpd/unittests/rde_trie_test.c     18 Sep 2018 15:15:32 
-0000      1.5
+++ regress/usr.sbin/bgpd/unittests/rde_trie_test.c     18 Sep 2018 15:55:48 
-0000
@@ -176,7 +176,7 @@ parse_roa_file(FILE *in, struct trie_hea
 {
        const char *errstr;
        char *line, *s;
-       struct as_set *aset = NULL;
+       struct set_table *set = NULL;
        struct roa_set rs;
        struct bgpd_addr prefix;
        u_int8_t plen;
@@ -224,21 +224,20 @@ parse_roa_file(FILE *in, struct trie_hea
                }
 
                if (state == 0) {
-                       as_set_prep(aset);
-                       if (trie_roa_add(th, &prefix, plen, aset) != 0)
+                       set_prep(set);
+                       if (trie_roa_add(th, &prefix, plen, set) != 0)
                                errx(1, "trie_roa_add(%s, %u) failed",
                                    print_prefix(&prefix), plen);
-                       aset = NULL;
+                       set = NULL;
                } else {
-                       if (aset == NULL) {
-                               if ((aset = as_set_new("", 1, sizeof(rs))) ==
-                                   NULL)
-                                       err(1, "as_set_new");
+                       if (set == NULL) {
+                               if ((set = set_new(1, sizeof(rs))) == NULL)
+                                       err(1, "set_new");
                        }
                        rs.as = as;
                        rs.maxlen = max;
-                       if (as_set_add(aset, &rs, 1) != 0)
-                               err(1, "as_set_add");
+                       if (set_add(set, &rs, 1) != 0)
+                               err(1, "set_add");
                }
 
                free(line);

Reply via email to