]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
JSON: Add support for socket expression
authorPhil Sutter <phil@nwl.cc>
Fri, 8 Jun 2018 15:27:16 +0000 (17:27 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 11 Jun 2018 09:31:49 +0000 (11:31 +0200)
Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/json.h
include/socket.h
src/json.c
src/parser_json.c
src/socket.c
tests/py/inet/socket.t.json [new file with mode: 0644]

index ae3938142aeac376360c6b91c3df2ea738824870..1972bc841525dfc6273d24274cd15124fde5c315 100644 (file)
@@ -39,6 +39,7 @@ json_t *numgen_expr_json(const struct expr *expr, struct output_ctx *octx);
 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 *integer_type_json(const struct expr *expr, struct output_ctx *octx);
 json_t *string_type_json(const struct expr *expr, struct output_ctx *octx);
@@ -115,6 +116,7 @@ EXPR_PRINT_STUB(numgen_expr)
 EXPR_PRINT_STUB(hash_expr)
 EXPR_PRINT_STUB(fib_expr)
 EXPR_PRINT_STUB(constant_expr)
+EXPR_PRINT_STUB(socket_expr)
 
 EXPR_PRINT_STUB(integer_type)
 EXPR_PRINT_STUB(string_type)
index a2ae9f104958d818e2a18ba9edffb6990afb22a2..1814974ceb100522baf0124e9c676e0ee6fd9728 100644 (file)
@@ -18,6 +18,8 @@ struct socket_template {
        enum byteorder          byteorder;
 };
 
+extern const struct socket_template socket_templates[];
+
 extern struct expr *socket_expr_alloc(const struct location *loc,
                                    enum nft_socket_keys key);
 
index 9019982a9ebf23af4cd9ba5cdb5a19880ce2e6eb..83d438c6c9c2339bc8c0f6e6c29e238d4ce194e1 100644 (file)
@@ -805,6 +805,12 @@ json_t *constant_expr_json(const struct expr *expr, struct output_ctx *octx)
        return datatype_json(expr, octx);
 }
 
+json_t *socket_expr_json(const struct expr *expr, struct output_ctx *octx)
+{
+       return json_pack("{s:{s:s}}", "socket", "key",
+                        socket_templates[expr->socket.key].token);
+}
+
 json_t *integer_type_json(const struct expr *expr, struct output_ctx *octx)
 {
        char buf[1024] = "0x";
index e340bebc03b6d412810e75ddcb460db93546abe8..d60cbad8299efc14ae59d9d66c861bb147a1984e 100644 (file)
@@ -10,6 +10,7 @@
 #include <netlink.h>
 #include <parser.h>
 #include <rule.h>
+#include <socket.h>
 
 #include <netdb.h>
 #include <netinet/icmp6.h>
@@ -345,6 +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_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;
+
+       if (!strcmp(key, "transparent"))
+               keyval = NFT_SOCKET_TRANSPARENT;
+
+       if (keyval == -1) {
+               json_error(ctx, "Invalid socket key value.");
+               return NULL;
+       }
+
+       return socket_expr_alloc(int_loc, keyval);
+}
+
 static int json_parse_payload_field(const struct proto_desc *desc,
                                    const char *name, int *field)
 {
@@ -1157,6 +1179,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 },
+               { "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 },
                { "numgen", json_parse_numgen_expr, CTX_F_STMT | CTX_F_PRIMARY | CTX_F_SET_RHS | CTX_F_SES | CTX_F_MAP },
index d5f401f06bbff77970050883647e777f05e67888..7cfe5a9d2bc6ce026ca9de3c1fe2fa371a857b9e 100644 (file)
@@ -11,6 +11,7 @@
 #include <nftables.h>
 #include <expression.h>
 #include <socket.h>
+#include <json.h>
 
 const struct socket_template socket_templates[] = {
        [NFT_SOCKET_TRANSPARENT]        = {.token = "transparent",
@@ -39,6 +40,7 @@ static const struct expr_ops socket_expr_ops = {
        .type           = EXPR_SOCKET,
        .name           = "socket",
        .print          = socket_expr_print,
+       .json           = socket_expr_json,
        .cmp            = socket_expr_cmp,
        .clone          = socket_expr_clone,
 };
diff --git a/tests/py/inet/socket.t.json b/tests/py/inet/socket.t.json
new file mode 100644 (file)
index 0000000..c1ac1d1
--- /dev/null
@@ -0,0 +1,28 @@
+# socket transparent 0
+[
+    {
+        "match": {
+            "left": {
+                "socket": {
+                    "key": "transparent"
+                }
+            },
+            "right": 0
+        }
+    }
+]
+
+# socket transparent 1
+[
+    {
+        "match": {
+            "left": {
+                "socket": {
+                    "key": "transparent"
+                }
+            },
+            "right": 1
+        }
+    }
+]
+