The mss and wscale fields is optional for synproxy statement, this patch to make the same behavior for synproxy object, and also makes the timestamp and sack-perm flags no longer order-sensitive. Signed-off-by: Zhongqiu Duan <dzq.aishenghu0@xxxxxxxxx> --- src/json.c | 9 ++++--- src/parser_bison.y | 63 +++++++++++++++------------------------------- src/parser_json.c | 26 ++++++++++++------- 3 files changed, 42 insertions(+), 56 deletions(-) diff --git a/src/json.c b/src/json.c index f0430776851c..15ddc4dab790 100644 --- a/src/json.c +++ b/src/json.c @@ -469,10 +469,11 @@ static json_t *obj_print_json(const struct obj *obj) json_decref(tmp); break; case NFT_OBJECT_SYNPROXY: - tmp = nft_json_pack("{s:i, s:i}", - "mss", obj->synproxy.mss, - "wscale", obj->synproxy.wscale); - + tmp = json_object(); + if (obj->synproxy.flags & NF_SYNPROXY_OPT_MSS) + json_object_set_new(tmp, "mss", json_integer(obj->synproxy.mss)); + if (obj->synproxy.flags & NF_SYNPROXY_OPT_WSCALE) + json_object_set_new(tmp, "wscale", json_integer(obj->synproxy.wscale)); flags = json_array(); if (obj->synproxy.flags & NF_SYNPROXY_OPT_TIMESTAMP) json_array_append_new(flags, json_string("timestamp")); diff --git a/src/parser_bison.y b/src/parser_bison.y index f9cc909836bc..45f2cb4a11f2 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -964,8 +964,6 @@ int nft_lex(void *, void *, void *); %destructor { free_const($$); } monitor_event %type <val> monitor_object monitor_format -%type <val> synproxy_ts synproxy_sack - %type <expr> tcp_hdr_expr %destructor { expr_free($$); } tcp_hdr_expr %type <val> tcp_hdr_field @@ -2662,7 +2660,7 @@ secmark_block : /* empty */ { $$ = $<obj>-1; } synproxy_block : /* empty */ { $$ = $<obj>-1; } | synproxy_block common_block | synproxy_block stmt_separator - | synproxy_block synproxy_config + | synproxy_block synproxy_config_arg { $$ = $1; } @@ -3807,58 +3805,37 @@ synproxy_arg : MSS NUM } ; -synproxy_config : MSS NUM WSCALE NUM synproxy_ts synproxy_sack +synproxy_config : synproxy_config_arg { - struct synproxy *synproxy; - uint32_t flags = 0; - - synproxy = &$<obj>0->synproxy; - synproxy->mss = $2; - flags |= NF_SYNPROXY_OPT_MSS; - synproxy->wscale = $4; - flags |= NF_SYNPROXY_OPT_WSCALE; - if ($5) - flags |= $5; - if ($6) - flags |= $6; - synproxy->flags = flags; - } - | MSS NUM stmt_separator WSCALE NUM stmt_separator synproxy_ts synproxy_sack - { - struct synproxy *synproxy; - uint32_t flags = 0; - - synproxy = &$<obj>0->synproxy; - synproxy->mss = $2; - flags |= NF_SYNPROXY_OPT_MSS; - synproxy->wscale = $5; - flags |= NF_SYNPROXY_OPT_WSCALE; - if ($7) - flags |= $7; - if ($8) - flags |= $8; - synproxy->flags = flags; + $<obj>$ = $<obj>0; } + | synproxy_config synproxy_config_arg ; -synproxy_obj : /* empty */ +synproxy_config_arg : MSS NUM { - $$ = obj_alloc(&@$); - $$->type = NFT_OBJECT_SYNPROXY; + $<obj>0->synproxy.mss = $2; + $<obj>0->synproxy.flags |= NF_SYNPROXY_OPT_MSS; + } + | WSCALE NUM + { + $<obj>0->synproxy.wscale = $2; + $<obj>0->synproxy.flags |= NF_SYNPROXY_OPT_WSCALE; } - ; - -synproxy_ts : /* empty */ { $$ = 0; } | TIMESTAMP { - $$ = NF_SYNPROXY_OPT_TIMESTAMP; + $<obj>0->synproxy.flags |= NF_SYNPROXY_OPT_TIMESTAMP; + } + | SACK_PERM + { + $<obj>0->synproxy.flags |= NF_SYNPROXY_OPT_SACK_PERM; } ; -synproxy_sack : /* empty */ { $$ = 0; } - | SACK_PERM +synproxy_obj : /* empty */ { - $$ = NF_SYNPROXY_OPT_SACK_PERM; + $$ = obj_alloc(&@$); + $$->type = NFT_OBJECT_SYNPROXY; } ; diff --git a/src/parser_json.c b/src/parser_json.c index 08657f2849a5..dc1431e1711c 100644 --- a/src/parser_json.c +++ b/src/parser_json.c @@ -3493,7 +3493,7 @@ static struct cmd *json_parse_cmd_add_object(struct json_ctx *ctx, { const char *family, *tmp, *rate_unit = "packets", *burst_unit = "bytes"; uint32_t l3proto = NFPROTO_UNSPEC; - int inv = 0, flags = 0, i, j; + int inv = 0, flags = 0, i; struct handle h = { 0 }; struct obj *obj; @@ -3667,14 +3667,22 @@ static struct cmd *json_parse_cmd_add_object(struct json_ctx *ctx, break; case CMD_OBJ_SYNPROXY: obj->type = NFT_OBJECT_SYNPROXY; - if (json_unpack_err(ctx, root, "{s:i, s:i}", - "mss", &i, "wscale", &j)) - goto err_free_obj; - - obj->synproxy.mss = i; - obj->synproxy.wscale = j; - obj->synproxy.flags |= NF_SYNPROXY_OPT_MSS; - obj->synproxy.flags |= NF_SYNPROXY_OPT_WSCALE; + if (!json_unpack(root, "{s:i}", "mss", &i)) { + if (i < 0) { + json_error(ctx, "Invalid synproxy mss value '%d'", i); + goto err_free_obj; + } + obj->synproxy.mss = i; + obj->synproxy.flags |= NF_SYNPROXY_OPT_MSS; + } + if (!json_unpack(root, "{s:i}", "wscale", &i)) { + if (i < 0) { + json_error(ctx, "Invalid synproxy wscale value '%d'", i); + goto err_free_obj; + } + obj->synproxy.wscale = i; + obj->synproxy.flags |= NF_SYNPROXY_OPT_WSCALE; + } flags = parse_flags_array(ctx, root, "flags", json_parse_synproxy_flag); if (flags < 0) -- 2.43.0