diff options
author | Florian Westphal <fw@strlen.de> | 2016-01-04 20:53:43 +0100 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2016-01-04 20:53:43 +0100 |
commit | 7ad9e1f8ad4ba637be841d0573bdfdcf397f0815 (patch) | |
tree | 1c700561baa465690fb3eb41e1abeab9ac13367d /src/parser_bison.y | |
parent | b99ec85e32947e337681aef8a29eae1c4c10f14e (diff) |
ct: add support for directional keys
A few keys in the ct expression are directional, i.e.
we need to tell kernel if it should fetch REPLY or ORIGINAL direction.
Split ct_keys into ct_keys & ct_keys_dir, the latter are those keys
that the kernel rejects unless also given a direction.
During postprocessing we also need to invoke ct_expr_update_type,
problem is that e.g. ct saddr can be any family (ip, ipv6) so we need
to update the expected data type based on the network base.
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'src/parser_bison.y')
-rw-r--r-- | src/parser_bison.y | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/parser_bison.y b/src/parser_bison.y index af51e4dd..fcd4813e 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -567,7 +567,7 @@ static void location_update(struct location *loc, struct location *rhs, int n) %type <expr> ct_expr %destructor { expr_free($$); } ct_expr -%type <val> ct_key +%type <val> ct_key ct_key_dir %type <val> export_format %type <string> monitor_event @@ -2264,9 +2264,22 @@ meta_stmt : META meta_key SET expr } ; -ct_expr : CT ct_key +ct_expr : CT ct_key { - $$ = ct_expr_alloc(&@$, $2); + $$ = ct_expr_alloc(&@$, $2, -1); + } + | CT ct_key_dir STRING + { + struct error_record *erec; + int8_t direction; + + erec = ct_dir_parse(&@$, $3, &direction); + if (erec != NULL) { + erec_queue(erec, state->msgs); + YYERROR; + } + + $$ = ct_expr_alloc(&@$, $2, direction); } ; @@ -2276,13 +2289,14 @@ ct_key : STATE { $$ = NFT_CT_STATE; } | MARK { $$ = NFT_CT_MARK; } | EXPIRATION { $$ = NFT_CT_EXPIRATION; } | HELPER { $$ = NFT_CT_HELPER; } - | L3PROTOCOL { $$ = NFT_CT_L3PROTOCOL; } - | SADDR { $$ = NFT_CT_SRC; } + | LABEL { $$ = NFT_CT_LABELS; } + ; +ct_key_dir : SADDR { $$ = NFT_CT_SRC; } | DADDR { $$ = NFT_CT_DST; } + | L3PROTOCOL { $$ = NFT_CT_L3PROTOCOL; } | PROTOCOL { $$ = NFT_CT_PROTOCOL; } | PROTO_SRC { $$ = NFT_CT_PROTO_SRC; } | PROTO_DST { $$ = NFT_CT_PROTO_DST; } - | LABEL { $$ = NFT_CT_LABELS; } ; ct_stmt : CT ct_key SET expr |