]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
table: support NFTA_TABLE_FLAGS
authorPablo Neira Ayuso <pablo@netfilter.org>
Thu, 8 Nov 2012 16:01:41 +0000 (17:01 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sun, 11 Nov 2012 22:25:47 +0000 (23:25 +0100)
This patch adds support for the table flags, only one is possible
at the moment (NFT_TABLE_F_DORMANT).

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/libnftables/table.h
include/linux/netfilter/nf_tables.h
src/table.c

index de34c429ebab6607ac9fb587ad4aa98ef67cb0ff..fd187b4a3bb3eb72cfe4b3ca47488401504261e3 100644 (file)
@@ -15,6 +15,7 @@ void nft_table_free(struct nft_table *);
 enum {
        NFT_TABLE_ATTR_NAME     = 0,
        NFT_TABLE_ATTR_FAMILY,
+       NFT_TABLE_ATTR_FLAGS,
 };
 
 void nft_table_attr_set(struct nft_table *t, uint16_t attr, void *data);
index 9255dbe36ca2f8df73a567b71e24ba8a5a073ef6..8cd19c8e09ab90934f89b6a944b8884ddda727e2 100644 (file)
@@ -58,6 +58,7 @@ enum nft_hook_attributes {
 enum nft_table_attributes {
        NFTA_TABLE_UNSPEC,
        NFTA_TABLE_NAME,
+       NFTA_TABLE_FLAGS,
        __NFTA_TABLE_MAX
 };
 #define NFTA_TABLE_MAX         (__NFTA_TABLE_MAX - 1)
index 6e8cd33a4074c1b99450e1270cf49a7523528efe..25c46a79de62bc40263c2d19f09889a7ec12f766 100644 (file)
@@ -28,6 +28,7 @@ struct nft_table {
 
        char            *name;
        uint8_t         family;
+       uint32_t        table_flags;
        uint32_t        flags;
 };
 
@@ -56,6 +57,10 @@ void nft_table_attr_set(struct nft_table *t, uint16_t attr, void *data)
                t->name = strdup(data);
                t->flags |= (1 << NFT_TABLE_ATTR_NAME);
                break;
+       case NFT_TABLE_ATTR_FLAGS:
+               t->table_flags = *((uint32_t *)data);
+               t->flags |= (1 << NFT_TABLE_ATTR_FLAGS);
+               break;
        }
 }
 EXPORT_SYMBOL(nft_table_attr_set);
@@ -69,6 +74,10 @@ const void *nft_table_attr_get(struct nft_table *t, uint16_t attr)
                if (t->flags & (1 << NFT_TABLE_ATTR_NAME))
                        ret = t->name;
                break;
+       case NFT_TABLE_ATTR_FLAGS:
+               if (t->flags & (1 << NFT_TABLE_ATTR_FLAGS))
+                       ret = &t->table_flags;
+               break;
        }
        return ret;
 }
@@ -99,6 +108,8 @@ void nft_table_nlmsg_build_payload(struct nlmsghdr *nlh, const struct nft_table
 {
        if (t->flags & (1 << NFT_TABLE_ATTR_NAME))
                mnl_attr_put_strz(nlh, NFTA_TABLE_NAME, t->name);
+       if (t->flags & (1 << NFT_TABLE_ATTR_FLAGS))
+               mnl_attr_put_u32(nlh, NFTA_TABLE_FLAGS, htonl(t->table_flags));
 }
 EXPORT_SYMBOL(nft_table_nlmsg_build_payload);
 
@@ -110,9 +121,19 @@ static int nft_table_parse_attr_cb(const struct nlattr *attr, void *data)
        if (mnl_attr_type_valid(attr, NFTA_TABLE_MAX) < 0)
                return MNL_CB_OK;
 
-       if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) {
-               perror("mnl_attr_validate");
-               return MNL_CB_ERROR;
+       switch(type) {
+       case NFTA_TABLE_NAME:
+               if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0) {
+                       perror("mnl_attr_validate");
+                       return MNL_CB_ERROR;
+               }
+               break;
+       case NFTA_TABLE_FLAGS:
+               if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
+                       perror("mnl_attr_validate");
+                       return MNL_CB_ERROR;
+               }
+               break;
        }
 
        tb[type] = attr;
@@ -129,6 +150,10 @@ int nft_table_nlmsg_parse(const struct nlmsghdr *nlh, struct nft_table *t)
                t->name = strdup(mnl_attr_get_str(tb[NFTA_TABLE_NAME]));
                t->flags |= (1 << NFT_TABLE_ATTR_NAME);
        }
+       if (tb[NFTA_TABLE_FLAGS]) {
+               t->table_flags = ntohl(mnl_attr_get_u32(tb[NFTA_TABLE_FLAGS]));
+               t->flags |= (1 << NFT_TABLE_ATTR_FLAGS);
+       }
 
        t->family = nfg->nfgen_family;
 
@@ -139,7 +164,8 @@ EXPORT_SYMBOL(nft_table_nlmsg_parse);
 int nft_table_snprintf(char *buf, size_t size, struct nft_table *t,
                       uint32_t type, uint32_t flags)
 {
-       return snprintf(buf, size, "table=%s family=%u\n", t->name, t->family);
+       return snprintf(buf, size, "table=%s family=%u flags=%x\n",
+                       t->name, t->family, t->table_flags);
 }
 EXPORT_SYMBOL(nft_table_snprintf);