* [PATCH nft] expression: extend 'nft describe' to allow listing data types
@ 2019-10-12 22:17 Florian Westphal
2019-10-14 8:50 ` Pablo Neira Ayuso
0 siblings, 1 reply; 2+ messages in thread
From: Florian Westphal @ 2019-10-12 22:17 UTC (permalink / raw)
To: netfilter-devel; +Cc: Florian Westphal
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
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-10-14 8:50 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-12 22:17 [PATCH nft] expression: extend 'nft describe' to allow listing data types Florian Westphal
2019-10-14 8:50 ` Pablo Neira Ayuso
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).