We can remove alloc_nftnl_set() and consolidate infrastructure in the
src/mnl.c file.

Signed-off-by: Pablo Neira Ayuso <pa...@netfilter.org>
---
 include/mnl.h     |  18 +++--
 include/netlink.h |  14 ++--
 src/mnl.c         | 192 ++++++++++++++++++++++++++++++++++++++++++++++--------
 src/netlink.c     | 176 +++++++------------------------------------------
 src/rule.c        |  19 +++---
 5 files changed, 209 insertions(+), 210 deletions(-)

diff --git a/include/mnl.h b/include/mnl.h
index c5fcb4cdc2ef..3ddc82a05cb0 100644
--- a/include/mnl.h
+++ b/include/mnl.h
@@ -51,19 +51,17 @@ int mnl_nft_table_del(struct netlink_ctx *ctx, const struct 
cmd *cmd);
 struct nftnl_table_list *mnl_nft_table_dump(struct netlink_ctx *ctx,
                                            int family);
 
-int mnl_nft_set_batch_add(struct nftnl_set *nls, struct nftnl_batch *batch,
-                         unsigned int flags, uint32_t seqnum);
-int mnl_nft_set_batch_del(struct nftnl_set *nls, struct nftnl_batch *batch,
-                         unsigned int flags, uint32_t seqnum);
+int mnl_nft_set_add(struct netlink_ctx *ctx, const struct cmd *cmd,
+                   unsigned int flags);
+int mnl_nft_set_del(struct netlink_ctx *ctx, const struct cmd *cmd);
+
 struct nftnl_set_list *mnl_nft_set_dump(struct netlink_ctx *ctx, int family,
                                        const char *table);
 
-int mnl_nft_setelem_batch_add(struct nftnl_set *nls, struct nftnl_batch *batch,
-                             unsigned int flags, uint32_t seqnum);
-int mnl_nft_setelem_batch_del(struct nftnl_set *nls, struct nftnl_batch *batch,
-                             unsigned int flags, uint32_t seqnum);
-int mnl_nft_setelem_batch_flush(struct nftnl_set *nls, struct nftnl_batch 
*batch,
-                               unsigned int flags, uint32_t seqnum);
+int mnl_nft_setelem_add(struct netlink_ctx *ctx, const struct set *set,
+                       const struct expr *expr, unsigned int flags);
+int mnl_nft_setelem_del(struct netlink_ctx *ctx, const struct cmd *cmd);
+int mnl_nft_setelem_flush(struct netlink_ctx *ctx, const struct cmd *cmd);
 int mnl_nft_setelem_get(struct netlink_ctx *ctx, struct nftnl_set *nls);
 struct nftnl_set *mnl_nft_setelem_get_one(struct netlink_ctx *ctx,
                                          struct nftnl_set *nls);
diff --git a/include/netlink.h b/include/netlink.h
index 36a89b9bb05e..57e1d98a57a5 100644
--- a/include/netlink.h
+++ b/include/netlink.h
@@ -58,7 +58,7 @@ struct netlink_ctx {
 };
 
 extern struct nftnl_expr *alloc_nft_expr(const char *name);
