]> git.ipfire.org Git - thirdparty/libnftnl.git/commitdiff
dynset: add NFTNL_EXPR_DYNSET_FLAGS
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 13 Jan 2021 15:27:50 +0000 (16:27 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 13 Jan 2021 15:30:12 +0000 (16:30 +0100)
This patch adds support for the dynset flags.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/libnftnl/expr.h
src/expr/dynset.c

index 13c55e70b743b89353f0502025f060f577047062..8e90a6ae60a32bd7434f983bc92ecf1f37393aa8 100644 (file)
@@ -174,6 +174,7 @@ enum {
        NFTNL_EXPR_DYNSET_SET_ID,
        NFTNL_EXPR_DYNSET_EXPR,
        NFTNL_EXPR_DYNSET_EXPRESSIONS,
+       NFTNL_EXPR_DYNSET_FLAGS,
 };
 
 enum {
index f349a17a870192ace3f921daaf638165b4e1398c..a9b11f27e819b3ef39f0b29bcd971af41cf13747 100644 (file)
@@ -29,6 +29,7 @@ struct nftnl_expr_dynset {
        struct list_head        expr_list;
        char                    *set_name;
        uint32_t                set_id;
+       uint32_t                dynset_flags;
 };
 
 static int
@@ -66,6 +67,9 @@ nftnl_expr_dynset_set(struct nftnl_expr *e, uint16_t type,
                expr = (void *)data;
                list_add(&expr->head, &dynset->expr_list);
                break;
+       case NFTNL_EXPR_DYNSET_FLAGS:
+               memcpy(&dynset->dynset_flags, data, sizeof(dynset->dynset_flags));
+               break;
        default:
                return -1;
        }
@@ -102,6 +106,9 @@ nftnl_expr_dynset_get(const struct nftnl_expr *e, uint16_t type,
                list_for_each_entry(expr, &dynset->expr_list, head)
                        break;
                return expr;
+       case NFTNL_EXPR_DYNSET_FLAGS:
+               *data_len = sizeof(dynset->dynset_flags);
+               return &dynset->dynset_flags;
        }
        return NULL;
 }
@@ -119,6 +126,7 @@ static int nftnl_expr_dynset_cb(const struct nlattr *attr, void *data)
        case NFTA_DYNSET_SREG_DATA:
        case NFTA_DYNSET_SET_ID:
        case NFTA_DYNSET_OP:
+       case NFTA_DYNSET_FLAGS:
                if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
                        abi_breakage();
                break;
@@ -182,6 +190,9 @@ nftnl_expr_dynset_build(struct nlmsghdr *nlh, const struct nftnl_expr *e)
                        mnl_attr_nest_end(nlh, nest1);
                }
        }
+       if (e->flags & (1 << NFTNL_EXPR_DYNSET_FLAGS))
+               mnl_attr_put_u32(nlh, NFTA_DYNSET_FLAGS,
+                                htonl(dynset->dynset_flags));
 }
 
 EXPORT_SYMBOL(nftnl_expr_add_expr);
@@ -270,6 +281,10 @@ nftnl_expr_dynset_parse(struct nftnl_expr *e, struct nlattr *attr)
                }
                e->flags |= (1 << NFTNL_EXPR_DYNSET_EXPRESSIONS);
        }
+       if (tb[NFTA_DYNSET_FLAGS]) {
+               dynset->dynset_flags = ntohl(mnl_attr_get_u32(tb[NFTA_DYNSET_FLAGS]));
+               e->flags |= (1 << NFTNL_EXPR_DYNSET_FLAGS);
+       }
 
        return ret;
 out_dynset_expr: