netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Florian Westphal <fw@strlen.de>
To: <netfilter-devel@vger.kernel.org>
Cc: Florian Westphal <fw@strlen.de>
Subject: [PATCH nft] expression: extend 'nft describe' to allow listing data types
Date: Sun, 13 Oct 2019 00:17:52 +0200	[thread overview]
Message-ID: <20191012221752.4812-1-fw@strlen.de> (raw)

nft describe ct_status
before:
symbol expression, datatype invalid (invalid), 0 bits

after:
datatype ct_status (conntrack status) (basetype bitmask, integer), 32 bits

pre-defined symbolic constants (in hexadecimal):
        expected                        0x00000001
        seen-reply                      0x00000002
	[..]

Signed-off-by: Florian Westphal <fw@strlen.de>
---
 doc/nft.txt                | 15 ++++++++++++++-
 doc/primary-expression.txt |  2 ++
 src/expression.c           | 34 +++++++++++++++++++++++++---------
 3 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/doc/nft.txt b/doc/nft.txt
index 482e55b97002..610d91e9e1a4 100644
--- a/doc/nft.txt
+++ b/doc/nft.txt
@@ -658,9 +658,11 @@ representation of symbolic values and type compatibility with other expressions.
 DESCRIBE COMMAND
 ~~~~~~~~~~~~~~~~
 [verse]
-*describe* 'expression'
+*describe* 'expression' | 'data type'
 
 The *describe* command shows information about the type of an expression and its data type.
+A data type may also be given, in which nft will display more information
+about the type.
 
 .The describe command
 ---------------------
@@ -686,6 +688,17 @@ and type compatibility of expressions. A number of global data types exist, in
 addition some expression types define further data types specific to the
 expression type. Most data types have a fixed size, some however may have a
 dynamic size, f.i. the string type. +
+Some types also have predefined symbolic constants.  Those can be listed
+using the nft *describe* command:
+
+---------------------
+$ nft describe ct_state
+datatype ct_state (conntrack state) (basetype bitmask, integer), 32 bits
+
+pre-defined symbolic constants (in hexadecimal):
+invalid                         0x00000001
+new ...
+---------------------
 
 Types may be derived from lower order types, f.i. the IPv4 address type is
 derived from the integer type, meaning an IPv4 address can also be specified as
diff --git a/doc/primary-expression.txt b/doc/primary-expression.txt
index c5d25eee3c37..0316a7e1ab8e 100644
--- a/doc/primary-expression.txt
+++ b/doc/primary-expression.txt
@@ -292,6 +292,8 @@ Address type |
 fib_addrtype
 |=======================
 
+Use *nft* *describe* *fib_addrtype* to get a list of all address types.
+
 .Using fib expressions
 ----------------------
 # drop packets without a reverse path
diff --git a/src/expression.c b/src/expression.c
index cb49e0b73f5a..e456010ff8b0 100644
--- a/src/expression.c
+++ b/src/expression.c
@@ -122,11 +122,24 @@ const char *expr_name(const struct expr *e)
 
 void expr_describe(const struct expr *expr, struct output_ctx *octx)
 {
-	const struct datatype *dtype = expr->dtype;
+	const struct datatype *dtype = expr->dtype, *edtype = NULL;
+	unsigned int len = expr->len;
 	const char *delim = "";
 
-	nft_print(octx, "%s expression, datatype %s (%s)",
-		  expr_name(expr), dtype->name, dtype->desc);
+	if (dtype == &invalid_type &&
+	    expr->etype == EXPR_SYMBOL)
+		edtype = datatype_lookup_byname(expr->identifier);
+
+	if (edtype) {
+		dtype = edtype;
+		nft_print(octx, "datatype %s (%s)",
+			  dtype->name, dtype->desc);
+		len = dtype->size;
+	} else {
+		nft_print(octx, "%s expression, datatype %s (%s)",
+			  expr_name(expr), dtype->name, dtype->desc);
+	}
+
 	if (dtype->basetype != NULL) {
 		nft_print(octx, " (basetype ");
 		for (dtype = dtype->basetype; dtype != NULL;
@@ -138,23 +151,26 @@ void expr_describe(const struct expr *expr, struct output_ctx *octx)
 	}
 
 	if (expr_basetype(expr)->type == TYPE_STRING) {
-		if (expr->len)
+		if (len)
 			nft_print(octx, ", %u characters",
-				  expr->len / BITS_PER_BYTE);
+				  len / BITS_PER_BYTE);
 		else
 			nft_print(octx, ", dynamic length");
 	} else
-		nft_print(octx, ", %u bits", expr->len);
+		nft_print(octx, ", %u bits", len);
+
+	if (!edtype)
+		edtype = expr->dtype;
 
 	nft_print(octx, "\n");
 
-	if (expr->dtype->sym_tbl != NULL) {
+	if (edtype->sym_tbl != NULL) {
 		nft_print(octx, "\npre-defined symbolic constants ");
-		if (expr->dtype->sym_tbl->base == BASE_DECIMAL)
+		if (edtype->sym_tbl->base == BASE_DECIMAL)
 			nft_print(octx, "(in decimal):\n");
 		else
 			nft_print(octx, "(in hexadecimal):\n");
-		symbol_table_print(expr->dtype->sym_tbl, expr->dtype,
+		symbol_table_print(edtype->sym_tbl, edtype,
 				   expr->byteorder, octx);
 	}
 }
-- 
2.21.0


             reply	other threads:[~2019-10-12 22:47 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-12 22:17 Florian Westphal [this message]
2019-10-14  8:50 ` [PATCH nft] expression: extend 'nft describe' to allow listing data types Pablo Neira Ayuso

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=20191012221752.4812-1-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).