From 21cbab5b6ffec409d5677802bcd1172d0d1cd990 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Sun, 13 Oct 2019 00:17:52 +0200 Subject: expression: extend 'nft describe' to allow listing data types 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 Acked-by: Pablo Neira Ayuso --- 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 8a49c2fe..9bc5986b 100644 --- a/doc/nft.txt +++ b/doc/nft.txt @@ -642,9 +642,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 --------------------- @@ -670,6 +672,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 c5d25eee..0316a7e1 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 cb49e0b7..e456010f 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); } } -- cgit v1.2.3