From: Florian Westphal <fw@strlen.de>
To: <netfilter-devel@vger.kernel.org>
Cc: Florian Westphal <fw@strlen.de>
Subject: [PATCH 03/17] parser: use scanner tokens again for ct key handling
Date: Wed, 28 Jun 2017 12:06:45 +0200 [thread overview]
Message-ID: <20170628100659.26976-4-fw@strlen.de> (raw)
In-Reply-To: <20170628100659.26976-1-fw@strlen.de>
This partially reverts commit
c992153402c78d91e8beba791171bced21c62d3f
("ct: allow resolving ct keys at run time").
It was a bad idea; problem is that if we want to support
a syntax like
ct origin ip saddr @foo
(to indicate that we want to match ip addresses, not ipv6), then we get
a failure here because "ip" is a token and not a string.
We could work around this by convertig ip to a string in that case
but thats worse than using tokens again.
Signed-off-by: Florian Westphal <fw@strlen.de>
---
include/ct.h | 2 --
src/ct.c | 35 -----------------------------------
src/parser_bison.y | 54 ++++++++++++++++++++++--------------------------------
src/scanner.l | 6 ++++++
4 files changed, 28 insertions(+), 69 deletions(-)
diff --git a/include/ct.h b/include/ct.h
index ae900ee4fb61..69ccc913dd74 100644
--- a/include/ct.h
+++ b/include/ct.h
@@ -29,8 +29,6 @@ extern void ct_expr_update_type(struct proto_ctx *ctx, struct expr *expr);
extern struct error_record *ct_dir_parse(const struct location *loc,
const char *str, int8_t *dir);
-extern struct error_record *ct_key_parse(const struct location *loc, const char *str,
- unsigned int *key);
extern struct error_record *ct_objtype_parse(const struct location *loc, const char *str, int *type);
extern struct stmt *notrack_stmt_alloc(const struct location *loc);
diff --git a/src/ct.c b/src/ct.c
index 87fe08bc62f8..f76f7867a77d 100644
--- a/src/ct.c
+++ b/src/ct.c
@@ -349,41 +349,6 @@ struct error_record *ct_dir_parse(const struct location *loc, const char *str,
return error(loc, "Could not parse direction %s", str);
}
-struct error_record *ct_key_parse(const struct location *loc, const char *str,
- unsigned int *key)
-{
- int ret, len, offset = 0;
- const char *sep = "";
- unsigned int i;
- char buf[1024];
- size_t size;
-
- for (i = 0; i < array_size(ct_templates); i++) {
- if (!ct_templates[i].token || strcmp(ct_templates[i].token, str))
- continue;
-
- *key = i;
- return NULL;
- }
-
- len = (int)sizeof(buf);
- size = sizeof(buf);
-
- for (i = 0; i < array_size(ct_templates); i++) {
- if (!ct_templates[i].token)
- continue;
-
- if (offset)
- sep = ", ";
-
- ret = snprintf(buf+offset, len, "%s%s", sep, ct_templates[i].token);
- SNPRINTF_BUFFER_SIZE(ret, size, len, offset);
- assert(offset < (int)sizeof(buf));
- }
-
- return error(loc, "syntax error, unexpected %s, known keys are %s", str, buf);
-}
-
struct expr *ct_expr_alloc(const struct location *loc, enum nft_ct_keys key,
int8_t direction)
{
diff --git a/src/parser_bison.y b/src/parser_bison.y
index 79918399368e..86f0464295eb 100644
--- a/src/parser_bison.y
+++ b/src/parser_bison.y
@@ -379,6 +379,12 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%token PROTO_SRC "proto-src"
%token PROTO_DST "proto-dst"
%token ZONE "zone"
+%token DIRECTION "direction"
+%token STATE "state"
+%token STATUS "status"
+%token EXPIRATION "expiration"
+%token LABEL "label"
+%token EVENT "event"
%token COUNTER "counter"
%token NAME "name"
@@ -3082,19 +3088,6 @@ ct_expr : CT ct_key
{
$$ = ct_expr_alloc(&@$, $2, -1);
}
- | CT STRING
- {
- struct error_record *erec;
- unsigned int key;
-
- erec = ct_key_parse(&@$, $2, &key);
- if (erec != NULL) {
- erec_queue(erec, state->msgs);
- YYERROR;
- }
-
- $$ = ct_expr_alloc(&@$, key, -1);
- }
| CT STRING ct_key_dir
{
struct error_record *erec;
@@ -3110,18 +3103,25 @@ ct_expr : CT ct_key
}
;
-ct_key : L3PROTOCOL { $$ = NFT_CT_L3PROTOCOL; }
- | PROTOCOL { $$ = NFT_CT_PROTOCOL; }
+ct_key : STATE { $$ = NFT_CT_STATE; }
+ | DIRECTION { $$ = NFT_CT_DIRECTION; }
+ | STATUS { $$ = NFT_CT_STATUS; }
| MARK { $$ = NFT_CT_MARK; }
| HELPER { $$ = NFT_CT_HELPER; }
+ | EXPIRATION { $$ = NFT_CT_EXPIRATION; }
+ | LABEL { $$ = NFT_CT_LABELS; }
+ | L3PROTOCOL { $$ = NFT_CT_L3PROTOCOL; }
+ | PROTOCOL { $$ = NFT_CT_PROTOCOL; }
+ | EVENT { $$ = NFT_CT_EVENTMASK; }
| ct_key_dir_optional
;
-ct_key_dir : SADDR { $$ = NFT_CT_SRC; }
- | DADDR { $$ = NFT_CT_DST; }
- | L3PROTOCOL { $$ = NFT_CT_L3PROTOCOL; }
+
+ct_key_dir : L3PROTOCOL { $$ = NFT_CT_L3PROTOCOL; }
| PROTOCOL { $$ = NFT_CT_PROTOCOL; }
| PROTO_SRC { $$ = NFT_CT_PROTO_SRC; }
| PROTO_DST { $$ = NFT_CT_PROTO_DST; }
+ | SADDR { $$ = NFT_CT_SRC; }
+ | DADDR { $$ = NFT_CT_DST; }
| ct_key_dir_optional
;
@@ -3149,9 +3149,11 @@ ct_stmt_expr : expr
| list_stmt_expr
;
-ct_stmt : CT ct_key SET expr
+ct_stmt : CT ct_key SET ct_stmt_expr
{
- switch ($2) {
+ unsigned int key = $2;
+
+ switch (key) {
case NFT_CT_HELPER:
$$ = objref_stmt_alloc(&@$);
$$->objref.type = NFT_OBJECT_CT_HELPER;
@@ -3162,18 +3164,6 @@ ct_stmt : CT ct_key SET expr
break;
}
}
- | CT STRING SET ct_stmt_expr
- {
- struct error_record *erec;
- unsigned int key;
-
- erec = ct_key_parse(&@$, $2, &key);
- if (erec != NULL) {
- erec_queue(erec, state->msgs);
- YYERROR;
- }
- $$ = ct_stmt_alloc(&@$, key, -1, $4);
- }
| CT STRING ct_key_dir_optional SET expr
{
struct error_record *erec;
diff --git a/src/scanner.l b/src/scanner.l
index c0c48a0dea29..f7717eb92f33 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -483,6 +483,12 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr})
"proto-src" { return PROTO_SRC; }
"proto-dst" { return PROTO_DST; }
"zone" { return ZONE; }
+"direction" { return DIRECTION; }
+"state" { return STATE; }
+"status" { return STATUS; }
+"expiration" { return EXPIRATION; }
+"event" { return EVENT; }
+"label" { return LABEL; }
"numgen" { return NUMGEN; }
"inc" { return INC; }
--
2.13.0
next prev parent reply other threads:[~2017-06-28 10:06 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-28 10:06 [nft crap] ct original ip saddr ... handling Florian Westphal
2017-06-28 10:06 ` [PATCH 01/17] rename struct ct to ct_helper Florian Westphal
2017-07-18 16:54 ` Pablo Neira Ayuso
2017-06-28 10:06 ` [PATCH 02/17] src: prepare for future ct timeout policy support Florian Westphal
2017-06-28 10:06 ` Florian Westphal [this message]
2017-06-28 10:06 ` [PATCH 04/17] parser: compact list of rhs keyword expressions Florian Westphal
2017-06-28 10:06 ` [PATCH 05/17] bison: permit 'label' on rhs side of expression Florian Westphal
2017-06-28 10:06 ` [PATCH 06/17] bison: permit keywords in list_stmt_expressions Florian Westphal
2017-06-28 10:06 ` [PATCH 07/17] tests: ct: remove unsupported syntax Florian Westphal
2017-06-28 10:06 ` [PATCH 08/17] src: add alternate syntax for ct saddr Florian Westphal
2017-06-28 10:06 ` [PATCH 09/17] src: ct: store proto base of ct key, if any Florian Westphal
2017-06-28 10:06 ` [PATCH 10/17] src: ct: add eval part to inject dependencies for ct saddr/daddr Florian Westphal
2017-06-28 10:14 ` [PATCH 11/17] src: unifiy meta and ct postprocessing Florian Westphal
2017-06-28 10:14 ` [PATCH 12/17] tests: update inet/bridge icmp test case Florian Westphal
2017-06-28 10:14 ` [PATCH 13/17] src: ct: print nfproto name for some header fields Florian Westphal
2017-06-28 10:14 ` [PATCH 14/17] tests: ct: adjust test case commands Florian Westphal
2017-06-28 10:14 ` [PATCH 15/17] src: rt: add keyword distinction for nexthop vs nexthop6 Florian Westphal
2017-06-28 10:14 ` [PATCH 16/17] tests: rt: fix test cases Florian Westphal
2017-06-28 10:14 ` [PATCH 17/17] doc: update man page Florian Westphal
2017-06-28 16:35 ` [nft crap] ct original ip saddr ... handling Pablo Neira Ayuso
2017-06-28 22:31 ` Florian Westphal
2017-06-29 0:39 ` Florian Westphal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170628100659.26976-4-fw@strlen.de \
--to=fw@strlen.de \
--cc=netfilter-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).