summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2021-04-29 20:04:55 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2021-05-02 23:30:35 +0200
commit797b4f343fe248ca7a516b68d93895121e574c15 (patch)
tree6565f3cf5f77d31cdbcf8976c4fb02cda3a5da2b
parent3392883f4566030853184f261d3ec1a62a7b4c1d (diff)
src: pass chain name to chain_cache_find()
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>
-rw-r--r--include/cache.h3
-rw-r--r--src/cache.c9
-rw-r--r--src/evaluate.c10
-rw-r--r--src/netlink.c2
-rw-r--r--src/rule.c2
5 files changed, 12 insertions, 14 deletions
diff --git a/include/cache.h b/include/cache.h
index f500e1b1..00092767 100644
--- a/include/cache.h
+++ b/include/cache.h
@@ -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);
diff --git a/src/cache.c b/src/cache.c
index f032171a..b38f3b84 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -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);
diff --git a/src/evaluate.c b/src/evaluate.c
index c52309f4..2c8a649f 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -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;
diff --git a/src/netlink.c b/src/netlink.c
index e8b01609..12352557 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -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;
diff --git a/src/rule.c b/src/rule.c
index 2c6292c4..fac8d22a 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -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: