Skip to content

Commit e6d8eca

Browse files
FarKummakynes
authored andcommitted
netfilter: nf_tables: Add new attributes into nft_set to store user data.
User data is stored at after 'nft_set_ops' private data into 'data[]' flexible array. The field 'udata' points to user data and 'udlen' stores its length. Add new flag NFTA_SET_USERDATA. Signed-off-by: Carlos Falgueras García <carlosfg@riseup.net> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
1 parent eb07595 commit e6d8eca

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

include/net/netfilter/nf_tables.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,8 @@ void nft_unregister_set(struct nft_set_ops *ops);
291291
* @timeout: default timeout value in msecs
292292
* @gc_int: garbage collection interval in msecs
293293
* @policy: set parameterization (see enum nft_set_policies)
294+
* @udlen: user data length
295+
* @udata: user data
294296
* @ops: set ops
295297
* @pnet: network namespace
296298
* @flags: set flags
@@ -310,6 +312,8 @@ struct nft_set {
310312
u64 timeout;
311313
u32 gc_int;
312314
u16 policy;
315+
u16 udlen;
316+
unsigned char *udata;
313317
/* runtime data below here */
314318
const struct nft_set_ops *ops ____cacheline_aligned;
315319
possible_net_t pnet;

include/uapi/linux/netfilter/nf_tables.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ enum nft_set_desc_attributes {
291291
* @NFTA_SET_ID: uniquely identifies a set in a transaction (NLA_U32)
292292
* @NFTA_SET_TIMEOUT: default timeout value (NLA_U64)
293293
* @NFTA_SET_GC_INTERVAL: garbage collection interval (NLA_U32)
294+
* @NFTA_SET_USERDATA: user data (NLA_BINARY)
294295
*/
295296
enum nft_set_attributes {
296297
NFTA_SET_UNSPEC,
@@ -306,6 +307,7 @@ enum nft_set_attributes {
306307
NFTA_SET_ID,
307308
NFTA_SET_TIMEOUT,
308309
NFTA_SET_GC_INTERVAL,
310+
NFTA_SET_USERDATA,
309311
__NFTA_SET_MAX
310312
};
311313
#define NFTA_SET_MAX (__NFTA_SET_MAX - 1)

net/netfilter/nf_tables_api.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2323,6 +2323,8 @@ static const struct nla_policy nft_set_policy[NFTA_SET_MAX + 1] = {
23232323
[NFTA_SET_ID] = { .type = NLA_U32 },
23242324
[NFTA_SET_TIMEOUT] = { .type = NLA_U64 },
23252325
[NFTA_SET_GC_INTERVAL] = { .type = NLA_U32 },
2326+
[NFTA_SET_USERDATA] = { .type = NLA_BINARY,
2327+
.len = NFT_USERDATA_MAXLEN },
23262328
};
23272329

23282330
static const struct nla_policy nft_set_desc_policy[NFTA_SET_DESC_MAX + 1] = {
@@ -2482,6 +2484,9 @@ static int nf_tables_fill_set(struct sk_buff *skb, const struct nft_ctx *ctx,
24822484
goto nla_put_failure;
24832485
}
24842486

2487+
if (nla_put(skb, NFTA_SET_USERDATA, set->udlen, set->udata))
2488+
goto nla_put_failure;
2489+
24852490
desc = nla_nest_start(skb, NFTA_SET_DESC);
24862491
if (desc == NULL)
24872492
goto nla_put_failure;
@@ -2691,6 +2696,8 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
26912696
u64 timeout;
26922697
u32 ktype, dtype, flags, policy, gc_int;
26932698
struct nft_set_desc desc;
2699+
unsigned char *udata;
2700+
u16 udlen;
26942701
int err;
26952702

26962703
if (nla[NFTA_SET_TABLE] == NULL ||
@@ -2803,12 +2810,16 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
28032810
if (IS_ERR(ops))
28042811
return PTR_ERR(ops);
28052812

2813+
udlen = 0;
2814+
if (nla[NFTA_SET_USERDATA])
2815+
udlen = nla_len(nla[NFTA_SET_USERDATA]);
2816+
28062817
size = 0;
28072818
if (ops->privsize != NULL)
28082819
size = ops->privsize(nla);
28092820

28102821
err = -ENOMEM;
2811-
set = kzalloc(sizeof(*set) + size, GFP_KERNEL);
2822+
set = kzalloc(sizeof(*set) + size + udlen, GFP_KERNEL);
28122823
if (set == NULL)
28132824
goto err1;
28142825

@@ -2817,6 +2828,12 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
28172828
if (err < 0)
28182829
goto err2;
28192830

2831+
udata = NULL;
2832+
if (udlen) {
2833+
udata = set->data + size;
2834+
nla_memcpy(udata, nla[NFTA_SET_USERDATA], udlen);
2835+
}
2836+
28202837
INIT_LIST_HEAD(&set->bindings);
28212838
write_pnet(&set->pnet, net);
28222839
set->ops = ops;
@@ -2827,6 +2844,8 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
28272844
set->flags = flags;
28282845
set->size = desc.size;
28292846
set->policy = policy;
2847+
set->udlen = udlen;
2848+
set->udata = udata;
28302849
set->timeout = timeout;
28312850
set->gc_int = gc_int;
28322851

0 commit comments

Comments
 (0)