@@ -508,13 +508,13 @@ json_t *set_elem_expr_json(const struct expr *expr, struct output_ctx *octx)
root = json_pack("{s:o}", "val", root);
if (expr->timeout)
- json_object_set_new(root, "elem_timeout",
+ json_object_set_new(root, "timeout",
json_integer(expr->timeout / 1000));
if (expr->expiration)
- json_object_set_new(root, "elem_expires",
+ json_object_set_new(root, "expires",
json_integer(expr->expiration / 1000));
if (expr->comment)
- json_object_set_new(root, "elem_comment",
+ json_object_set_new(root, "comment",
json_string(expr->comment));
return json_pack("{s:o}", "elem", root);
}
@@ -1140,11 +1140,11 @@ static struct expr *json_parse_set_elem_expr(struct json_ctx *ctx,
expr = set_elem_expr_alloc(int_loc, expr);
- if (!json_unpack(root, "{s:i}", "elem_timeout", &i))
+ if (!json_unpack(root, "{s:i}", "timeout", &i))
expr->timeout = i * 1000;
- if (!json_unpack(root, "{s:i}", "elem_expires", &i))
+ if (!json_unpack(root, "{s:i}", "expires", &i))
expr->expiration = i * 1000;
- if (!json_unpack(root, "{s:s}", "elem_comment", &expr->comment))
+ if (!json_unpack(root, "{s:s}", "comment", &expr->comment))
expr->comment = xstrdup(expr->comment);
return expr;
@@ -1298,7 +1298,7 @@ static struct expr *json_parse_set_elem_expr_stmt(struct json_ctx *ctx, json_t *
{
struct expr *expr = json_parse_flagged_expr(ctx, CTX_F_SES, root);
- if (expr->ops->type != EXPR_SET_ELEM)
+ if (expr && expr->ops->type != EXPR_SET_ELEM)
expr = set_elem_expr_alloc(int_loc, expr);
return expr;
@@ -1820,7 +1820,6 @@ static struct stmt *json_parse_set_stmt(struct json_ctx *ctx,
struct expr *expr, *expr2;
struct stmt *stmt;
json_t *elem;
- uint64_t tmp;
int op;
if (json_unpack_err(ctx, value, "{s:s, s:o, s:s}",
@@ -1842,12 +1841,6 @@ static struct stmt *json_parse_set_stmt(struct json_ctx *ctx,
return NULL;
}
- if (!json_unpack(elem, "{s:I}", "elem_timeout", &tmp))
- expr->timeout = tmp * 1000;
- if (!json_unpack(elem, "{s:I}", "elem_expires", &tmp))
- expr->expiration = tmp * 1000;
- json_unpack(elem, "{s:s}", "elem_comment", &expr->comment);
-
if (set[0] != '@') {
json_error(ctx, "Illegal set reference in set statement.");
expr_free(expr);
@@ -4,7 +4,7 @@
"meter": {
"key": {
"elem": {
- "elem_timeout": 30,
+ "timeout": 30,
"val": {
"payload": {
"field": "saddr",
new file mode 100644
@@ -0,0 +1,24 @@
+# meter xyz { ip saddr timeout 30s counter}
+[
+ {
+ "meter": {
+ "key": {
+ "elem": {
+ "timeout": 30,
+ "val": {
+ "payload": {
+ "field": "saddr",
+ "name": "ip"
+ }
+ }
+ }
+ },
+ "name": "xyz",
+ "size": 65535,
+ "stmt": {
+ "counter": null
+ }
+ }
+ }
+]
+
@@ -4,7 +4,7 @@
"meter": {
"key": {
"elem": {
- "elem_timeout": 600,
+ "timeout": 600,
"val": {
"concat": [
{
@@ -34,7 +34,7 @@
"meter": {
"key": {
"elem": {
- "elem_timeout": 600,
+ "timeout": 600,
"val": {
"concat": [
{
* There is no need to prefix element-specific properties with 'elem_', they can't conflict. * In json_parse_set_stmt(), searching for above properties is pointless since that's already done by called function. * Fix potential NULL-pointer deref in json_parse_set_elem_expr_stmt(): json_parse_flagged_expr() may return NULL. Signed-off-by: Phil Sutter <phil@nwl.cc> --- Changes since v1: - Adjust JSON expected output for meter size. --- src/json.c | 6 +++--- src/parser_json.c | 15 ++++----------- tests/py/ip/flowtable.t.json | 2 +- tests/py/ip/flowtable.t.json.output | 24 ++++++++++++++++++++++++ tests/py/ip6/flowtable.t.json | 4 ++-- 5 files changed, 34 insertions(+), 17 deletions(-) create mode 100644 tests/py/ip/flowtable.t.json.output