]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
expression: extend 'nft describe' to allow listing data types
authorFlorian Westphal <fw@strlen.de>
Sat, 12 Oct 2019 22:17:52 +0000 (00:17 +0200)
committerFlorian Westphal <fw@strlen.de>
Mon, 14 Oct 2019 10:23:15 +0000 (12:23 +0200)
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>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
doc/nft.txt
doc/primary-expression.txt
src/expression.c

index 8a49c2fe97bc9da2057ef638a2161dd3ca956449..9bc5986b64163622a4f86a3bf8f589adf1dab13b 100644 (file)
@@ -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
index c5d25eee3c37a8e9be74af6178ef6230f20a2325..0316a7e1ab8ecac53f4622761e83e9e4c84a3e82 100644 (file)
@@ -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
index cb49e0b73f5a3ad494257b29a84ab42a804b7057..e456010ff8b0fc909726292348f4b6837b74d785 100644 (file)
@@ -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);
        }
 }