Skip to content

Commit 0b2d8a7

Browse files
kaberummakynes
authored andcommitted
netfilter: nf_tables: add helper functions for expression handling
Add helper functions for initializing, cloning, dumping and destroying a single expression that is not part of a rule. Signed-off-by: Patrick McHardy <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent 24477e5 commit 0b2d8a7

File tree

2 files changed

+64
-5
lines changed

2 files changed

+64
-5
lines changed

include/net/netfilter/nf_tables.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef _NET_NF_TABLES_H
22
#define _NET_NF_TABLES_H
33

4+
#include <linux/module.h>
45
#include <linux/list.h>
56
#include <linux/netfilter.h>
67
#include <linux/netfilter/nfnetlink.h>
@@ -641,6 +642,18 @@ static inline void *nft_expr_priv(const struct nft_expr *expr)
641642
return (void *)expr->data;
642643
}
643644

645+
struct nft_expr *nft_expr_init(const struct nft_ctx *ctx,
646+
const struct nlattr *nla);
647+
void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr);
648+
int nft_expr_dump(struct sk_buff *skb, unsigned int attr,
649+
const struct nft_expr *expr);
650+
651+
static inline void nft_expr_clone(struct nft_expr *dst, struct nft_expr *src)
652+
{
653+
__module_get(src->ops->type->owner);
654+
memcpy(dst, src, src->ops->size);
655+
}
656+
644657
/**
645658
* struct nft_rule - nf_tables rule
646659
*

net/netfilter/nf_tables_api.c

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1545,6 +1545,23 @@ static int nf_tables_fill_expr_info(struct sk_buff *skb,
15451545
return -1;
15461546
};
15471547

1548+
int nft_expr_dump(struct sk_buff *skb, unsigned int attr,
1549+
const struct nft_expr *expr)
1550+
{
1551+
struct nlattr *nest;
1552+
1553+
nest = nla_nest_start(skb, attr);
1554+
if (!nest)
1555+
goto nla_put_failure;
1556+
if (nf_tables_fill_expr_info(skb, expr) < 0)
1557+
goto nla_put_failure;
1558+
nla_nest_end(skb, nest);
1559+
return 0;
1560+
1561+
nla_put_failure:
1562+
return -1;
1563+
}
1564+
15481565
struct nft_expr_info {
15491566
const struct nft_expr_ops *ops;
15501567
struct nlattr *tb[NFT_EXPR_MAXATTR + 1];
@@ -1622,6 +1639,39 @@ static void nf_tables_expr_destroy(const struct nft_ctx *ctx,
16221639
module_put(expr->ops->type->owner);
16231640
}
16241641

1642+
struct nft_expr *nft_expr_init(const struct nft_ctx *ctx,
1643+
const struct nlattr *nla)
1644+
{
1645+
struct nft_expr_info info;
1646+
struct nft_expr *expr;
1647+
int err;
1648+
1649+
err = nf_tables_expr_parse(ctx, nla, &info);
1650+
if (err < 0)
1651+
goto err1;
1652+
1653+
err = -ENOMEM;
1654+
expr = kzalloc(info.ops->size, GFP_KERNEL);
1655+
if (expr == NULL)
1656+
goto err2;
1657+
1658+
err = nf_tables_newexpr(ctx, &info, expr);
1659+
if (err < 0)
1660+
goto err2;
1661+
1662+
return expr;
1663+
err2:
1664+
module_put(info.ops->type->owner);
1665+
err1:
1666+
return ERR_PTR(err);
1667+
}
1668+
1669+
void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr)
1670+
{
1671+
nf_tables_expr_destroy(ctx, expr);
1672+
kfree(expr);
1673+
}
1674+
16251675
/*
16261676
* Rules
16271677
*/
@@ -1703,12 +1753,8 @@ static int nf_tables_fill_rule_info(struct sk_buff *skb, struct net *net,
17031753
if (list == NULL)
17041754
goto nla_put_failure;
17051755
nft_rule_for_each_expr(expr, next, rule) {
1706-
struct nlattr *elem = nla_nest_start(skb, NFTA_LIST_ELEM);
1707-
if (elem == NULL)
1708-
goto nla_put_failure;
1709-
if (nf_tables_fill_expr_info(skb, expr) < 0)
1756+
if (nft_expr_dump(skb, NFTA_LIST_ELEM, expr) < 0)
17101757
goto nla_put_failure;
1711-
nla_nest_end(skb, elem);
17121758
}
17131759
nla_nest_end(skb, list);
17141760

0 commit comments

Comments
 (0)