@@ -2216,6 +2216,8 @@ static const struct nla_policy nft_set_policy[NFTA_SET_MAX + 1] = {
22162216 [NFTA_SET_POLICY ] = { .type = NLA_U32 },
22172217 [NFTA_SET_DESC ] = { .type = NLA_NESTED },
22182218 [NFTA_SET_ID ] = { .type = NLA_U32 },
2219+ [NFTA_SET_TIMEOUT ] = { .type = NLA_U64 },
2220+ [NFTA_SET_GC_INTERVAL ] = { .type = NLA_U32 },
22192221};
22202222
22212223static const struct nla_policy nft_set_desc_policy [NFTA_SET_DESC_MAX + 1 ] = {
@@ -2366,6 +2368,13 @@ static int nf_tables_fill_set(struct sk_buff *skb, const struct nft_ctx *ctx,
23662368 goto nla_put_failure ;
23672369 }
23682370
2371+ if (set -> timeout &&
2372+ nla_put_be64 (skb , NFTA_SET_TIMEOUT , cpu_to_be64 (set -> timeout )))
2373+ goto nla_put_failure ;
2374+ if (set -> gc_int &&
2375+ nla_put_be32 (skb , NFTA_SET_GC_INTERVAL , htonl (set -> gc_int )))
2376+ goto nla_put_failure ;
2377+
23692378 if (set -> policy != NFT_SET_POL_PERFORMANCE ) {
23702379 if (nla_put_be32 (skb , NFTA_SET_POLICY , htonl (set -> policy )))
23712380 goto nla_put_failure ;
@@ -2578,7 +2587,8 @@ static int nf_tables_newset(struct sock *nlsk, struct sk_buff *skb,
25782587 char name [IFNAMSIZ ];
25792588 unsigned int size ;
25802589 bool create ;
2581- u32 ktype , dtype , flags , policy ;
2590+ u64 timeout ;
2591+ u32 ktype , dtype , flags , policy , gc_int ;
25822592 struct nft_set_desc desc ;
25832593 int err ;
25842594
@@ -2605,7 +2615,8 @@ static int nf_tables_newset(struct sock *nlsk, struct sk_buff *skb,
26052615 if (nla [NFTA_SET_FLAGS ] != NULL ) {
26062616 flags = ntohl (nla_get_be32 (nla [NFTA_SET_FLAGS ]));
26072617 if (flags & ~(NFT_SET_ANONYMOUS | NFT_SET_CONSTANT |
2608- NFT_SET_INTERVAL | NFT_SET_MAP ))
2618+ NFT_SET_INTERVAL | NFT_SET_MAP |
2619+ NFT_SET_TIMEOUT ))
26092620 return - EINVAL ;
26102621 }
26112622
@@ -2631,6 +2642,19 @@ static int nf_tables_newset(struct sock *nlsk, struct sk_buff *skb,
26312642 } else if (flags & NFT_SET_MAP )
26322643 return - EINVAL ;
26332644
2645+ timeout = 0 ;
2646+ if (nla [NFTA_SET_TIMEOUT ] != NULL ) {
2647+ if (!(flags & NFT_SET_TIMEOUT ))
2648+ return - EINVAL ;
2649+ timeout = be64_to_cpu (nla_get_be64 (nla [NFTA_SET_TIMEOUT ]));
2650+ }
2651+ gc_int = 0 ;
2652+ if (nla [NFTA_SET_GC_INTERVAL ] != NULL ) {
2653+ if (!(flags & NFT_SET_TIMEOUT ))
2654+ return - EINVAL ;
2655+ gc_int = ntohl (nla_get_be32 (nla [NFTA_SET_GC_INTERVAL ]));
2656+ }
2657+
26342658 policy = NFT_SET_POL_PERFORMANCE ;
26352659 if (nla [NFTA_SET_POLICY ] != NULL )
26362660 policy = ntohl (nla_get_be32 (nla [NFTA_SET_POLICY ]));
@@ -2699,6 +2723,8 @@ static int nf_tables_newset(struct sock *nlsk, struct sk_buff *skb,
26992723 set -> flags = flags ;
27002724 set -> size = desc .size ;
27012725 set -> policy = policy ;
2726+ set -> timeout = timeout ;
2727+ set -> gc_int = gc_int ;
27022728
27032729 err = ops -> init (set , & desc , nla );
27042730 if (err < 0 )
0 commit comments