]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: pass chain name to chain_cache_find()
authorPablo Neira Ayuso <pablo@netfilter.org>
Thu, 29 Apr 2021 18:04:55 +0000 (20:04 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Sun, 2 May 2021 21:30:35 +0000 (23:30 +0200)
You can identify chains through the unique handle in deletions, update
this interface to take a string instead of the handle to prepare for
the introduction of 64-bit handle chain lookups.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/cache.h
src/cache.c
src/evaluate.c
src/netlink.c
src/rule.c

index f500e1b19e454553d554a81ebe9ea4680b934618..0009276701a349cc8c4056f41b0fff384e7a0414 100644 (file)
@@ -57,8 +57,7 @@ int cache_update(struct nft_ctx *nft, unsigned int flags, struct list_head *msgs
 void cache_release(struct nft_cache *cache);
 
 void chain_cache_add(struct chain *chain, struct table *table);
-struct chain *chain_cache_find(const struct table *table,
-                              const struct handle *handle);
+struct chain *chain_cache_find(const struct table *table, const char *name);
 void set_cache_add(struct set *set, struct table *table);
 struct set *set_cache_find(const struct table *table, const char *name);
 
index f032171a95ffa1fdc28946ee94a1e6a632900a78..b38f3b84eda67c1026588bcc3a120a92dc4e681e 100644 (file)
@@ -244,15 +244,14 @@ void chain_cache_add(struct chain *chain, struct table *table)
        list_add_tail(&chain->cache_list, &table->cache_chain);
 }
 
-struct chain *chain_cache_find(const struct table *table,
-                              const struct handle *handle)
+struct chain *chain_cache_find(const struct table *table, const char *name)
 {
        struct chain *chain;
        uint32_t hash;
 
-       hash = djb_hash(handle->chain.name) % NFT_CACHE_HSIZE;
+       hash = djb_hash(name) % NFT_CACHE_HSIZE;
        list_for_each_entry(chain, &table->cache_chain_ht[hash], cache_hlist) {
-               if (!strcmp(chain->handle.chain.name, handle->chain.name))
+               if (!strcmp(chain->handle.chain.name, name))
                        return chain;
        }
 
@@ -421,7 +420,7 @@ static int cache_init_objects(struct netlink_ctx *ctx, unsigned int flags)
                if (flags & NFT_CACHE_RULE_BIT) {
                        ret = netlink_list_rules(ctx, &table->handle);
                        list_for_each_entry_safe(rule, nrule, &ctx->list, list) {
-                               chain = chain_cache_find(table, &rule->handle);
+                               chain = chain_cache_find(table, rule->handle.chain.name);
                                if (!chain)
                                        chain = chain_binding_lookup(table,
                                                        rule->handle.chain.name);
index c52309f46f59ea7ba9c0689331684ce2e045ff34..2c8a649f5392a8d955daa209f5738ff18a1a55b1 100644 (file)
@@ -4002,7 +4002,7 @@ static int rule_cache_update(struct eval_ctx *ctx, enum cmd_ops op)
        if (!table)
                return table_not_found(ctx);
 
-       chain = chain_cache_find(table, &rule->handle);
+       chain = chain_cache_find(table, rule->handle.chain.name);
        if (!chain)
                return chain_not_found(ctx);
 
@@ -4145,14 +4145,14 @@ static int chain_evaluate(struct eval_ctx *ctx, struct chain *chain)
                return table_not_found(ctx);
 
        if (chain == NULL) {
-               if (chain_cache_find(table, &ctx->cmd->handle) == NULL) {
+               if (!chain_cache_find(table, ctx->cmd->handle.chain.name)) {
                        chain = chain_alloc(NULL);
                        handle_merge(&chain->handle, &ctx->cmd->handle);
                        chain_cache_add(chain, table);
                }
                return 0;
        } else if (!(chain->flags & CHAIN_F_BINDING)) {
-               if (chain_cache_find(table, &chain->handle) == NULL)
+               if (!chain_cache_find(table, chain->handle.chain.name))
                        chain_cache_add(chain_get(chain), table);
        }
 
@@ -4482,7 +4482,7 @@ static int cmd_evaluate_list(struct eval_ctx *ctx, struct cmd *cmd)
                if (table == NULL)
                        return table_not_found(ctx);
 
-               if (chain_cache_find(table, &cmd->handle) == NULL)
+               if (!chain_cache_find(table, cmd->handle.chain.name))
                        return chain_not_found(ctx);
 
                return 0;
@@ -4642,7 +4642,7 @@ static int cmd_evaluate_rename(struct eval_ctx *ctx, struct cmd *cmd)
                if (table == NULL)
                        return table_not_found(ctx);
 
-               if (chain_cache_find(table, &ctx->cmd->handle) == NULL)
+               if (!chain_cache_find(table, ctx->cmd->handle.chain.name))
                        return chain_not_found(ctx);
 
                break;
index e8b016096b677e876ef1decb7e97d1e09d2170f3..123525570c3965fc5455acf3bf6ebd3b921e3559 100644 (file)
@@ -1718,7 +1718,7 @@ static struct rule *trace_lookup_rule(const struct nftnl_trace *nlt,
        if (!table)
                return NULL;
 
-       chain = chain_cache_find(table, &h);
+       chain = chain_cache_find(table, h.chain.name);
        if (!chain)
                return NULL;
 
index 2c6292c4e173364fde8add7bbfd94df6fbafe5ba..fac8d22a85ee8bc8937e7528c56718a6da1b5e46 100644 (file)
@@ -2608,7 +2608,7 @@ static int do_command_rename(struct netlink_ctx *ctx, struct cmd *cmd)
 
        switch (cmd->obj) {
        case CMD_OBJ_CHAIN:
-               chain = chain_cache_find(table, &cmd->handle);
+               chain = chain_cache_find(table, cmd->handle.chain.name);
 
                return mnl_nft_chain_rename(ctx, cmd, chain);
        default: