]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: osf: add json support
authorFlorian Westphal <fw@strlen.de>
Wed, 29 Aug 2018 09:37:39 +0000 (11:37 +0200)
committerFlorian Westphal <fw@strlen.de>
Wed, 29 Aug 2018 21:53:48 +0000 (23:53 +0200)
Signed-off-by: Florian Westphal <fw@strlen.de>
include/json.h
src/json.c
src/osf.c
src/parser_json.c
tests/py/inet/osf.t.json [new file with mode: 0644]

index b75512b8475fb68ea9717e895005e37daedca294..78c026a7a7f6732d7a5bc4ea26e8474f11f1bc40 100644 (file)
@@ -40,6 +40,7 @@ json_t *hash_expr_json(const struct expr *expr, struct output_ctx *octx);
 json_t *fib_expr_json(const struct expr *expr, struct output_ctx *octx);
 json_t *constant_expr_json(const struct expr *expr, struct output_ctx *octx);
 json_t *socket_expr_json(const struct expr *expr, struct output_ctx *octx);
+json_t *osf_expr_json(const struct expr *expr, struct output_ctx *octx);
 
 json_t *integer_type_json(const struct expr *expr, struct output_ctx *octx);
 json_t *string_type_json(const struct expr *expr, struct output_ctx *octx);
@@ -118,6 +119,7 @@ EXPR_PRINT_STUB(hash_expr)
 EXPR_PRINT_STUB(fib_expr)
 EXPR_PRINT_STUB(constant_expr)
 EXPR_PRINT_STUB(socket_expr)
+EXPR_PRINT_STUB(osf_expr)
 
 EXPR_PRINT_STUB(integer_type)
 EXPR_PRINT_STUB(string_type)
index 00d247646cfe20dde558c474f0017210e23320d1..eac7a3a01997e0dc1a4161f3bb17be0b0364bc21 100644 (file)
@@ -811,6 +811,11 @@ json_t *socket_expr_json(const struct expr *expr, struct output_ctx *octx)
                         socket_templates[expr->socket.key].token);
 }
 
+json_t *osf_expr_json(const struct expr *expr, struct output_ctx *octx)
+{
+       return json_pack("{s:{s:s}}", "osf", "key", "name");
+}
+
 json_t *integer_type_json(const struct expr *expr, struct output_ctx *octx)
 {
        char buf[1024] = "0x";
index b8457cc4b7b0eee67f18d222d06acb5184008c64..fc09e1571da1c8cf7c962505f44b1ad298a490ab 100644 (file)
--- a/src/osf.c
+++ b/src/osf.c
@@ -3,6 +3,7 @@
 #include <utils.h>
 #include <string.h>
 #include <osf.h>
+#include <json.h>
 
 static void osf_expr_print(const struct expr *expr, struct output_ctx *octx)
 {
@@ -18,6 +19,7 @@ static const struct expr_ops osf_expr_ops = {
        .name           = "osf",
        .print          = osf_expr_print,
        .clone          = osf_expr_clone,
+       .json           = osf_expr_json,
 };
 
 struct expr *osf_expr_alloc(const struct location *loc)
index b51f95e1c7b7b08aa1222c73a83dddced28b9525..6d8cda975ff90e94be28d2cd9d6425cdb00521fc 100644 (file)
@@ -346,13 +346,27 @@ static struct expr *json_parse_meta_expr(struct json_ctx *ctx,
        return meta_expr_alloc(int_loc, key);
 }
 
+static struct expr *json_parse_osf_expr(struct json_ctx *ctx,
+                                       const char *type, json_t *root)
+{
+       const char *key;
+
+       if (json_unpack_err(ctx, root, "{s:s}", "key", &key))
+               return NULL;
+
+       if (!strcmp(key, "name"))
+               return osf_expr_alloc(int_loc);
+
+       json_error(ctx, "Invalid osf key value.");
+       return NULL;
+}
+
 static struct expr *json_parse_socket_expr(struct json_ctx *ctx,
                                           const char *type, json_t *root)
 {
        const char *key;
        int keyval = -1;
 
-
        if (json_unpack_err(ctx, root, "{s:s}", "key", &key))
                return NULL;
 
@@ -1181,6 +1195,7 @@ static struct expr *json_parse_expr(struct json_ctx *ctx, json_t *root)
                { "exthdr", json_parse_exthdr_expr, CTX_F_PRIMARY | CTX_F_SET_RHS | CTX_F_SES | CTX_F_MAP },
                { "tcp option", json_parse_tcp_option_expr, CTX_F_PRIMARY | CTX_F_SET_RHS | CTX_F_MANGLE | CTX_F_SES },
                { "meta", json_parse_meta_expr, CTX_F_STMT | CTX_F_PRIMARY | CTX_F_SET_RHS | CTX_F_MANGLE | CTX_F_SES | CTX_F_MAP },
+               { "osf", json_parse_osf_expr, CTX_F_STMT | CTX_F_PRIMARY | CTX_F_MAP },
                { "socket", json_parse_socket_expr, CTX_F_PRIMARY },
                { "rt", json_parse_rt_expr, CTX_F_STMT | CTX_F_PRIMARY | CTX_F_SET_RHS | CTX_F_SES | CTX_F_MAP },
                { "ct", json_parse_ct_expr, CTX_F_STMT | CTX_F_PRIMARY | CTX_F_SET_RHS | CTX_F_MANGLE | CTX_F_SES | CTX_F_MAP },
diff --git a/tests/py/inet/osf.t.json b/tests/py/inet/osf.t.json
new file mode 100644 (file)
index 0000000..10fb68c
--- /dev/null
@@ -0,0 +1,66 @@
+# osf name "Linux"
+[
+    {
+        "match": {
+            "left": {
+                "osf": {
+                    "key": "name"
+                }
+            },
+            "right": "Linux"
+        }
+    }
+]
+
+# osf name { "Windows", "MacOs" }
+[
+    {
+        "match": {
+            "left": {
+                "osf": {
+                    "key": "name"
+                }
+            },
+            "right": {
+                "set": [
+                    "MacOs",
+                    "Windows"
+                ]
+            }
+        }
+    }
+]
+
+# ct mark set osf name map { "Windows" : 0x00000001, "MacOs" : 0x00000002 }
+[
+    {
+        "mangle": {
+            "left": {
+                "ct": {
+                    "key": "mark"
+                }
+            },
+            "right": {
+                "map": {
+                    "left": {
+                        "osf": {
+                            "key": "name"
+                        }
+                    },
+                    "right": {
+                        "set": [
+                            [
+                                "MacOs",
+                                2
+                            ],
+                            [
+                                "Windows",
+                                1
+                            ]
+                        ]
+                    }
+                }
+            }
+        }
+    }
+]