|
@@ -298,7 +298,7 @@ static int nft_delrule_by_chain(struct nft_ctx *ctx)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int nft_trans_set_add(struct nft_ctx *ctx, int msg_type,
|
|
|
+static int nft_trans_set_add(const struct nft_ctx *ctx, int msg_type,
|
|
|
struct nft_set *set)
|
|
|
{
|
|
|
struct nft_trans *trans;
|
|
@@ -318,7 +318,7 @@ static int nft_trans_set_add(struct nft_ctx *ctx, int msg_type,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int nft_delset(struct nft_ctx *ctx, struct nft_set *set)
|
|
|
+static int nft_delset(const struct nft_ctx *ctx, struct nft_set *set)
|
|
|
{
|
|
|
int err;
|
|
|
|
|
@@ -3567,13 +3567,6 @@ static void nft_set_destroy(struct nft_set *set)
|
|
|
kvfree(set);
|
|
|
}
|
|
|
|
|
|
-static void nf_tables_set_destroy(const struct nft_ctx *ctx, struct nft_set *set)
|
|
|
-{
|
|
|
- list_del_rcu(&set->list);
|
|
|
- nf_tables_set_notify(ctx, set, NFT_MSG_DELSET, GFP_ATOMIC);
|
|
|
- nft_set_destroy(set);
|
|
|
-}
|
|
|
-
|
|
|
static int nf_tables_delset(struct net *net, struct sock *nlsk,
|
|
|
struct sk_buff *skb, const struct nlmsghdr *nlh,
|
|
|
const struct nlattr * const nla[],
|
|
@@ -3668,17 +3661,38 @@ bind:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(nf_tables_bind_set);
|
|
|
|
|
|
-void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set,
|
|
|
+void nf_tables_rebind_set(const struct nft_ctx *ctx, struct nft_set *set,
|
|
|
struct nft_set_binding *binding)
|
|
|
+{
|
|
|
+ if (list_empty(&set->bindings) && nft_set_is_anonymous(set) &&
|
|
|
+ nft_is_active(ctx->net, set))
|
|
|
+ list_add_tail_rcu(&set->list, &ctx->table->sets);
|
|
|
+
|
|
|
+ list_add_tail_rcu(&binding->list, &set->bindings);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(nf_tables_rebind_set);
|
|
|
+
|
|
|
+void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set,
|
|
|
+ struct nft_set_binding *binding)
|
|
|
{
|
|
|
list_del_rcu(&binding->list);
|
|
|
|
|
|
if (list_empty(&set->bindings) && nft_set_is_anonymous(set) &&
|
|
|
nft_is_active(ctx->net, set))
|
|
|
- nf_tables_set_destroy(ctx, set);
|
|
|
+ list_del_rcu(&set->list);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(nf_tables_unbind_set);
|
|
|
|
|
|
+void nf_tables_destroy_set(const struct nft_ctx *ctx, struct nft_set *set)
|
|
|
+{
|
|
|
+ if (list_empty(&set->bindings) && nft_set_is_anonymous(set) &&
|
|
|
+ nft_is_active(ctx->net, set)) {
|
|
|
+ nf_tables_set_notify(ctx, set, NFT_MSG_DELSET, GFP_ATOMIC);
|
|
|
+ nft_set_destroy(set);
|
|
|
+ }
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(nf_tables_destroy_set);
|
|
|
+
|
|
|
const struct nft_set_ext_type nft_set_ext_types[] = {
|
|
|
[NFT_SET_EXT_KEY] = {
|
|
|
.align = __alignof__(u32),
|