aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2015-04-11 05:46:39 -0400
committerPablo Neira Ayuso <pablo@netfilter.org>2015-04-13 14:12:31 -0400
commitf25ad2e907f110378159fe5e088aa13176faaa5b (patch)
tree9f3f8353dc536847f3d95cc58cbc0d9ae183fe0c
parent0b2d8a7b638b5034d2d68f6add8af94daaa1d4cd (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.h7
-rw-r--r--include/uapi/linux/netfilter/nf_tables.h2
-rw-r--r--net/netfilter/nf_tables_api.c9
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 */
376enum nft_set_extensions { 377enum 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
496static 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
494static inline bool nft_set_elem_expired(const struct nft_set_ext *ext) 501static 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 */
326enum nft_set_elem_attributes { 327enum 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}