=== VERDICT MAP
[verse]
*{ "vmap": {
- "left":* 'EXPRESSION'*,
- "right":* 'EXPRESSION'
+ "key":* 'EXPRESSION'*,
+ "data":* 'EXPRESSION'
*}}*
Apply a verdict conditionally.
-*left*::
+*key*::
Map key.
-*right*::
+*data*::
Mapping expression consisting of value/verdict pairs.
=== CT COUNT
=== MAP
[verse]
*{ "map": {
- "left":* 'EXPRESSION'*,
- "right":* 'EXPRESSION'
+ "key":* 'EXPRESSION'*,
+ "data":* 'EXPRESSION'
*}}*
Map a key to a value.
-*left*::
+*key*::
Map key.
-*right*::
+*data*::
Mapping expression consisting of value/target pairs.
=== PREFIX
type = "vmap";
return json_pack("{s:{s:o, s:o}}", type,
- "left", expr_print_json(expr->map, octx),
- "right", expr_print_json(expr->mappings, octx));
+ "key", expr_print_json(expr->map, octx),
+ "data", expr_print_json(expr->mappings, octx));
}
json_t *exthdr_expr_json(const struct expr *expr, struct output_ctx *octx)
static struct expr *json_parse_map_expr(struct json_ctx *ctx,
const char *type, json_t *root)
{
- json_t *jleft, *jright;
- struct expr *left, *right;
+ json_t *jkey, *jdata;
+ struct expr *key, *data;
if (json_unpack_err(ctx, root, "{s:o, s:o}",
- "left", &jleft, "right", &jright))
+ "key", &jkey, "data", &jdata))
return NULL;
- left = json_parse_map_lhs_expr(ctx, jleft);
- if (!left) {
- json_error(ctx, "Illegal LHS of map expression.");
+ key = json_parse_map_lhs_expr(ctx, jkey);
+ if (!key) {
+ json_error(ctx, "Illegal map expression key.");
return NULL;
}
- right = json_parse_rhs_expr(ctx, jright);
- if (!right) {
- json_error(ctx, "Illegal RHS of map expression.");
- expr_free(left);
+ data = json_parse_rhs_expr(ctx, jdata);
+ if (!data) {
+ json_error(ctx, "Illegal map expression data.");
+ expr_free(key);
return NULL;
}
- return map_expr_alloc(int_loc, left, right);
+ return map_expr_alloc(int_loc, key, data);
}
static struct expr *json_parse_set_elem_expr(struct json_ctx *ctx,
},
"right": {
"map": {
- "left": {
+ "key": {
"meta": { "key": "mark" }
},
- "right": {
+ "data": {
"set": [
[ 1, 10 ],
[ 2, 20 ],
[
{
"vmap": {
- "left": {
+ "key": {
"concat": [
{
"ct": {
}
]
},
- "right": {
+ "data": {
"set": [
[
{
},
"right": {
"map": {
- "left": {
+ "key": {
"meta": { "key": "mark" }
},
- "right": {
+ "data": {
"set": [
[ 1, 1 ],
[ 2, 2 ]
[
{
"vmap": {
- "left": {
+ "key": {
"concat": [
{
"ct": {
}
]
},
- "right": {
+ "data": {
"set": [
[
{
"dup": {
"addr": {
"map": {
- "left": {
+ "key": {
"meta": { "key": "mark" }
},
- "right": {
+ "data": {
"set": [
[ 1, "lo" ],
[ 2, "lo" ]
"fwd": {
"dev": {
"map": {
- "left": {
+ "key": {
"meta": { "key": "mark" }
},
- "right": {
+ "data": {
"set": [
[
"0x00000001",
"fwd": {
"dev": {
"map": {
- "left": {
+ "key": {
"meta": { "key": "mark" }
},
- "right": {
+ "data": {
"set": [
[
1,
[
{
"vmap": {
- "left": {
+ "key": {
"concat": [
{
"meta": { "key": "iif" }
}
]
},
- "right": {
+ "data": {
"set": [
[
{
[
{
"vmap": {
- "left": {
+ "key": {
"fib": {
"flags": [
"daddr",
"result": "type"
}
},
- "right": {
+ "data": {
"set": [
[
"blackhole",
[
{
"vmap": {
- "left": {
+ "key": {
"fib": {
"flags": [
"daddr",
"result": "type"
}
},
- "right": {
+ "data": {
"set": [
[
"unicast",
},
"right": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip"
}
},
- "right": {
+ "data": {
"set": [
[
"10.2.3.2",
},
"right": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "hdrlength",
"protocol": "ip"
}
},
- "right": {
+ "data": {
"set": [
[
5,
},
"right": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip"
}
},
- "right": {
+ "data": {
"set": [
[
"10.2.3.1",
},
"right": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "hdrlength",
"protocol": "ip"
}
},
- "right": {
+ "data": {
"set": [
[
4,
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
22,
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
25,
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "sport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
25,
"dnat": {
"addr": {
"map": {
- "left": {
+ "key": {
"ct": {
"key": "mark"
}
},
- "right": {
+ "data": {
"set": [
[
"0x00000014",
"dnat": {
"addr": {
"map": {
- "left": {
+ "key": {
"concat": [
{
"ct": {
}
]
},
- "right": {
+ "data": {
"set": [
[
{
"dnat": {
"addr": {
"map": {
- "left": {
+ "key": {
"ct": {
"key": "mark"
}
},
- "right": {
+ "data": {
"set": [
[
20,
"dnat": {
"addr": {
"map": {
- "left": {
+ "key": {
"concat": [
{
"ct": {
}
]
},
- "right": {
+ "data": {
"set": [
[
{
"dup": {
"addr": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip"
}
},
- "right": {
+ "data": {
"set": [
[
"192.168.2.120",
"dnat": {
"addr": {
"map": {
- "left": {
+ "key": {
"jhash": {
"expr": {
"payload": {
"seed": 3735928559
}
},
- "right": {
+ "data": {
"set": [
[
0,
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "dscp",
"protocol": "ip"
}
},
- "right": {
+ "data": {
"set": [
[
"cs1",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "hdrlength",
"protocol": "ip"
}
},
- "right": {
+ "data": {
"set": [
[
{ "range": [ 0, 4 ] },
},
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
22,
"dnat": {
"addr": {
"map": {
- "left": {
+ "key": {
"numgen": {
"mod": 2,
"mode": "inc"
}
},
- "right": {
+ "data": {
"set": [
[
0,
"dnat": {
"addr": {
"map": {
- "left": {
+ "key": {
"numgen": {
"mod": 10,
"mode": "inc"
}
},
- "right": {
+ "data": {
"set": [
[
{ "range": [ 0, 5 ] },
"dnat": {
"addr": {
"map": {
- "left": {
+ "key": {
"numgen": {
"mod": 2,
"mode": "inc",
"offset": 0
}
},
- "right": {
+ "data": {
"set": [
[
0,
"dnat": {
"addr": {
"map": {
- "left": {
+ "key": {
"numgen": {
"mod": 10,
"mode": "inc",
"offset": 0
}
},
- "right": {
+ "data": {
"set": [
[
{ "range": [ 0, 5 ] },
{
"counter": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
443,
{
"quota": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
443,
{
"ct helper": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
21,
{
"limit": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
22,
{
"counter": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
22,
{
"quota": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
22,
},
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
22,
"redirect": {
"port": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
22,
"dup": {
"addr": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"abcd::1",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "dscp",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"0x04",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "flowlabel",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
0,
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "dscp",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
4,
},
"right": {
"map": {
- "left": {
+ "key": {
"&": [
{
"payload": {
"::ffff"
]
},
- "right": {
+ "data": {
"set": [
[
"::2",
},
"right": {
"map": {
- "left": {
+ "key": {
"&": [
{
"payload": {
"::ffff"
]
},
- "right": {
+ "data": {
"set": [
[
"::2",
},
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
22,
},
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
22,
"redirect": {
"port": {
"map": {
- "left": {
+ "key": {
"payload": {
"field": "dport",
"protocol": "tcp"
}
},
- "right": {
+ "data": {
"set": [
[
22,
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"abcd::3",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"::1234:1234:1234:1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234::1234:1234:1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234::1234:1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234::1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234::1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234::1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234:1234::1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234:1234:1234::",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"::1234:1234:1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234::1234:1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234::1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234::1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234::1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234::1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234:1234::",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"::1234:1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234::1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234::1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234::1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234::1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234::",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"::1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234::1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234::1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234::1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234::",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"::1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234::1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234::1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234::",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"::1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234::1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234::",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"::1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234::",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
{
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234:1234:aaaa::",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234:1234:aaaa::",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234:1234:aaaa::",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234:1234:aaaa::",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"0:1234:1234:1234:1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:0:1234:1234:1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:0:1234:1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:0:1234:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:0:1234:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234:0:1234:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234:1234:0:1234",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"1234:1234:1234:1234:1234:1234:1234:0",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"::18.52.18.52",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"::aaaa",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"::bbbb",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"::cccc",
[
{
"vmap": {
- "left": {
+ "key": {
"payload": {
"field": "saddr",
"protocol": "ip6"
}
},
- "right": {
+ "data": {
"set": [
[
"::dddd",