]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
mnl: add function to convert flowtable device list to array
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 20 May 2020 18:23:34 +0000 (20:23 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 2 Jun 2020 12:05:38 +0000 (14:05 +0200)
This patch adds nft_flowtable_dev_array() to convert the list of devices
into an array. This array is released through
nft_flowtable_dev_array_free().

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/mnl.c

index 94e80261afb7847ef7f921ce4e8d3a88841b4517..2890014ebf3dc24e67bbf81428419e6194070b00 100644 (file)
--- a/src/mnl.c
+++ b/src/mnl.c
@@ -1590,29 +1590,13 @@ err:
        return NULL;
 }
 
-int mnl_nft_flowtable_add(struct netlink_ctx *ctx, struct cmd *cmd,
-                         unsigned int flags)
+static const char **nft_flowtable_dev_array(struct cmd *cmd)
 {
-       struct nftnl_flowtable *flo;
        unsigned int ifname_len;
        const char **dev_array;
        char ifname[IFNAMSIZ];
-       struct nlmsghdr *nlh;
        int i = 0, len = 1;
        struct expr *expr;
-       int priority;
-
-       flo = nftnl_flowtable_alloc();
-       if (!flo)
-               memory_allocation_error();
-
-       nftnl_flowtable_set_u32(flo, NFTNL_FLOWTABLE_FAMILY,
-                               cmd->handle.family);
-       nftnl_flowtable_set_u32(flo, NFTNL_FLOWTABLE_HOOKNUM,
-                               cmd->flowtable->hook.num);
-       mpz_export_data(&priority, cmd->flowtable->priority.expr->value,
-                       BYTEORDER_HOST_ENDIAN, sizeof(int));
-       nftnl_flowtable_set_u32(flo, NFTNL_FLOWTABLE_PRIO, priority);
 
        list_for_each_entry(expr, &cmd->flowtable->dev_expr->expressions, list)
                len++;
@@ -1628,14 +1612,44 @@ int mnl_nft_flowtable_add(struct netlink_ctx *ctx, struct cmd *cmd,
        }
 
        dev_array[i] = NULL;
-       nftnl_flowtable_set_data(flo, NFTNL_FLOWTABLE_DEVICES,
-                                dev_array, sizeof(char *) * len);
 
-       i = 0;
+       return dev_array;
+}
+
+static void nft_flowtable_dev_array_free(const char **dev_array)
+{
+       int i = 0;
+
        while (dev_array[i] != NULL)
                xfree(dev_array[i++]);
 
        free(dev_array);
+}
+
+int mnl_nft_flowtable_add(struct netlink_ctx *ctx, struct cmd *cmd,
+                         unsigned int flags)
+{
+       struct nftnl_flowtable *flo;
+       const char **dev_array;
+       struct nlmsghdr *nlh;
+       int priority;
+
+       flo = nftnl_flowtable_alloc();
+       if (!flo)
+               memory_allocation_error();
+
+       nftnl_flowtable_set_u32(flo, NFTNL_FLOWTABLE_FAMILY,
+                               cmd->handle.family);
+       nftnl_flowtable_set_u32(flo, NFTNL_FLOWTABLE_HOOKNUM,
+                               cmd->flowtable->hook.num);
+       mpz_export_data(&priority, cmd->flowtable->priority.expr->value,
+                       BYTEORDER_HOST_ENDIAN, sizeof(int));
+       nftnl_flowtable_set_u32(flo, NFTNL_FLOWTABLE_PRIO, priority);
+
+       dev_array = nft_flowtable_dev_array(cmd);
+       nftnl_flowtable_set_data(flo, NFTNL_FLOWTABLE_DEVICES,
+                                dev_array, 0);
+       nft_flowtable_dev_array_free(dev_array);
 
        nftnl_flowtable_set_u32(flo, NFTNL_FLOWTABLE_FLAGS,
                                cmd->flowtable->flags);