diff options
-rw-r--r-- | src/expr.c | 7 | ||||
-rw-r--r-- | src/expr_ops.c | 5 |
2 files changed, 10 insertions, 2 deletions
@@ -213,13 +213,15 @@ bool nftnl_expr_cmp(const struct nftnl_expr *e1, const struct nftnl_expr *e2) } EXPORT_SYMBOL(nftnl_expr_cmp); -void -nftnl_expr_build_payload(struct nlmsghdr *nlh, struct nftnl_expr *expr) +void nftnl_expr_build_payload(struct nlmsghdr *nlh, struct nftnl_expr *expr) { struct nlattr *nest; mnl_attr_put_strz(nlh, NFTA_EXPR_NAME, expr->ops->name); + if (!expr->ops->build) + return; + nest = mnl_attr_nest_start(nlh, NFTA_EXPR_DATA); expr->ops->build(nlh, expr); mnl_attr_nest_end(nlh, nest); @@ -261,6 +263,7 @@ struct nftnl_expr *nftnl_expr_parse(struct nlattr *attr) goto err1; if (tb[NFTA_EXPR_DATA] && + expr->ops->parse && expr->ops->parse(expr, tb[NFTA_EXPR_DATA]) < 0) goto err2; diff --git a/src/expr_ops.c b/src/expr_ops.c index 55748d6..96b1f8d 100644 --- a/src/expr_ops.c +++ b/src/expr_ops.c @@ -31,6 +31,10 @@ extern struct expr_ops expr_ops_target; extern struct expr_ops expr_ops_dynset; extern struct expr_ops expr_ops_hash; +static struct expr_ops expr_ops_notrack = { + .name = "notrack", +}; + static struct expr_ops *expr_ops[] = { &expr_ops_bitwise, &expr_ops_byteorder, @@ -49,6 +53,7 @@ static struct expr_ops *expr_ops[] = { &expr_ops_meta, &expr_ops_ng, &expr_ops_nat, + &expr_ops_notrack, &expr_ops_payload, &expr_ops_range, &expr_ops_redir, |