diff options
author | Phil Sutter <phil@nwl.cc> | 2018-06-08 17:27:16 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2018-06-11 11:31:49 +0200 |
commit | e8b5419b94e230d008d6701b66d02434a7cb1152 (patch) | |
tree | 0870685808e4259f7808f5e3ea797fe79e38e4f2 /src | |
parent | cd102c36aedf2a8f65ff235a009f297352cd6b65 (diff) |
JSON: Add support for socket expression
Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/json.c | 6 | ||||
-rw-r--r-- | src/parser_json.c | 23 | ||||
-rw-r--r-- | src/socket.c | 2 |
3 files changed, 31 insertions, 0 deletions
@@ -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"; diff --git a/src/parser_json.c b/src/parser_json.c index e340bebc..d60cbad8 100644 --- a/src/parser_json.c +++ b/src/parser_json.c @@ -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 }, diff --git a/src/socket.c b/src/socket.c index d5f401f0..7cfe5a9d 100644 --- a/src/socket.c +++ b/src/socket.c @@ -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, }; |