[PATCH nft 1/3] src: make the mss and wscale fields optional for synproxy object

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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





[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux