netfilter: nf_tables: introduce nft_setelem_parse_flags() helper
authorPablo Neira Ayuso <pablo@netfilter.org>
Tue, 12 Apr 2016 21:50:34 +0000 (23:50 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 25 Apr 2016 12:52:12 +0000 (14:52 +0200)
This function parses the set element flags, thus, we can reuse the same
handling when deleting elements.

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

index 7a85a9d..1b3210b 100644 (file)
@@ -3375,6 +3375,22 @@ void nft_set_elem_destroy(const struct nft_set *set, void *elem)
 }
 EXPORT_SYMBOL_GPL(nft_set_elem_destroy);
 
+static int nft_setelem_parse_flags(const struct nft_set *set,
+                                  const struct nlattr *attr, u32 *flags)
+{
+       if (attr == NULL)
+               return 0;
+
+       *flags = ntohl(nla_get_be32(attr));
+       if (*flags & ~NFT_SET_ELEM_INTERVAL_END)
+               return -EINVAL;
+       if (!(set->flags & NFT_SET_INTERVAL) &&
+           *flags & NFT_SET_ELEM_INTERVAL_END)
+               return -EINVAL;
+
+       return 0;
+}
+
 static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
                            const struct nlattr *attr)
 {
@@ -3388,8 +3404,8 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
        struct nft_data data;
        enum nft_registers dreg;
        struct nft_trans *trans;
+       u32 flags = 0;
        u64 timeout;
-       u32 flags;
        u8 ulen;
        int err;
 
@@ -3403,17 +3419,11 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
 
        nft_set_ext_prepare(&tmpl);
 
-       flags = 0;
-       if (nla[NFTA_SET_ELEM_FLAGS] != NULL) {
-               flags = ntohl(nla_get_be32(nla[NFTA_SET_ELEM_FLAGS]));
-               if (flags & ~NFT_SET_ELEM_INTERVAL_END)
-                       return -EINVAL;
-               if (!(set->flags & NFT_SET_INTERVAL) &&
-                   flags & NFT_SET_ELEM_INTERVAL_END)
-                       return -EINVAL;
-               if (flags != 0)
-                       nft_set_ext_add(&tmpl, NFT_SET_EXT_FLAGS);
-       }
+       err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags);
+       if (err < 0)
+               return err;
+       if (flags != 0)
+               nft_set_ext_add(&tmpl, NFT_SET_EXT_FLAGS);
 
        if (set->flags & NFT_SET_MAP) {
                if (nla[NFTA_SET_ELEM_DATA] == NULL &&