]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: add json support for last statement
authorPablo Neira Ayuso <pablo@netfilter.org>
Tue, 20 Jun 2023 09:45:53 +0000 (11:45 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 20 Jun 2023 16:10:56 +0000 (18:10 +0200)
This patch adds json support for the last statement, it works for me here.

However, tests/py still displays a warning:

any/last.t: WARNING: line 12: '{"nftables": [{"add": {"rule": {"family": "ip", "table": "test-ip4", "chain": "input", "expr": [{"last": {"used": 300000}}]}}}]}': '[{"last": {"used": 300000}}]' mismatches '[{"last": null}]'

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/json.h
src/json.c
src/parser_json.c
src/statement.c
tests/py/any/last.t.json [new file with mode: 0644]

index f691678d4d726798fb113bb86cbc98c2a4c13787..da605ed9e83d578cd94877e3c970d3134adcfea5 100644 (file)
@@ -74,6 +74,7 @@ json_t *payload_stmt_json(const struct stmt *stmt, struct output_ctx *octx);
 json_t *exthdr_stmt_json(const struct stmt *stmt, struct output_ctx *octx);
 json_t *quota_stmt_json(const struct stmt *stmt, struct output_ctx *octx);
 json_t *ct_stmt_json(const struct stmt *stmt, struct output_ctx *octx);
+json_t *last_stmt_json(const struct stmt *stmt, struct output_ctx *octx);
 json_t *limit_stmt_json(const struct stmt *stmt, struct output_ctx *octx);
 json_t *fwd_stmt_json(const struct stmt *stmt, struct output_ctx *octx);
 json_t *notrack_stmt_json(const struct stmt *stmt, struct output_ctx *octx);
@@ -177,6 +178,7 @@ STMT_PRINT_STUB(payload)
 STMT_PRINT_STUB(exthdr)
 STMT_PRINT_STUB(quota)
 STMT_PRINT_STUB(ct)
+STMT_PRINT_STUB(last)
 STMT_PRINT_STUB(limit)
 STMT_PRINT_STUB(fwd)
 STMT_PRINT_STUB(notrack)
index 981d177b75d4f0a92b1cb42a14dfee9d71ad1b86..305eb6e397febc3433cdb1bead8b2126cc1c4975 100644 (file)
@@ -1482,6 +1482,14 @@ json_t *counter_stmt_json(const struct stmt *stmt, struct output_ctx *octx)
                         "bytes", stmt->counter.bytes);
 }
 
+json_t *last_stmt_json(const struct stmt *stmt, struct output_ctx *octx)
+{
+       if (nft_output_stateless(octx) || stmt->last.set == 0)
+               return json_pack("{s:n}", "last");
+
+       return json_pack("{s:{s:I}}", "last", "used", stmt->last.used);
+}
+
 json_t *set_stmt_json(const struct stmt *stmt, struct output_ctx *octx)
 {
        json_t *root;
index f1cc39505382cbd2d5c4ec96c106d27f377c10b8..605dcc49f71585d97799c0eca05fca2d741d05dd 100644 (file)
@@ -1731,6 +1731,27 @@ static struct stmt *json_parse_counter_stmt(struct json_ctx *ctx,
        return stmt;
 }
 
+static struct stmt *json_parse_last_stmt(struct json_ctx *ctx,
+                                        const char *key, json_t *value)
+{
+       struct stmt *stmt;
+       int64_t used;
+
+       if (json_is_null(value))
+               return last_stmt_alloc(int_loc);
+
+       if (!json_unpack(value, "{s:I}", "used", &used)) {
+               stmt = last_stmt_alloc(int_loc);
+               if (used != -1) {
+                       stmt->last.used = used;
+                       stmt->last.set = 1;
+               }
+               return stmt;
+       }
+
+       return NULL;
+}
+
 static struct stmt *json_parse_verdict_stmt(struct json_ctx *ctx,
                                            const char *key, json_t *value)
 {
@@ -2747,6 +2768,7 @@ static struct stmt *json_parse_stmt(struct json_ctx *ctx, json_t *root)
                { "counter", json_parse_counter_stmt },
                { "mangle", json_parse_mangle_stmt },
                { "quota", json_parse_quota_stmt },
+               { "last", json_parse_last_stmt },
                { "limit", json_parse_limit_stmt },
                { "flow", json_parse_flow_offload_stmt },
                { "fwd", json_parse_fwd_stmt },
index 72455522c2c9184b23504283a828b8f042c10fc6..9ca7e208cf795268369dbb7524af8c6e1abc0867 100644 (file)
@@ -268,6 +268,7 @@ static const struct stmt_ops last_stmt_ops = {
        .type           = STMT_LAST,
        .name           = "last",
        .print          = last_stmt_print,
+       .json           = last_stmt_json,
 };
 
 struct stmt *last_stmt_alloc(const struct location *loc)
diff --git a/tests/py/any/last.t.json b/tests/py/any/last.t.json
new file mode 100644 (file)
index 0000000..2a2b9e7
--- /dev/null
@@ -0,0 +1,16 @@
+# last
+[
+    {
+        "last": null
+    }
+]
+
+# last used 300s
+[
+    {
+        "last": {
+               "used": 300000
+       }
+    }
+]
+