]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: add table declaration to cache
authorPablo Neira Ayuso <pablo@netfilter.org>
Sun, 28 Jun 2015 19:02:32 +0000 (21:02 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 17 Aug 2015 23:13:35 +0000 (01:13 +0200)
Add declared table objects to the cache, thus we can refer to objects that
come in this batch but that are not yet available in the kernel. This happens
from the evaluation step.

Get rid of code that is doing this from the later do_command_*() stage.

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

index d18b8f6346758ede9876cb6009ad5867bcf33177..8b54dbc055dc67b09eb1373a922fb6aa547826e9 100644 (file)
@@ -1885,6 +1885,19 @@ static int table_evaluate(struct eval_ctx *ctx, struct table *table)
        struct chain *chain;
        struct set *set;
 
+       if (table_lookup(&ctx->cmd->handle) == NULL) {
+               if (table == NULL) {
+                       table = table_alloc();
+                       handle_merge(&table->handle, &ctx->cmd->handle);
+                       table_add_hash(table);
+               } else {
+                       table_add_hash(table_get(table));
+               }
+       }
+
+       if (ctx->cmd->table == NULL)
+               return 0;
+
        ctx->table = table;
        list_for_each_entry(set, &table->sets, list) {
                handle_merge(&set->handle, &table->handle);
@@ -1916,8 +1929,6 @@ static int cmd_evaluate_add(struct eval_ctx *ctx, struct cmd *cmd)
                        return 0;
                return chain_evaluate(ctx, cmd->chain);
        case CMD_OBJ_TABLE:
-               if (cmd->data == NULL)
-                       return 0;
                return table_evaluate(ctx, cmd->table);
        default:
                BUG("invalid command object type %u\n", cmd->obj);
index 7701e211bbc70b3ca755bdefffcf7923aa9ffeaf..ccfde3de2f1c09b0b7daae4afa4121de81506f8e 100644 (file)
@@ -1003,15 +1003,8 @@ static int do_command_list(struct netlink_ctx *ctx, struct cmd *cmd)
        struct table *table = NULL;
        struct set *set;
 
-       /* No need to allocate the table object when listing all tables */
-       if (cmd->handle.table != NULL) {
+       if (cmd->handle.table != NULL)
                table = table_lookup(&cmd->handle);
-               if (table == NULL) {
-                       table = table_alloc();
-                       handle_merge(&table->handle, &cmd->handle);
-                       table_add_hash(table);
-               }
-       }
 
        switch (cmd->obj) {
        case CMD_OBJ_TABLE:
@@ -1072,14 +1065,10 @@ static int do_command_flush(struct netlink_ctx *ctx, struct cmd *cmd)
 
 static int do_command_rename(struct netlink_ctx *ctx, struct cmd *cmd)
 {
-       struct table *table;
+       struct table *table = table_lookup(&cmd->handle);
        struct chain *chain;
        int err;
 
-       table = table_alloc();
-       handle_merge(&table->handle, &cmd->handle);
-       table_add_hash(table);
-
        switch (cmd->obj) {
        case CMD_OBJ_CHAIN:
                err = netlink_get_chain(ctx, &cmd->handle, &cmd->location);