-extern struct nftnl_set *alloc_nftnl_set(const struct handle *h);
+extern void alloc_setelem_cache(const struct expr *set, struct nftnl_set *nls);
 
 struct nft_data_linearize {
        uint32_t        len;
@@ -118,10 +118,6 @@ extern int netlink_flush_table(struct netlink_ctx *ctx, 
const struct cmd *cmd);
 extern struct table *netlink_delinearize_table(struct netlink_ctx *ctx,
                                               const struct nftnl_table *nlt);
 
-extern int netlink_add_set_batch(struct netlink_ctx *ctx, const struct cmd 
*cmd,
-                                uint32_t flags);
-extern int netlink_delete_set_batch(struct netlink_ctx *ctx,
-                                   const struct cmd *cmd);
 extern int netlink_list_sets(struct netlink_ctx *ctx, const struct handle *h);
 extern struct set *netlink_delinearize_set(struct netlink_ctx *ctx,
                                           const struct nftnl_set *nls);
@@ -130,16 +126,11 @@ extern struct stmt *netlink_parse_set_expr(const struct 
set *set,
                                           const struct nft_cache *cache,
                                           const struct nftnl_expr *nle);
 
-extern int netlink_add_setelems_batch(struct netlink_ctx *ctx, const struct 
handle *h,
-                               const struct expr *expr, uint32_t flags);
-extern int netlink_delete_setelems_batch(struct netlink_ctx *ctx,
-                                        const struct cmd *cmd);
 extern int netlink_list_setelems(struct netlink_ctx *ctx,
                                 const struct handle *h, struct set *set);
 extern int netlink_get_setelem(struct netlink_ctx *ctx, const struct handle *h,
                               const struct location *loc, struct table *table,
                               struct set *set, struct expr *init);
-extern int netlink_flush_setelems(struct netlink_ctx *ctx, const struct cmd 
*cmd);
 extern int netlink_delinearize_setelem(struct nftnl_set_elem *nlse,
                                       const struct set *set,
                                       struct nft_cache *cache);
@@ -212,4 +203,7 @@ int netlink_markup_parse_cb(const struct nftnl_parse_ctx 
*ctx);
 int netlink_events_trace_cb(const struct nlmsghdr *nlh, int type,
                            struct netlink_mon_handler *monh);
 
+enum nft_data_types dtype_map_to_kernel(const struct datatype *dtype);
+const struct datatype *dtype_map_from_kernel(enum nft_data_types type);
+
 #endif /* NFTABLES_NETLINK_H */
diff --git a/src/mnl.c b/src/mnl.c
index 07316395db66..48637e27a3c1 100644
--- a/src/mnl.c
+++ b/src/mnl.c
@@ -19,6 +19,7 @@
 #include <libnftnl/object.h>
 #include <libnftnl/flowtable.h>
 #include <libnftnl/batch.h>
+#include <libnftnl/udata.h>
 
 #include <linux/netfilter/nfnetlink.h>
 #include <linux/netfilter/nf_tables.h>
@@ -710,32 +711,116 @@ err:
 /*
  * Set
  */
-int mnl_nft_set_batch_add(struct nftnl_set *nls, struct nftnl_batch *batch,
-                         unsigned int flags, uint32_t seqnum)
+int mnl_nft_set_add(struct netlink_ctx *ctx, const struct cmd *cmd,
+                   unsigned int flags)
 {
+       const struct handle *h = &cmd->handle;
+       struct nftnl_udata_buf *udbuf;
+       struct set *set = cmd->set;
+       struct nftnl_set *nls;
        struct nlmsghdr *nlh;
 
-       nlh = nftnl_nlmsg_build_hdr(nftnl_batch_buffer(batch),
+       nls = nftnl_set_alloc();
+       if (!nls)
+               memory_allocation_error();
+
+       nftnl_set_set_u32(nls, NFTNL_SET_FAMILY, h->family);
+       nftnl_set_set_str(nls, NFTNL_SET_TABLE, h->table.name);
+       nftnl_set_set_str(nls, NFTNL_SET_NAME, h->set.name);
+       nftnl_set_set_u32(nls, NFTNL_SET_ID, h->set_id);
+
+       nftnl_set_set_u32(nls, NFTNL_SET_FLAGS, set->flags);
+       nftnl_set_set_u32(nls, NFTNL_SET_KEY_TYPE,
+                         dtype_map_to_kernel(set->key->dtype));
+       nftnl_set_set_u32(nls, NFTNL_SET_KEY_LEN,
+                         div_round_up(set->key->len, BITS_PER_BYTE));
+       if (set->flags & NFT_SET_MAP) {
+               nftnl_set_set_u32(nls, NFTNL_SET_DATA_TYPE,
+                                 dtype_map_to_kernel(set->datatype));
+               nftnl_set_set_u32(nls, NFTNL_SET_DATA_LEN,
+                                 set->datalen / BITS_PER_BYTE);
+       }
+       if (set->flags & NFT_SET_OBJECT)
+               nftnl_set_set_u32(nls, NFTNL_SET_OBJ_TYPE, set->objtype);
+
+       if (set->timeout)
+               nftnl_set_set_u64(nls, NFTNL_SET_TIMEOUT, set->timeout);
+       if (set->gc_int)
+               nftnl_set_set_u32(nls, NFTNL_SET_GC_INTERVAL, set->gc_int);
+
+       nftnl_set_set_u32(nls, NFTNL_SET_ID, set->handle.set_id);
+
+       if (!(set->flags & NFT_SET_CONSTANT)) {
+               if (set->policy != NFT_SET_POL_PERFORMANCE)
+                       nftnl_set_set_u32(nls, NFTNL_SET_POLICY, set->policy);
+
+               if (set->desc.size != 0)
+                       nftnl_set_set_u32(nls, NFTNL_SET_DESC_SIZE,
+                                         set->desc.size);
+       } else if (set->init) {
+               nftnl_set_set_u32(nls, NFTNL_SET_DESC_SIZE, set->init->size);
+       }
+
+       udbuf = nftnl_udata_buf_alloc(NFT_USERDATA_MAXLEN);
+       if (!udbuf)
+               memory_allocation_error();
+       if (!nftnl_udata_put_u32(udbuf, UDATA_SET_KEYBYTEORDER,
+                                set->key->byteorder))
+               memory_allocation_error();
+
+       if (set->flags & NFT_SET_MAP &&
+           !nftnl_udata_put_u32(udbuf, UDATA_SET_DATABYTEORDER,
+                                set->datatype->byteorder))
+               memory_allocation_error();
+
+       if (set->automerge &&
+           !nftnl_udata_put_u32(udbuf, UDATA_SET_MERGE_ELEMENTS,
+                                set->automerge))
+               memory_allocation_error();
+
+       nftnl_set_set_data(nls, NFTNL_SET_USERDATA, nftnl_udata_buf_data(udbuf),
+                          nftnl_udata_buf_len(udbuf));
+       nftnl_udata_buf_free(udbuf);
+
+       netlink_dump_set(nls, ctx);
+
+       nlh = nftnl_nlmsg_build_hdr(nftnl_batch_buffer(ctx->batch),
                                    NFT_MSG_NEWSET,
-                                   nftnl_set_get_u32(nls, NFTNL_SET_FAMILY),
-                                   NLM_F_CREATE | flags, seqnum);
+                                   h->family,
+                                   NLM_F_CREATE | flags, ctx->seqnum);
        nftnl_set_nlmsg_build_payload(nlh, nls);
-       mnl_nft_batch_continue(batch);
+       nftnl_set_free(nls);
+
+       mnl_nft_batch_continue(ctx->batch);
 
        return 0;
 }
 
-int mnl_nft_set_batch_del(struct nftnl_set *nls, struct nftnl_batch *batch,
-                         unsigned int flags, uint32_t seqnum)
+int mnl_nft_set_del(struct netlink_ctx *ctx, const struct cmd *cmd)
 {
+       const struct handle *h = &cmd->handle;
+       struct nftnl_set *nls;
        struct nlmsghdr *nlh;
 
-       nlh = nftnl_nlmsg_build_hdr(nftnl_batch_buffer(batch),
+       nls = nftnl_set_alloc();
+       if (!nls)
+               memory_allocation_error();
+
+       nftnl_set_set_u32(nls, NFTNL_SET_FAMILY, h->family);
+       nftnl_set_set_str(nls, NFTNL_SET_TABLE, h->table.name);
+       if (h->set.name)
+               nftnl_set_set_str(nls, NFTNL_SET_NAME, h->set.name);
+       if (h->handle.id)
+               nftnl_set_set_u64(nls, NFTNL_SET_HANDLE, h->handle.id);
+
+       nlh = nftnl_nlmsg_build_hdr(nftnl_batch_buffer(ctx->batch),
                                    NFT_MSG_DELSET,
-                                   nftnl_set_get_u32(nls, NFTNL_SET_FAMILY),
-                                   flags, seqnum);
+                                   h->family,
+                                   0, ctx->seqnum);
        nftnl_set_nlmsg_build_payload(nlh, nls);
-       mnl_nft_batch_continue(batch);
+       nftnl_set_free(nls);
+
+       mnl_nft_batch_continue(ctx->batch);
 
        return 0;
 }
@@ -940,33 +1025,88 @@ static int mnl_nft_setelem_batch(struct nftnl_set *nls,
        return 0;
 }
 
-int mnl_nft_setelem_batch_add(struct nftnl_set *nls, struct nftnl_batch *batch,
-                             unsigned int flags, uint32_t seqnum)
+int mnl_nft_setelem_add(struct netlink_ctx *ctx, const struct set *set,
+                       const struct expr *expr, unsigned int flags)
 {
-       return mnl_nft_setelem_batch(nls, batch, NFT_MSG_NEWSETELEM, flags,
-                                    seqnum);
+       const struct handle *h = &set->handle;
+       struct nftnl_set *nls;
+       int err;
+
+       nls = nftnl_set_alloc();
+       if (nls == NULL)
+               memory_allocation_error();
+
+       nftnl_set_set_u32(nls, NFTNL_SET_FAMILY, h->family);
+       nftnl_set_set_str(nls, NFTNL_SET_TABLE, h->table.name);
+       nftnl_set_set_str(nls, NFTNL_SET_NAME, h->set.name);
+       if (h->set_id)
+               nftnl_set_set_u32(nls, NFTNL_SET_ID, h->set_id);
+
+       alloc_setelem_cache(expr, nls);
+       netlink_dump_set(nls, ctx);
+
+       err = mnl_nft_setelem_batch(nls, ctx->batch, NFT_MSG_NEWSETELEM, flags,
+                                   ctx->seqnum);
+       nftnl_set_free(nls);
+
+       return err;
 }
 
-int mnl_nft_setelem_batch_flush(struct nftnl_set *nls, struct nftnl_batch 
*batch,
-                               unsigned int flags, uint32_t seqnum)
+int mnl_nft_setelem_flush(struct netlink_ctx *ctx, const struct cmd *cmd)
 {
+       const struct handle *h = &cmd->handle;
+       struct nftnl_set *nls;
        struct nlmsghdr *nlh;
 
-       nlh = nftnl_nlmsg_build_hdr(nftnl_batch_buffer(batch),
+       nls = nftnl_set_alloc();
+       if (nls == NULL)
+               memory_allocation_error();
+
+       nftnl_set_set_u32(nls, NFTNL_SET_FAMILY, h->family);
+       nftnl_set_set_str(nls, NFTNL_SET_TABLE, h->table.name);
+       nftnl_set_set_str(nls, NFTNL_SET_NAME, h->set.name);
+       if (h->handle.id)
+               nftnl_set_set_u64(nls, NFTNL_SET_HANDLE, h->handle.id);
+
+       netlink_dump_set(nls, ctx);
+
+       nlh = nftnl_nlmsg_build_hdr(nftnl_batch_buffer(ctx->batch),
                                    NFT_MSG_DELSETELEM,
-                                   nftnl_set_get_u32(nls, NFTNL_SET_FAMILY),
-                                   flags, seqnum);
+                                   h->family,
+                                   0, ctx->seqnum);
        nftnl_set_elems_nlmsg_build_payload(nlh, nls);
-       mnl_nft_batch_continue(batch);
+       nftnl_set_free(nls);
+
+       mnl_nft_batch_continue(ctx->batch);
 
        return 0;
 }
 
-int mnl_nft_setelem_batch_del(struct nftnl_set *nls, struct nftnl_batch *batch,
-                             unsigned int flags, uint32_t seqnum)
+int mnl_nft_setelem_del(struct netlink_ctx *ctx, const struct cmd *cmd)
 {
-       return mnl_nft_setelem_batch(nls, batch, NFT_MSG_DELSETELEM, flags,
-                                    seqnum);
+       const struct handle *h = &cmd->handle;
+       struct nftnl_set *nls;
+       int err;
+
+       nls = nftnl_set_alloc();
+       if (nls == NULL)
+               memory_allocation_error();
+
+       nftnl_set_set_u32(nls, NFTNL_SET_FAMILY, h->family);
+       nftnl_set_set_str(nls, NFTNL_SET_TABLE, h->table.name);
+       nftnl_set_set_str(nls, NFTNL_SET_NAME, h->set.name);
+       if (h->handle.id)
+               nftnl_set_set_u64(nls, NFTNL_SET_HANDLE, h->handle.id);
+
+       if (cmd->expr)
+               alloc_setelem_cache(cmd->expr, nls);
+       netlink_dump_set(nls, ctx);
+
+       err = mnl_nft_setelem_batch(nls, ctx->batch, NFT_MSG_DELSETELEM, 0,
+                                   ctx->seqnum);
+       nftnl_set_free(nls);
+
+       return err;
 }
 
 struct nftnl_set *mnl_nft_setelem_get_one(struct netlink_ctx *ctx,
diff --git a/src/netlink.c b/src/netlink.c
index 5e205aa19e6e..3cf423510b6b 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -122,26 +122,6 @@ struct nftnl_expr *alloc_nft_expr(const char *name)
        return nle;
 }
 
-struct nftnl_set *alloc_nftnl_set(const struct handle *h)
-{
-       struct nftnl_set *nls;
-
-       nls = nftnl_set_alloc();
-       if (nls == NULL)
-               memory_allocation_error();
-
-       nftnl_set_set_u32(nls, NFTNL_SET_FAMILY, h->family);
-       nftnl_set_set_str(nls, NFTNL_SET_TABLE, h->table.name);
-       if (h->set.name != NULL)
-               nftnl_set_set_str(nls, NFTNL_SET_NAME, h->set.name);
-       if (h->set_id)
-               nftnl_set_set_u32(nls, NFTNL_SET_ID, h->set_id);
-       if (h->handle.id)
-               nftnl_set_set_u64(nls, NFTNL_SET_HANDLE, h->handle.id);
-
-       return nls;
-}
-
 static struct nftnl_set_elem *alloc_nftnl_setelem(const struct expr *set,
                                                  const struct expr *expr)
 {
@@ -618,7 +598,7 @@ int netlink_flush_table(struct netlink_ctx *ctx, const 
struct cmd *cmd)
        return netlink_flush_rules(ctx, cmd);
 }
 
-static enum nft_data_types dtype_map_to_kernel(const struct datatype *dtype)
+enum nft_data_types dtype_map_to_kernel(const struct datatype *dtype)
 {
        switch (dtype->type) {
        case TYPE_VERDICT:
@@ -628,7 +608,7 @@ static enum nft_data_types dtype_map_to_kernel(const struct 
datatype *dtype)
        }
 }
 
-static const struct datatype *dtype_map_from_kernel(enum nft_data_types type)
+const struct datatype *dtype_map_from_kernel(enum nft_data_types type)
 {
        switch (type) {
        case NFT_DATA_VERDICT:
@@ -768,88 +748,6 @@ struct set *netlink_delinearize_set(struct netlink_ctx 
*ctx,
        return set;
 }
 
-int netlink_add_set_batch(struct netlink_ctx *ctx, const struct cmd *cmd,
-                         uint32_t flags)
-{
-       struct nftnl_udata_buf *udbuf;
-       struct set *set = cmd->set;
-       struct nftnl_set *nls;
-       int err;
-
-       nls = alloc_nftnl_set(&cmd->handle);
-       nftnl_set_set_u32(nls, NFTNL_SET_FLAGS, set->flags);
-       nftnl_set_set_u32(nls, NFTNL_SET_KEY_TYPE,
-                         dtype_map_to_kernel(set->key->dtype));
-       nftnl_set_set_u32(nls, NFTNL_SET_KEY_LEN,
-                         div_round_up(set->key->len, BITS_PER_BYTE));
-       if (set->flags & NFT_SET_MAP) {
-               nftnl_set_set_u32(nls, NFTNL_SET_DATA_TYPE,
-                                 dtype_map_to_kernel(set->datatype));
-               nftnl_set_set_u32(nls, NFTNL_SET_DATA_LEN,
-                                 set->datalen / BITS_PER_BYTE);
-       }
-       if (set->flags & NFT_SET_OBJECT)
-               nftnl_set_set_u32(nls, NFTNL_SET_OBJ_TYPE, set->objtype);
-
-       if (set->timeout)
-               nftnl_set_set_u64(nls, NFTNL_SET_TIMEOUT, set->timeout);
-       if (set->gc_int)
-               nftnl_set_set_u32(nls, NFTNL_SET_GC_INTERVAL, set->gc_int);
-
-       nftnl_set_set_u32(nls, NFTNL_SET_ID, set->handle.set_id);
-
-       if (!(set->flags & NFT_SET_CONSTANT)) {
-               if (set->policy != NFT_SET_POL_PERFORMANCE)
-                       nftnl_set_set_u32(nls, NFTNL_SET_POLICY, set->policy);
-
-               if (set->desc.size != 0)
-                       nftnl_set_set_u32(nls, NFTNL_SET_DESC_SIZE,
-                                         set->desc.size);
-       } else if (set->init) {
-               nftnl_set_set_u32(nls, NFTNL_SET_DESC_SIZE, set->init->size);
-       }
-
-       udbuf = nftnl_udata_buf_alloc(NFT_USERDATA_MAXLEN);
-       if (!udbuf)
-               memory_allocation_error();
-       if (!nftnl_udata_put_u32(udbuf, UDATA_SET_KEYBYTEORDER,
-                                set->key->byteorder))
-               memory_allocation_error();
-
-       if (set->flags & NFT_SET_MAP &&
-           !nftnl_udata_put_u32(udbuf, UDATA_SET_DATABYTEORDER,
-                                set->datatype->byteorder))
-               memory_allocation_error();
-
-       if (set->automerge &&
-           !nftnl_udata_put_u32(udbuf, UDATA_SET_MERGE_ELEMENTS,
-                                set->automerge))
-               memory_allocation_error();
-
-       nftnl_set_set_data(nls, NFTNL_SET_USERDATA, nftnl_udata_buf_data(udbuf),
-                          nftnl_udata_buf_len(udbuf));
-       nftnl_udata_buf_free(udbuf);
-
-       netlink_dump_set(nls, ctx);
-
-       err = mnl_nft_set_batch_add(nls, ctx->batch, flags, ctx->seqnum);
-       nftnl_set_free(nls);
-
-       return err;
-}
-
-int netlink_delete_set_batch(struct netlink_ctx *ctx, const struct cmd *cmd)
-{
-       struct nftnl_set *nls;
-       int err;
-
-       nls = alloc_nftnl_set(&cmd->handle);
-       err = mnl_nft_set_batch_del(nls, ctx->batch, 0, ctx->seqnum);
-       nftnl_set_free(nls);
-
-       return err;
-}
-
 static int list_set_cb(struct nftnl_set *nls, void *arg)
 {
        struct netlink_ctx *ctx = arg;
@@ -881,7 +779,7 @@ int netlink_list_sets(struct netlink_ctx *ctx, const struct 
handle *h)
        return err;
 }
 
-static void alloc_setelem_cache(const struct expr *set, struct nftnl_set *nls)
+void alloc_setelem_cache(const struct expr *set, struct nftnl_set *nls)
 {
        struct nftnl_set_elem *nlse;
        const struct expr *expr;
@@ -892,53 +790,6 @@ static void alloc_setelem_cache(const struct expr *set, 
struct nftnl_set *nls)
        }
 }
 
-int netlink_add_setelems_batch(struct netlink_ctx *ctx, const struct handle *h,
-                              const struct expr *expr, uint32_t flags)
-{
-       struct nftnl_set *nls;
-       int err;
-
-       nls = alloc_nftnl_set(h);
-       alloc_setelem_cache(expr, nls);
-       netlink_dump_set(nls, ctx);
-
-       err = mnl_nft_setelem_batch_add(nls, ctx->batch, flags, ctx->seqnum);
-       nftnl_set_free(nls);
-
-       return err;
-}
-
-int netlink_delete_setelems_batch(struct netlink_ctx *ctx,
-                                 const struct cmd *cmd)
-{
-       struct nftnl_set *nls;
-       int err;
-
-       nls = alloc_nftnl_set(&cmd->handle);
-       if (cmd->expr)
-               alloc_setelem_cache(cmd->expr, nls);
-       netlink_dump_set(nls, ctx);
-
-       err = mnl_nft_setelem_batch_del(nls, ctx->batch, 0, ctx->seqnum);
-       nftnl_set_free(nls);
-
-       return err;
-}
-
-int netlink_flush_setelems(struct netlink_ctx *ctx, const struct cmd *cmd)
-{
-       struct nftnl_set *nls;
-       int err;
-
-       nls = alloc_nftnl_set(&cmd->handle);
-       netlink_dump_set(nls, ctx);
-
-       err = mnl_nft_setelem_batch_flush(nls, ctx->batch, 0, ctx->seqnum);
-       nftnl_set_free(nls);
-
-       return err;
-}
-
 static struct expr *netlink_parse_concat_elem(const struct datatype *dtype,
                                              struct expr *data)
 {
@@ -1105,7 +956,15 @@ int netlink_list_setelems(struct netlink_ctx *ctx, const 
struct handle *h,
        struct nftnl_set *nls;
        int err;
 
-       nls = alloc_nftnl_set(h);
+       nls = nftnl_set_alloc();
+       if (nls == NULL)
+               memory_allocation_error();
+
+       nftnl_set_set_u32(nls, NFTNL_SET_FAMILY, h->family);
+       nftnl_set_set_str(nls, NFTNL_SET_TABLE, h->table.name);
+       nftnl_set_set_str(nls, NFTNL_SET_NAME, h->set.name);
+       if (h->handle.id)
+               nftnl_set_set_u64(nls, NFTNL_SET_HANDLE, h->handle.id);
 
        err = mnl_nft_setelem_get(ctx, nls);
        if (err < 0) {
@@ -1138,7 +997,16 @@ int netlink_get_setelem(struct netlink_ctx *ctx, const 
struct handle *h,
 {
        struct nftnl_set *nls, *nls_out = NULL;
 
-       nls = alloc_nftnl_set(h);
+       nls = nftnl_set_alloc();
+       if (nls == NULL)
+               memory_allocation_error();
+
+       nftnl_set_set_u32(nls, NFTNL_SET_FAMILY, h->family);
+       nftnl_set_set_str(nls, NFTNL_SET_TABLE, h->table.name);
+       nftnl_set_set_str(nls, NFTNL_SET_NAME, h->set.name);
+       if (h->handle.id)
+               nftnl_set_set_u64(nls, NFTNL_SET_HANDLE, h->handle.id);
+
        alloc_setelem_cache(init, nls);
 
        netlink_dump_set(nls, ctx);
diff --git a/src/rule.c b/src/rule.c
index b5014788961b..5ef84f79592d 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -1344,11 +1344,11 @@ void cmd_free(struct cmd *cmd)
 #include <netlink.h>
 #include <mnl.h>
 
-static int __do_add_setelems(struct netlink_ctx *ctx, const struct handle *h,
-                            struct set *set, struct expr *expr, uint32_t flags)
+static int __do_add_setelems(struct netlink_ctx *ctx, struct set *set,
+                            struct expr *expr, uint32_t flags)
 {
        expr->set_flags |= set->flags;
-       if (netlink_add_setelems_batch(ctx, h, expr, flags) < 0)
+       if (mnl_nft_setelem_add(ctx, set, expr, flags) < 0)
                return -1;
 
        return 0;
@@ -1370,7 +1370,7 @@ static int do_add_setelems(struct netlink_ctx *ctx, 
struct cmd *cmd,
                             ctx->debug_mask, set->automerge) < 0)
                return -1;
 
-       return __do_add_setelems(ctx, h, set, init, flags);
+       return __do_add_setelems(ctx, set, init, flags);
 }
 
 static int do_add_set(struct netlink_ctx *ctx, const struct cmd *cmd,
@@ -1384,11 +1384,10 @@ static int do_add_set(struct netlink_ctx *ctx, const 
struct cmd *cmd,
                                     ctx->debug_mask, set->automerge) < 0)
                        return -1;
        }
-       if (netlink_add_set_batch(ctx, cmd, flags) < 0)
+       if (mnl_nft_set_add(ctx, cmd, flags) < 0)
                return -1;
        if (set->init != NULL) {
-               return __do_add_setelems(ctx, &set->handle, set, set->init,
-                                        flags);
+               return __do_add_setelems(ctx, set, set->init, flags);
        }
        return 0;
 }
@@ -1483,7 +1482,7 @@ static int do_delete_setelems(struct netlink_ctx *ctx, 
struct cmd *cmd)
                             ctx->debug_mask, set->automerge) < 0)
                return -1;
 
-       if (netlink_delete_setelems_batch(ctx, cmd) < 0)
+       if (mnl_nft_setelem_del(ctx, cmd) < 0)
                return -1;
 
        return 0;
@@ -1499,7 +1498,7 @@ static int do_command_delete(struct netlink_ctx *ctx, 
struct cmd *cmd)
        case CMD_OBJ_RULE:
                return mnl_nft_rule_del(ctx, cmd);
        case CMD_OBJ_SET:
-               return netlink_delete_set_batch(ctx, cmd);
+               return mnl_nft_set_del(ctx, cmd);
        case CMD_OBJ_SETELEM:
                return do_delete_setelems(ctx, cmd);
        case CMD_OBJ_COUNTER:
@@ -2266,7 +2265,7 @@ static int do_command_flush(struct netlink_ctx *ctx, 
struct cmd *cmd)
        case CMD_OBJ_SET:
        case CMD_OBJ_MAP:
        case CMD_OBJ_METER:
-               return netlink_flush_setelems(ctx, cmd);
+               return mnl_nft_setelem_flush(ctx, cmd);
        case CMD_OBJ_RULESET:
                return mnl_nft_table_del(ctx, cmd);
        default:
-- 
2.11.0

Reply via email to