Re: [PATCH nft] src: get rid of nft_ctx_output_{get,set}_numeric()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



@Phil, thinking here we could probably get rid of
NFT_CTX_OUTPUT_NUMERIC_PROTO, since it is contained already in
NFT_CTX_OUTPUT_NUMERIC_SYMBOL.

There's no option for -p anymore, so we could simply things a bit
before.

On Mon, Oct 29, 2018 at 04:03:32PM +0100, Pablo Neira Ayuso wrote:
> This patch adds NFT_CTX_OUTPUT_NUMERIC_SYMBOL, which replaces the last
> client of the numeric level approach.
> 
> This patch updates `-n' option semantics to display all output
> numerically.
> 
> Note that monitor code was still using the -n option to skip printing
> the process name, this patch updates that path too to print it
> inconditionally to simplify things.
> 
> Given the numeric levels have no more clients after this patch, remove
> that code.
> 
> Update several tests/shell not to use -nn.
> 
> Signed-off-by: Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx>
> ---
> @Phil: I think it should be possible to evaluate numerical through flags
>        in case this interface needs to remain in place for nftables.py
>        interface. I did not update tests/py/ bits, I cannot run that
>        until python infrastructure gets in sync with this patchset, no rush
>        just a side note.
> 
>  doc/libnftables.adoc                            | 35 -------------------------
>  include/nftables.h                              |  6 ++++-
>  include/nftables/libnftables.h                  | 10 +------
>  src/datatype.c                                  |  2 +-
>  src/json.c                                      |  2 +-
>  src/libnftables.c                               | 11 --------
>  src/main.c                                      | 26 +++++++++---------
>  src/monitor.c                                   |  8 +++---
>  tests/shell/testcases/netns/0001nft-f_0         |  2 +-
>  tests/shell/testcases/netns/0002loosecommands_0 |  2 +-
>  tests/shell/testcases/netns/0003many_0          |  2 +-
>  11 files changed, 27 insertions(+), 79 deletions(-)
> 
> diff --git a/doc/libnftables.adoc b/doc/libnftables.adoc
> index 788194396db1..52b8fb0ca5a1 100644
> --- a/doc/libnftables.adoc
> +++ b/doc/libnftables.adoc
> @@ -21,10 +21,6 @@ void nft_ctx_set_dry_run(struct nft_ctx* '\*ctx'*, bool* 'dry'*);
>  unsigned int nft_ctx_output_get_flags(struct nft_ctx* '\*ctx'*);
>  void nft_ctx_output_set_flags(struct nft_ctx* '\*ctx'*, unsigned int* 'flags'*);
>  
> -enum nft_numeric_level nft_ctx_output_get_numeric(struct nft_ctx* '\*ctx'*);
> -void nft_ctx_output_set_numeric(struct nft_ctx* '\*ctx'*,
> -				enum nft_numeric_level* 'level'*);
> -
>  unsigned int nft_ctx_output_get_debug(struct nft_ctx* '\*ctx'*);
>  void nft_ctx_output_set_debug(struct nft_ctx* '\*ctx'*, unsigned int* 'mask'*);
>  
> @@ -126,37 +122,6 @@ NFT_CTX_OUTPUT_NUMERIC_PROTO::
>  NFT_CTX_OUTPUT_NUMERIC_PRIO::
>  	Display base chain priority numerically.
>  
> -=== nft_ctx_output_get_numeric() and nft_ctx_output_set_numeric()
> -These functions allow control over value representation in library output.
> -For instance, port numbers by default are printed by their name (as listed in '/etc/services' file), if known.
> -In libnftables, numeric output is leveled, defined as such:
> -
> -----
> -enum nft_numeric_level {
> -        NFT_NUMERIC_NONE,
> -        NFT_NUMERIC_ADDR,
> -        NFT_NUMERIC_PORT,
> -        NFT_NUMERIC_ALL,
> -};
> -----
> -
> -Each numeric level includes all previous ones:
> -
> -NFT_NUMERIC_NONE::
> -	No conversion into numeric format happens, this is the default.
> -NFT_NUMERIC_ADDR::
> -	Network addresses are always converted into numeric format.
> -NFT_NUMERIC_PORT::
> -	Network services are always converted into numeric format.
> -NFT_NUMERIC_ALL::
> -	Everything is converted into numeric format.
> -
> -The default numeric level is *NFT_NUMERIC_NONE*.
> -
> -The *nft_ctx_output_get_numeric*() function returns the numeric output setting's value contained in 'ctx'.
> -
> -The *nft_ctx_output_set_numeric*() function sets the numeric output setting in 'ctx' to the value of 'level'.
> -
>  === nft_ctx_output_get_debug() and nft_ctx_output_set_debug()
>  Libnftables supports separate debugging of different parts of its internals.
>  To facilitate this, debugging output is controlled via a bit mask.
> diff --git a/include/nftables.h b/include/nftables.h
> index a4d01e0cddea..5c0292615b3f 100644
> --- a/include/nftables.h
> +++ b/include/nftables.h
> @@ -17,7 +17,6 @@ struct cookie {
>  
>  struct output_ctx {
>  	unsigned int flags;
> -	unsigned int numeric;
>  	union {
>  		FILE *output_fp;
>  		struct cookie output_cookie;
> @@ -73,6 +72,11 @@ static inline bool nft_output_numeric_prio(const struct output_ctx *octx)
>  	return octx->flags & NFT_CTX_OUTPUT_NUMERIC_PRIO;
>  }
>  
> +static inline bool nft_output_numeric_symbol(const struct output_ctx *octx)
> +{
> +	return octx->flags & NFT_CTX_OUTPUT_NUMERIC_SYMBOL;
> +}
> +
>  struct nft_cache {
>  	uint16_t		genid;
>  	struct list_head	list;
> diff --git a/include/nftables/libnftables.h b/include/nftables/libnftables.h
> index fb81edc0df07..82b4181de0cc 100644
> --- a/include/nftables/libnftables.h
> +++ b/include/nftables/libnftables.h
> @@ -26,13 +26,6 @@ enum nft_debug_level {
>  	NFT_DEBUG_SEGTREE		= 0x40,
>  };
>  
> -enum nft_numeric_level {
> -	NFT_NUMERIC_NONE,
> -	NFT_NUMERIC_ADDR,
> -	NFT_NUMERIC_PORT,
> -	NFT_NUMERIC_ALL,
> -};
> -
>  /**
>   * Possible flags to pass to nft_ctx_new()
>   */
> @@ -54,13 +47,12 @@ enum {
>  	NFT_CTX_OUTPUT_GUID		= (1 << 6),
>  	NFT_CTX_OUTPUT_NUMERIC_PROTO	= (1 << 7),
>  	NFT_CTX_OUTPUT_NUMERIC_PRIO     = (1 << 8),
> +	NFT_CTX_OUTPUT_NUMERIC_SYMBOL	= (1 << 9),
>  };
>  
>  unsigned int nft_ctx_output_get_flags(struct nft_ctx *ctx);
>  void nft_ctx_output_set_flags(struct nft_ctx *ctx, unsigned int flags);
>  
> -enum nft_numeric_level nft_ctx_output_get_numeric(struct nft_ctx *ctx);
> -void nft_ctx_output_set_numeric(struct nft_ctx *ctx, enum nft_numeric_level level);
>  unsigned int nft_ctx_output_get_debug(struct nft_ctx *ctx);
>  void nft_ctx_output_set_debug(struct nft_ctx *ctx, unsigned int mask);
>  
> diff --git a/src/datatype.c b/src/datatype.c
> index bfb70a6ebb76..6af1c84350d1 100644
> --- a/src/datatype.c
> +++ b/src/datatype.c
> @@ -196,7 +196,7 @@ void symbolic_constant_print(const struct symbol_table *tbl,
>  	if (quotes)
>  		nft_print(octx, "\"");
>  
> -	if (octx->numeric > NFT_NUMERIC_ALL)
> +	if (nft_output_numeric_symbol(octx))
>  		nft_print(octx, "%" PRIu64 "", val);
>  	else
>  		nft_print(octx, "%s", s->identifier);
> diff --git a/src/json.c b/src/json.c
> index 8a2bcd658bd8..fc92d4641fcf 100644
> --- a/src/json.c
> +++ b/src/json.c
> @@ -812,7 +812,7 @@ static json_t *symbolic_constant_json(const struct symbol_table *tbl,
>  	if (!s->identifier)
>  		return expr_basetype(expr)->json(expr, octx);
>  
> -	if (octx->numeric > NFT_NUMERIC_ALL)
> +	if (nft_output_numeric_symbol(octx))
>  		return json_integer(val);
>  	else
>  		return json_string(s->identifier);
> diff --git a/src/libnftables.c b/src/libnftables.c
> index 03c15fbaf7e5..bd79cd6091d2 100644
> --- a/src/libnftables.c
> +++ b/src/libnftables.c
> @@ -312,17 +312,6 @@ void nft_ctx_set_dry_run(struct nft_ctx *ctx, bool dry)
>  	ctx->check = dry;
>  }
>  
> -enum nft_numeric_level nft_ctx_output_get_numeric(struct nft_ctx *ctx)
> -{
> -	return ctx->output.numeric;
> -}
> -
> -void nft_ctx_output_set_numeric(struct nft_ctx *ctx,
> -				enum nft_numeric_level level)
> -{
> -	ctx->output.numeric = level;
> -}
> -
>  unsigned int nft_ctx_output_get_flags(struct nft_ctx *ctx)
>  {
>  	return ctx->output.flags;
> diff --git a/src/main.c b/src/main.c
> index 883261fc9d8b..952ce356490f 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -132,9 +132,7 @@ static void show_help(const char *name)
>  "  -i, --interactive		Read input from interactive CLI\n"
>  "\n"
>  "  -j, --json			Format output in JSON\n"
> -"  -n, --numeric			When specified once, show network addresses numerically (default behaviour).\n"
> -"  				Specify twice to also show Internet services (port numbers) numerically.\n"
> -"				Specify three times to also show protocols, user IDs, and group IDs numerically.\n"
> +"  -n, --numeric			Print output fully numerical.\n"
>  "  -s, --stateless		Omit stateful information of ruleset.\n"
>  "  -u, --guid			Print UID/GID as defined in /etc/passwd and /etc/group.\n"
>  "  -N				Translate IP addresses to names.\n"
> @@ -188,10 +186,9 @@ static const struct {
>  
>  int main(int argc, char * const *argv)
>  {
> +	bool interactive = false, numeric = false;
>  	char *buf = NULL, *filename = NULL;
> -	enum nft_numeric_level numeric;
>  	unsigned int output_flags = 0;
> -	bool interactive = false;
>  	unsigned int debug_mask;
>  	unsigned int len;
>  	int i, val, rc;
> @@ -229,14 +226,10 @@ int main(int argc, char * const *argv)
>  			}
>  			break;
>  		case OPT_NUMERIC:
> -			numeric = nft_ctx_output_get_numeric(nft);
> -			if (numeric == NFT_NUMERIC_ALL) {
> -				fprintf(stderr, "Too many numeric options "
> -						"used, max. %u\n",
> -					NFT_NUMERIC_ALL);
> -				exit(EXIT_FAILURE);
> -			}
> -			nft_ctx_output_set_numeric(nft, numeric + 1);
> +			numeric = true;
> +			output_flags |= (NFT_CTX_OUTPUT_NUMERIC_PROTO |
> +					 NFT_CTX_OUTPUT_NUMERIC_PRIO |
> +					 NFT_CTX_OUTPUT_NUMERIC_SYMBOL);
>  			break;
>  		case OPT_STATELESS:
>  			output_flags |= NFT_CTX_OUTPUT_STATELESS;
> @@ -298,6 +291,13 @@ int main(int argc, char * const *argv)
>  		}
>  	}
>  
> +	if (numeric &&
> +	    (output_flags &
> +		(NFT_CTX_OUTPUT_REVERSEDNS |
> +		 NFT_CTX_OUTPUT_SERVICE |
> +		 NFT_CTX_OUTPUT_GUID)))
> +		fprintf(stderr, "cannot combine `-n' with `-N', `-S', '-u'\n");
> +
>  	nft_ctx_output_set_flags(nft, output_flags);
>  
>  	if (optind != argc) {
> diff --git a/src/monitor.c b/src/monitor.c
> index b2267e1f63e4..0e735ed5b1aa 100644
> --- a/src/monitor.c
> +++ b/src/monitor.c
> @@ -835,11 +835,9 @@ static int netlink_events_newgen_cb(const struct nlmsghdr *nlh, int type,
>  	}
>  	if (genid >= 0) {
>  		nft_mon_print(monh, "# new generation %d", genid);
> -		if (pid >= 0) {
> -			nft_mon_print(monh, " by process %d", pid);
> -			if (!monh->ctx->nft->output.numeric)
> -				nft_mon_print(monh, " (%s)", name);
> -		}
> +		if (pid >= 0)
> +			nft_mon_print(monh, " by process %d (%s)", pid, name);
> +
>  		nft_mon_print(monh, "\n");
>  	}
>  
> diff --git a/tests/shell/testcases/netns/0001nft-f_0 b/tests/shell/testcases/netns/0001nft-f_0
> index 642498260e00..8344808760b7 100755
> --- a/tests/shell/testcases/netns/0001nft-f_0
> +++ b/tests/shell/testcases/netns/0001nft-f_0
> @@ -90,7 +90,7 @@ if [ $? -ne 0 ] ; then
>  	exit 1
>  fi
>  
> -KERNEL_RULESET="$($IP netns exec $NETNS_NAME $NFT list ruleset -nn)"
> +KERNEL_RULESET="$($IP netns exec $NETNS_NAME $NFT list ruleset)"
>  $IP netns del $NETNS_NAME
>  if [ "$RULESET" != "$KERNEL_RULESET" ] ; then
>          DIFF="$(which diff)"
> diff --git a/tests/shell/testcases/netns/0002loosecommands_0 b/tests/shell/testcases/netns/0002loosecommands_0
> index 3910446a5565..e62782804da4 100755
> --- a/tests/shell/testcases/netns/0002loosecommands_0
> +++ b/tests/shell/testcases/netns/0002loosecommands_0
> @@ -53,7 +53,7 @@ RULESET="table ip t {
>  	}
>  }"
>  
> -KERNEL_RULESET="$($IP netns exec $NETNS_NAME $NFT list ruleset -nn)"
> +KERNEL_RULESET="$($IP netns exec $NETNS_NAME $NFT list ruleset)"
>  $IP netns del $NETNS_NAME
>  if [ "$RULESET" != "$KERNEL_RULESET" ] ; then
>          DIFF="$(which diff)"
> diff --git a/tests/shell/testcases/netns/0003many_0 b/tests/shell/testcases/netns/0003many_0
> index 5ec4b2e4358f..61ad37bddadb 100755
> --- a/tests/shell/testcases/netns/0003many_0
> +++ b/tests/shell/testcases/netns/0003many_0
> @@ -94,7 +94,7 @@ function test_netns()
>  		exit 1
>  	fi
>  
> -	KERNEL_RULESET="$($IP netns exec $NETNS_NAME $NFT list ruleset -nn)"
> +	KERNEL_RULESET="$($IP netns exec $NETNS_NAME $NFT list ruleset)"
>  	if [ "$RULESET" != "$KERNEL_RULESET" ] ; then
>  		echo "E: ruleset in netns $NETNS_NAME differs from the loaded" >&2
>  	        DIFF="$(which diff)"
> -- 
> 2.11.0
> 



[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux