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 | } |
