Skip to content

Commit f25ad2e

Browse files
kaberummakynes
authored andcommitted
netfilter: nf_tables: prepare for expressions associated to set elements
Preparation to attach expressions to set elements: add a set extension type to hold an expression and dump the expression information with the set element. Signed-off-by: Patrick McHardy <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent 0b2d8a7 commit f25ad2e

File tree

3 files changed

+18
-0
lines changed

3 files changed

+18
-0
lines changed

include/net/netfilter/nf_tables.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,7 @@ void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set,
371371
* @NFT_SET_EXT_TIMEOUT: element timeout
372372
* @NFT_SET_EXT_EXPIRATION: element expiration time
373373
* @NFT_SET_EXT_USERDATA: user data associated with the element
374+
* @NFT_SET_EXT_EXPR: expression assiociated with the element
374375
* @NFT_SET_EXT_NUM: number of extension types
375376
*/
376377
enum nft_set_extensions {
@@ -380,6 +381,7 @@ enum nft_set_extensions {
380381
NFT_SET_EXT_TIMEOUT,
381382
NFT_SET_EXT_EXPIRATION,
382383
NFT_SET_EXT_USERDATA,
384+
NFT_SET_EXT_EXPR,
383385
NFT_SET_EXT_NUM
384386
};
385387

@@ -491,6 +493,11 @@ static inline struct nft_userdata *nft_set_ext_userdata(const struct nft_set_ext
491493
return nft_set_ext(ext, NFT_SET_EXT_USERDATA);
492494
}
493495

496+
static inline struct nft_expr *nft_set_ext_expr(const struct nft_set_ext *ext)
497+
{
498+
return nft_set_ext(ext, NFT_SET_EXT_EXPR);
499+
}
500+
494501
static inline bool nft_set_elem_expired(const struct nft_set_ext *ext)
495502
{
496503
return nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION) &&

include/uapi/linux/netfilter/nf_tables.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ enum nft_set_elem_flags {
322322
* @NFTA_SET_ELEM_TIMEOUT: timeout value (NLA_U64)
323323
* @NFTA_SET_ELEM_EXPIRATION: expiration time (NLA_U64)
324324
* @NFTA_SET_ELEM_USERDATA: user data (NLA_BINARY)
325+
* @NFTA_SET_ELEM_EXPR: expression (NLA_NESTED: nft_expr_attributes)
325326
*/
326327
enum nft_set_elem_attributes {
327328
NFTA_SET_ELEM_UNSPEC,
@@ -331,6 +332,7 @@ enum nft_set_elem_attributes {
331332
NFTA_SET_ELEM_TIMEOUT,
332333
NFTA_SET_ELEM_EXPIRATION,
333334
NFTA_SET_ELEM_USERDATA,
335+
NFTA_SET_ELEM_EXPR,
334336
__NFTA_SET_ELEM_MAX
335337
};
336338
#define NFTA_SET_ELEM_MAX (__NFTA_SET_ELEM_MAX - 1)

net/netfilter/nf_tables_api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2904,6 +2904,9 @@ const struct nft_set_ext_type nft_set_ext_types[] = {
29042904
[NFT_SET_EXT_DATA] = {
29052905
.align = __alignof__(u32),
29062906
},
2907+
[NFT_SET_EXT_EXPR] = {
2908+
.align = __alignof__(struct nft_expr),
2909+
},
29072910
[NFT_SET_EXT_FLAGS] = {
29082911
.len = sizeof(u8),
29092912
.align = __alignof__(u8),
@@ -2990,6 +2993,10 @@ static int nf_tables_fill_setelem(struct sk_buff *skb,
29902993
set->dlen) < 0)
29912994
goto nla_put_failure;
29922995

2996+
if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPR) &&
2997+
nft_expr_dump(skb, NFTA_SET_ELEM_EXPR, nft_set_ext_expr(ext)) < 0)
2998+
goto nla_put_failure;
2999+
29933000
if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) &&
29943001
nla_put_be32(skb, NFTA_SET_ELEM_FLAGS,
29953002
htonl(*nft_set_ext_flags(ext))))
@@ -3276,6 +3283,8 @@ void nft_set_elem_destroy(const struct nft_set *set, void *elem)
32763283
nft_data_uninit(nft_set_ext_key(ext), NFT_DATA_VALUE);
32773284
if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
32783285
nft_data_uninit(nft_set_ext_data(ext), set->dtype);
3286+
if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPR))
3287+
nf_tables_expr_destroy(NULL, nft_set_ext_expr(ext));
32793288

32803289
kfree(elem);
32813290
}

0 commit comments

Comments
 (0)