]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: use UDATA defines from libnftnl
authorPhil Sutter <phil@nwl.cc>
Thu, 25 Apr 2019 12:56:54 +0000 (14:56 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 3 May 2019 18:02:45 +0000 (20:02 +0200)
Userdata attribute names have been added to libnftnl, use them instead
of the local copy.

While being at it, rename udata_get_comment() in netlink_delinearize.c
and the callback it uses since the function is specific to rules. Also
integrate the existence check for NFTNL_RULE_USERDATA into it along with
the call to nftnl_rule_get_data().

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/rule.h
src/mnl.c
src/monitor.c
src/netlink.c
src/netlink_delinearize.c
src/netlink_linearize.c
src/parser_bison.y
src/segtree.c

index dc5e5b87f93311e59d7c953b98e8776bac66e176..8e70c129fcce060837ec4c05107182cd3d84802c 100644 (file)
@@ -637,38 +637,6 @@ extern void cache_flush(struct nft_ctx *ctx, enum cmd_ops cmd,
                        struct list_head *msgs);
 extern void cache_release(struct nft_cache *cache);
 
-enum udata_type {
-       UDATA_TYPE_COMMENT,
-       __UDATA_TYPE_MAX,
-};
-#define UDATA_TYPE_MAX (__UDATA_TYPE_MAX - 1)
-
-#define UDATA_COMMENT_MAXLEN 128
-
-enum udata_set_type {
-       UDATA_SET_KEYBYTEORDER,
-       UDATA_SET_DATABYTEORDER,
-       UDATA_SET_MERGE_ELEMENTS,
-       __UDATA_SET_MAX,
-};
-#define UDATA_SET_MAX (__UDATA_SET_MAX - 1)
-
-enum udata_set_elem_type {
-       UDATA_SET_ELEM_COMMENT,
-       UDATA_SET_ELEM_FLAGS,
-       __UDATA_SET_ELEM_MAX,
-};
-#define UDATA_SET_ELEM_MAX (__UDATA_SET_ELEM_MAX - 1)
-
-/**
- * enum udata_set_elem_flags - meaning of bits in UDATA_SET_ELEM_FLAGS
- *
- * @SET_ELEM_F_INTERVAL_OPEN:  set element denotes a half-open range
- */
-enum udata_set_elem_flags {
-       SET_ELEM_F_INTERVAL_OPEN        = 0x1,
-};
-
 struct timeout_protocol {
        uint32_t array_size;
        const char *const *state_to_name;
index dde232c7e29c4046deccebea2ec28efabaf7bea9..f6363560721c182e569f403e90f8d6ce341bea58 100644 (file)
--- a/src/mnl.c
+++ b/src/mnl.c
@@ -780,17 +780,17 @@ int mnl_nft_set_add(struct netlink_ctx *ctx, const struct cmd *cmd,
        udbuf = nftnl_udata_buf_alloc(NFT_USERDATA_MAXLEN);
        if (!udbuf)
                memory_allocation_error();
-       if (!nftnl_udata_put_u32(udbuf, UDATA_SET_KEYBYTEORDER,
+       if (!nftnl_udata_put_u32(udbuf, NFTNL_UDATA_SET_KEYBYTEORDER,
                                 set->key->byteorder))
                memory_allocation_error();
 
        if (set->flags & NFT_SET_MAP &&
-           !nftnl_udata_put_u32(udbuf, UDATA_SET_DATABYTEORDER,
+           !nftnl_udata_put_u32(udbuf, NFTNL_UDATA_SET_DATABYTEORDER,
                                 set->datatype->byteorder))
                memory_allocation_error();
 
        if (set->automerge &&
-           !nftnl_udata_put_u32(udbuf, UDATA_SET_MERGE_ELEMENTS,
+           !nftnl_udata_put_u32(udbuf, NFTNL_UDATA_SET_MERGE_ELEMENTS,
                                 set->automerge))
                memory_allocation_error();
 
index 35dc4501b4c4f6a9d9ca7bc3663ece58ff7a447b..a68d960bfd4e8535a84d6d0d595037c616e8a9b8 100644 (file)
@@ -332,7 +332,7 @@ static bool set_elem_is_open_interval(struct expr *elem)
 {
        switch (elem->etype) {
        case EXPR_SET_ELEM:
-               return elem->elem_flags & SET_ELEM_F_INTERVAL_OPEN;
+               return elem->elem_flags & NFTNL_SET_ELEM_F_INTERVAL_OPEN;
        case EXPR_MAPPING:
                return set_elem_is_open_interval(elem->left);
        default:
index 9e0e07d4c5b088146b62d161c546d6fd5acc104e..c051ae6c4390855e21ee39f390cf4ad256a6515f 100644 (file)
@@ -128,12 +128,12 @@ static struct nftnl_set_elem *alloc_nftnl_setelem(const struct expr *set,
                        memory_allocation_error();
        }
        if (elem->comment) {
-               if (!nftnl_udata_put_strz(udbuf, UDATA_SET_ELEM_COMMENT,
+               if (!nftnl_udata_put_strz(udbuf, NFTNL_UDATA_SET_ELEM_COMMENT,
                                          elem->comment))
                        memory_allocation_error();
        }
        if (expr->elem_flags) {
-               if (!nftnl_udata_put_u32(udbuf, UDATA_SET_ELEM_FLAGS,
+               if (!nftnl_udata_put_u32(udbuf, NFTNL_UDATA_SET_ELEM_FLAGS,
                                         expr->elem_flags))
                        memory_allocation_error();
        }
@@ -522,9 +522,9 @@ static int set_parse_udata_cb(const struct nftnl_udata *attr, void *data)
        uint8_t len = nftnl_udata_len(attr);
 
        switch (type) {
-       case UDATA_SET_KEYBYTEORDER:
-       case UDATA_SET_DATABYTEORDER:
-       case UDATA_SET_MERGE_ELEMENTS:
+       case NFTNL_UDATA_SET_KEYBYTEORDER:
+       case NFTNL_UDATA_SET_DATABYTEORDER:
+       case NFTNL_UDATA_SET_MERGE_ELEMENTS:
                if (len != sizeof(uint32_t))
                        return -1;
                break;
@@ -538,7 +538,7 @@ static int set_parse_udata_cb(const struct nftnl_udata *attr, void *data)
 struct set *netlink_delinearize_set(struct netlink_ctx *ctx,
                                    const struct nftnl_set *nls)
 {
-       const struct nftnl_udata *ud[UDATA_SET_MAX + 1] = {};
+       const struct nftnl_udata *ud[NFTNL_UDATA_SET_MAX + 1] = {};
        uint32_t flags, key, data, data_len, objtype = 0;
        enum byteorder keybyteorder = BYTEORDER_INVALID;
        enum byteorder databyteorder = BYTEORDER_INVALID;
@@ -555,15 +555,15 @@ struct set *netlink_delinearize_set(struct netlink_ctx *ctx,
                        return NULL;
                }
 
-               if (ud[UDATA_SET_KEYBYTEORDER])
-                       keybyteorder =
-                               nftnl_udata_get_u32(ud[UDATA_SET_KEYBYTEORDER]);
-               if (ud[UDATA_SET_DATABYTEORDER])
-                       databyteorder =
-                               nftnl_udata_get_u32(ud[UDATA_SET_DATABYTEORDER]);
-               if (ud[UDATA_SET_MERGE_ELEMENTS])
-                       automerge =
-                               nftnl_udata_get_u32(ud[UDATA_SET_MERGE_ELEMENTS]);
+#define GET_U32_UDATA(var, attr)                               \
+               if (ud[attr])                                   \
+                       var = nftnl_udata_get_u32(ud[attr])
+
+               GET_U32_UDATA(keybyteorder, NFTNL_UDATA_SET_KEYBYTEORDER);
+               GET_U32_UDATA(databyteorder, NFTNL_UDATA_SET_DATABYTEORDER);
+               GET_U32_UDATA(automerge, NFTNL_UDATA_SET_MERGE_ELEMENTS);
+
+#undef GET_U32_UDATA
        }
 
        key = nftnl_set_get_u32(nls, NFTNL_SET_KEY_TYPE);
@@ -712,11 +712,11 @@ static int set_elem_parse_udata_cb(const struct nftnl_udata *attr, void *data)
        uint8_t len = nftnl_udata_len(attr);
 
        switch (type) {
-       case UDATA_SET_ELEM_COMMENT:
+       case NFTNL_UDATA_SET_ELEM_COMMENT:
                if (value[len - 1] != '\0')
                        return -1;
                break;
-       case UDATA_SET_ELEM_FLAGS:
+       case NFTNL_UDATA_SET_ELEM_FLAGS:
                if (len != sizeof(uint32_t))
                        return -1;
                break;
@@ -730,7 +730,7 @@ static int set_elem_parse_udata_cb(const struct nftnl_udata *attr, void *data)
 static void set_elem_parse_udata(struct nftnl_set_elem *nlse,
                                 struct expr *expr)
 {
-       const struct nftnl_udata *ud[UDATA_SET_ELEM_MAX + 1] = {};
+       const struct nftnl_udata *ud[NFTNL_UDATA_SET_ELEM_MAX + 1] = {};
        const void *data;
        uint32_t len;
 
@@ -738,11 +738,12 @@ static void set_elem_parse_udata(struct nftnl_set_elem *nlse,
        if (nftnl_udata_parse(data, len, set_elem_parse_udata_cb, ud))
                return;
 
-       if (ud[UDATA_SET_ELEM_COMMENT])
+       if (ud[NFTNL_UDATA_SET_ELEM_COMMENT])
                expr->comment =
-                       xstrdup(nftnl_udata_get(ud[UDATA_SET_ELEM_COMMENT]));
-       if (ud[UDATA_SET_ELEM_FLAGS])
-               expr->elem_flags = nftnl_udata_get_u32(ud[UDATA_SET_ELEM_FLAGS]);
+                       xstrdup(nftnl_udata_get(ud[NFTNL_UDATA_SET_ELEM_COMMENT]));
+       if (ud[NFTNL_UDATA_SET_ELEM_FLAGS])
+               expr->elem_flags =
+                       nftnl_udata_get_u32(ud[NFTNL_UDATA_SET_ELEM_FLAGS]);
 }
 
 int netlink_delinearize_setelem(struct nftnl_set_elem *nlse,
index 40ab0256a7efe8c2ffb863b3a933ecfc3e66031e..2c9b0a32a932ed1e4856c745382429a4eb8e8226 100644 (file)
@@ -2575,7 +2575,7 @@ static void rule_parse_postprocess(struct netlink_parse_ctx *ctx, struct rule *r
        }
 }
 
-static int parse_udata_cb(const struct nftnl_udata *attr, void *data)
+static int parse_rule_udata_cb(const struct nftnl_udata *attr, void *data)
 {
        unsigned char *value = nftnl_udata_get(attr);
        uint8_t type = nftnl_udata_type(attr);
@@ -2583,7 +2583,7 @@ static int parse_udata_cb(const struct nftnl_udata *attr, void *data)
        const struct nftnl_udata **tb = data;
 
        switch (type) {
-       case UDATA_TYPE_COMMENT:
+       case NFTNL_UDATA_RULE_COMMENT:
                if (value[len - 1] != '\0')
                        return -1;
                break;
@@ -2594,17 +2594,24 @@ static int parse_udata_cb(const struct nftnl_udata *attr, void *data)
        return 0;
 }
 
-static char *udata_get_comment(const void *data, uint32_t data_len)
+static char *nftnl_rule_get_comment(const struct nftnl_rule *nlr)
 {
-       const struct nftnl_udata *tb[UDATA_TYPE_MAX + 1] = {};
+       const struct nftnl_udata *tb[NFTNL_UDATA_RULE_MAX + 1] = {};
+       const void *data;
+       uint32_t len;
 
-       if (nftnl_udata_parse(data, data_len, parse_udata_cb, tb) < 0)
+       if (!nftnl_rule_is_set(nlr, NFTNL_RULE_USERDATA))
                return NULL;
 
-       if (!tb[UDATA_TYPE_COMMENT])
+       data = nftnl_rule_get_data(nlr, NFTNL_RULE_USERDATA, &len);
+
+       if (nftnl_udata_parse(data, len, parse_rule_udata_cb, tb) < 0)
+               return NULL;
+
+       if (!tb[NFTNL_UDATA_RULE_COMMENT])
                return NULL;
 
-       return xstrdup(nftnl_udata_get(tb[UDATA_TYPE_COMMENT]));
+       return xstrdup(nftnl_udata_get(tb[NFTNL_UDATA_RULE_COMMENT]));
 }
 
 struct rule *netlink_delinearize_rule(struct netlink_ctx *ctx,
@@ -2630,13 +2637,7 @@ struct rule *netlink_delinearize_rule(struct netlink_ctx *ctx,
        pctx->table = table_lookup(&h, &ctx->nft->cache);
        assert(pctx->table != NULL);
 
-       if (nftnl_rule_is_set(nlr, NFTNL_RULE_USERDATA)) {
-               const void *data;
-               uint32_t len;
-
-               data = nftnl_rule_get_data(nlr, NFTNL_RULE_USERDATA, &len);
-               pctx->rule->comment = udata_get_comment(data, len);
-       }
+       pctx->rule->comment = nftnl_rule_get_comment(nlr);
 
        nftnl_expr_foreach(nlr, netlink_parse_rule_expr, pctx);
 
index df763544634ef2991b7d628a976e88cebd8ece14..2c6aa64d3ac1cb7403b77c576e38bb793900865b 100644 (file)
@@ -1432,7 +1432,7 @@ void netlink_linearize_rule(struct netlink_ctx *ctx, struct nftnl_rule *nlr,
                if (!udata)
                        memory_allocation_error();
 
-               if (!nftnl_udata_put_strz(udata, UDATA_TYPE_COMMENT,
+               if (!nftnl_udata_put_strz(udata, NFTNL_UDATA_RULE_COMMENT,
                                          rule->comment))
                        memory_allocation_error();
                nftnl_rule_set_data(nlr, NFTNL_RULE_USERDATA,
index 4a2a81cde6a7a1f4d39047ff7d29a0038133061d..9aea6526533294357a9fd9b76adaac9b1e6aa3cf 100644 (file)
@@ -28,6 +28,7 @@
 #include <netinet/icmp6.h>
 #include <libnftnl/common.h>
 #include <libnftnl/set.h>
+#include <libnftnl/udata.h>
 
 #include <rule.h>
 #include <statement.h>
@@ -2185,8 +2186,9 @@ ruleid_spec               :       chain_spec      handle_spec
 
 comment_spec           :       COMMENT         string
                        {
-                               if (strlen($2) > UDATA_COMMENT_MAXLEN) {
-                                       erec_queue(error(&@2, "comment too long, %d characters maximum allowed", UDATA_COMMENT_MAXLEN),
+                               if (strlen($2) > NFTNL_UDATA_COMMENT_MAXLEN) {
+                                       erec_queue(error(&@2, "comment too long, %d characters maximum allowed",
+                                                        NFTNL_UDATA_COMMENT_MAXLEN),
                                                   state->msgs);
                                        YYERROR;
                                }
index 4353e85a02c5527166a0e8866059c802adbc4b57..a21270a08c46c8af042c9285d9a063b3870b1af2 100644 (file)
@@ -13,6 +13,8 @@
 #include <inttypes.h>
 #include <arpa/inet.h>
 
+#include <libnftnl/udata.h>
+
 #include <rule.h>
 #include <expression.h>
 #include <gmputil.h>
@@ -562,7 +564,7 @@ static void set_insert_interval(struct expr *set, struct seg_tree *tree,
        if (ei->flags & EI_F_INTERVAL_END)
                expr->flags |= EXPR_F_INTERVAL_END;
        if (ei->flags & EI_F_INTERVAL_OPEN)
-               expr->elem_flags |= SET_ELEM_F_INTERVAL_OPEN;
+               expr->elem_flags |= NFTNL_SET_ELEM_F_INTERVAL_OPEN;
 
        compound_expr_add(set, expr);
 }