diff options
author | Patrick McHardy <kaber@trash.net> | 2015-04-11 05:46:39 -0400 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2015-04-13 14:12:31 -0400 |
commit | f25ad2e907f110378159fe5e088aa13176faaa5b (patch) | |
tree | 9f3f8353dc536847f3d95cc58cbc0d9ae183fe0c | |
parent | 0b2d8a7b638b5034d2d68f6add8af94daaa1d4cd (diff) |
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 <kaber@trash.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r-- | include/net/netfilter/nf_tables.h | 7 | ||||
-rw-r--r-- | include/uapi/linux/netfilter/nf_tables.h | 2 | ||||
-rw-r--r-- | net/netfilter/nf_tables_api.c | 9 |
3 files changed, 18 insertions, 0 deletions
diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h index e21623cb7b20..d45a871b3da6 100644 --- a/include/net/netfilter/nf_tables.h +++ b/include/net/netfilter/nf_tables.h | |||
@@ -371,6 +371,7 @@ void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set, | |||
371 | * @NFT_SET_EXT_TIMEOUT: element timeout | 371 | * @NFT_SET_EXT_TIMEOUT: element timeout |
372 | * @NFT_SET_EXT_EXPIRATION: element expiration time | 372 | * @NFT_SET_EXT_EXPIRATION: element expiration time |
373 | * @NFT_SET_EXT_USERDATA: user data associated with the element | 373 | * @NFT_SET_EXT_USERDATA: user data associated with the element |
374 | * @NFT_SET_EXT_EXPR: expression assiociated with the element | ||
374 | * @NFT_SET_EXT_NUM: number of extension types | 375 | * @NFT_SET_EXT_NUM: number of extension types |
375 | */ | 376 | */ |
376 | enum nft_set_extensions { | 377 | enum nft_set_extensions { |
@@ -380,6 +381,7 @@ enum nft_set_extensions { | |||
380 | NFT_SET_EXT_TIMEOUT, | 381 | NFT_SET_EXT_TIMEOUT, |
381 | NFT_SET_EXT_EXPIRATION, | 382 | NFT_SET_EXT_EXPIRATION, |
382 | NFT_SET_EXT_USERDATA, | 383 | NFT_SET_EXT_USERDATA, |
384 | NFT_SET_EXT_EXPR, | ||
383 | NFT_SET_EXT_NUM | 385 | NFT_SET_EXT_NUM |
384 | }; | 386 | }; |
385 | 387 | ||
@@ -491,6 +493,11 @@ static inline struct nft_userdata *nft_set_ext_userdata(const struct nft_set_ext | |||
491 | return nft_set_ext(ext, NFT_SET_EXT_USERDATA); | 493 | return nft_set_ext(ext, NFT_SET_EXT_USERDATA); |
492 | } | 494 | } |
493 | 495 | ||
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 | |||
494 | static inline bool nft_set_elem_expired(const struct nft_set_ext *ext) | 501 | static inline bool nft_set_elem_expired(const struct nft_set_ext *ext) |
495 | { | 502 | { |
496 | return nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION) && | 503 | return nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION) && |
diff --git a/include/uapi/linux/netfilter/nf_tables.h b/include/uapi/linux/netfilter/nf_tables.h index be8584c95297..f9c5af22a6af 100644 --- a/include/uapi/linux/netfilter/nf_tables.h +++ b/include/uapi/linux/netfilter/nf_tables.h | |||
@@ -322,6 +322,7 @@ enum nft_set_elem_flags { | |||
322 | * @NFTA_SET_ELEM_TIMEOUT: timeout value (NLA_U64) | 322 | * @NFTA_SET_ELEM_TIMEOUT: timeout value (NLA_U64) |
323 | * @NFTA_SET_ELEM_EXPIRATION: expiration time (NLA_U64) | 323 | * @NFTA_SET_ELEM_EXPIRATION: expiration time (NLA_U64) |
324 | * @NFTA_SET_ELEM_USERDATA: user data (NLA_BINARY) | 324 | * @NFTA_SET_ELEM_USERDATA: user data (NLA_BINARY) |
325 | * @NFTA_SET_ELEM_EXPR: expression (NLA_NESTED: nft_expr_attributes) | ||
325 | */ | 326 | */ |
326 | enum nft_set_elem_attributes { | 327 | enum nft_set_elem_attributes { |
327 | NFTA_SET_ELEM_UNSPEC, | 328 | NFTA_SET_ELEM_UNSPEC, |
@@ -331,6 +332,7 @@ enum nft_set_elem_attributes { | |||
331 | NFTA_SET_ELEM_TIMEOUT, | 332 | NFTA_SET_ELEM_TIMEOUT, |
332 | NFTA_SET_ELEM_EXPIRATION, | 333 | NFTA_SET_ELEM_EXPIRATION, |
333 | NFTA_SET_ELEM_USERDATA, | 334 | NFTA_SET_ELEM_USERDATA, |
335 | NFTA_SET_ELEM_EXPR, | ||
334 | __NFTA_SET_ELEM_MAX | 336 | __NFTA_SET_ELEM_MAX |
335 | }; | 337 | }; |
336 | #define NFTA_SET_ELEM_MAX (__NFTA_SET_ELEM_MAX - 1) | 338 | #define NFTA_SET_ELEM_MAX (__NFTA_SET_ELEM_MAX - 1) |
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index e97bee59fe08..8830811550ec 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c | |||
@@ -2904,6 +2904,9 @@ const struct nft_set_ext_type nft_set_ext_types[] = { | |||
2904 | [NFT_SET_EXT_DATA] = { | 2904 | [NFT_SET_EXT_DATA] = { |
2905 | .align = __alignof__(u32), | 2905 | .align = __alignof__(u32), |
2906 | }, | 2906 | }, |
2907 | [NFT_SET_EXT_EXPR] = { | ||
2908 | .align = __alignof__(struct nft_expr), | ||
2909 | }, | ||
2907 | [NFT_SET_EXT_FLAGS] = { | 2910 | [NFT_SET_EXT_FLAGS] = { |
2908 | .len = sizeof(u8), | 2911 | .len = sizeof(u8), |
2909 | .align = __alignof__(u8), | 2912 | .align = __alignof__(u8), |
@@ -2990,6 +2993,10 @@ static int nf_tables_fill_setelem(struct sk_buff *skb, | |||
2990 | set->dlen) < 0) | 2993 | set->dlen) < 0) |
2991 | goto nla_put_failure; | 2994 | goto nla_put_failure; |
2992 | 2995 | ||
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 | |||
2993 | if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) && | 3000 | if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) && |
2994 | nla_put_be32(skb, NFTA_SET_ELEM_FLAGS, | 3001 | nla_put_be32(skb, NFTA_SET_ELEM_FLAGS, |
2995 | htonl(*nft_set_ext_flags(ext)))) | 3002 | htonl(*nft_set_ext_flags(ext)))) |
@@ -3276,6 +3283,8 @@ void nft_set_elem_destroy(const struct nft_set *set, void *elem) | |||
3276 | nft_data_uninit(nft_set_ext_key(ext), NFT_DATA_VALUE); | 3283 | nft_data_uninit(nft_set_ext_key(ext), NFT_DATA_VALUE); |
3277 | if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA)) | 3284 | if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA)) |
3278 | nft_data_uninit(nft_set_ext_data(ext), set->dtype); | 3285 | 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)); | ||
3279 | 3288 | ||
3280 | kfree(elem); | 3289 | kfree(elem); |
3281 | } | 3290 | } |