diff options
| author | Patrick McHardy <kaber@trash.net> | 2015-03-26 08:39:37 -0400 |
|---|---|---|
| committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2015-04-01 05:17:28 -0400 |
| commit | c3e1b005ed1cc068fc9d454a6e745830d55d251d (patch) | |
| tree | 8d0a0ecff6682b87f1c0811f52c8ad933ab64d2d /include | |
| parent | 761da2935d6e18d178582dbdf315a3a458555505 (diff) | |
netfilter: nf_tables: add set element timeout support
Add API support for set element timeouts. Elements can have a individual
timeout value specified, overriding the sets' default.
Two new extension types are used for timeouts - the timeout value and
the expiration time. The timeout value only exists if it differs from
the default value.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'include')
| -rw-r--r-- | include/net/netfilter/nf_tables.h | 20 | ||||
| -rw-r--r-- | include/uapi/linux/netfilter/nf_tables.h | 4 |
2 files changed, 24 insertions, 0 deletions
diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h index 8936803a2ad5..f2726c537248 100644 --- a/include/net/netfilter/nf_tables.h +++ b/include/net/netfilter/nf_tables.h | |||
| @@ -329,12 +329,16 @@ void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set, | |||
| 329 | * @NFT_SET_EXT_KEY: element key | 329 | * @NFT_SET_EXT_KEY: element key |
| 330 | * @NFT_SET_EXT_DATA: mapping data | 330 | * @NFT_SET_EXT_DATA: mapping data |
| 331 | * @NFT_SET_EXT_FLAGS: element flags | 331 | * @NFT_SET_EXT_FLAGS: element flags |
| 332 | * @NFT_SET_EXT_TIMEOUT: element timeout | ||
| 333 | * @NFT_SET_EXT_EXPIRATION: element expiration time | ||
| 332 | * @NFT_SET_EXT_NUM: number of extension types | 334 | * @NFT_SET_EXT_NUM: number of extension types |
| 333 | */ | 335 | */ |
| 334 | enum nft_set_extensions { | 336 | enum nft_set_extensions { |
| 335 | NFT_SET_EXT_KEY, | 337 | NFT_SET_EXT_KEY, |
| 336 | NFT_SET_EXT_DATA, | 338 | NFT_SET_EXT_DATA, |
| 337 | NFT_SET_EXT_FLAGS, | 339 | NFT_SET_EXT_FLAGS, |
| 340 | NFT_SET_EXT_TIMEOUT, | ||
| 341 | NFT_SET_EXT_EXPIRATION, | ||
| 338 | NFT_SET_EXT_NUM | 342 | NFT_SET_EXT_NUM |
| 339 | }; | 343 | }; |
| 340 | 344 | ||
| @@ -431,6 +435,22 @@ static inline u8 *nft_set_ext_flags(const struct nft_set_ext *ext) | |||
| 431 | return nft_set_ext(ext, NFT_SET_EXT_FLAGS); | 435 | return nft_set_ext(ext, NFT_SET_EXT_FLAGS); |
| 432 | } | 436 | } |
| 433 | 437 | ||
| 438 | static inline u64 *nft_set_ext_timeout(const struct nft_set_ext *ext) | ||
| 439 | { | ||
| 440 | return nft_set_ext(ext, NFT_SET_EXT_TIMEOUT); | ||
| 441 | } | ||
| 442 | |||
| 443 | static inline unsigned long *nft_set_ext_expiration(const struct nft_set_ext *ext) | ||
| 444 | { | ||
| 445 | return nft_set_ext(ext, NFT_SET_EXT_EXPIRATION); | ||
| 446 | } | ||
| 447 | |||
| 448 | static inline bool nft_set_elem_expired(const struct nft_set_ext *ext) | ||
| 449 | { | ||
| 450 | return nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION) && | ||
| 451 | time_is_before_eq_jiffies(*nft_set_ext_expiration(ext)); | ||
| 452 | } | ||
| 453 | |||
| 434 | static inline struct nft_set_ext *nft_set_elem_ext(const struct nft_set *set, | 454 | static inline struct nft_set_ext *nft_set_elem_ext(const struct nft_set *set, |
| 435 | void *elem) | 455 | void *elem) |
| 436 | { | 456 | { |
diff --git a/include/uapi/linux/netfilter/nf_tables.h b/include/uapi/linux/netfilter/nf_tables.h index 971d245e7378..83441cc4594b 100644 --- a/include/uapi/linux/netfilter/nf_tables.h +++ b/include/uapi/linux/netfilter/nf_tables.h | |||
| @@ -290,12 +290,16 @@ enum nft_set_elem_flags { | |||
| 290 | * @NFTA_SET_ELEM_KEY: key value (NLA_NESTED: nft_data) | 290 | * @NFTA_SET_ELEM_KEY: key value (NLA_NESTED: nft_data) |
| 291 | * @NFTA_SET_ELEM_DATA: data value of mapping (NLA_NESTED: nft_data_attributes) | 291 | * @NFTA_SET_ELEM_DATA: data value of mapping (NLA_NESTED: nft_data_attributes) |
| 292 | * @NFTA_SET_ELEM_FLAGS: bitmask of nft_set_elem_flags (NLA_U32) | 292 | * @NFTA_SET_ELEM_FLAGS: bitmask of nft_set_elem_flags (NLA_U32) |
| 293 | * @NFTA_SET_ELEM_TIMEOUT: timeout value (NLA_U64) | ||
| 294 | * @NFTA_SET_ELEM_EXPIRATION: expiration time (NLA_U64) | ||
| 293 | */ | 295 | */ |
| 294 | enum nft_set_elem_attributes { | 296 | enum nft_set_elem_attributes { |
| 295 | NFTA_SET_ELEM_UNSPEC, | 297 | NFTA_SET_ELEM_UNSPEC, |
| 296 | NFTA_SET_ELEM_KEY, | 298 | NFTA_SET_ELEM_KEY, |
| 297 | NFTA_SET_ELEM_DATA, | 299 | NFTA_SET_ELEM_DATA, |
| 298 | NFTA_SET_ELEM_FLAGS, | 300 | NFTA_SET_ELEM_FLAGS, |
| 301 | NFTA_SET_ELEM_TIMEOUT, | ||
| 302 | NFTA_SET_ELEM_EXPIRATION, | ||
| 299 | __NFTA_SET_ELEM_MAX | 303 | __NFTA_SET_ELEM_MAX |
| 300 | }; | 304 | }; |
| 301 | #define NFTA_SET_ELEM_MAX (__NFTA_SET_ELEM_MAX - 1) | 305 | #define NFTA_SET_ELEM_MAX (__NFTA_SET_ELEM_MAX - 1) |
