[PATCH v1 4/6] netlink_netfilter: decode enums and flags

Dmitry V. Levin ldv at strace.io
Thu Jun 19 13:30:26 UTC 2025


On Thu, Jun 12, 2025 at 11:56:04AM +0200, Mathis Marion wrote:
> From: Mathis Marion <mathis.marion at silabs.com>
> 
> Signed-off-by: Mathis Marion <mathis.marion at silabs.com>
> ---
>  src/netlink_netfilter.c            | 131 +++++++++++++++++++++++------
>  src/xlat/nft_chain_flags.in        |   4 +
>  src/xlat/nft_cmp_ops.in            |   8 ++
>  src/xlat/nft_flowtable_flags.in    |   3 +
>  src/xlat/nft_meta_keys.in          |  38 +++++++++
>  src/xlat/nft_objects.in            |  12 +++
>  src/xlat/nft_payload_bases.in      |   7 ++
>  src/xlat/nft_payload_csum_flags.in |   2 +
>  src/xlat/nft_payload_csum_types.in |   5 ++
>  src/xlat/nft_registers.in          |  23 +++++
>  src/xlat/nft_set_elem_flags.in     |   3 +
>  src/xlat/nft_set_flags.in          |  10 +++
>  src/xlat/nft_set_policies.in       |   4 +
>  src/xlat/nft_table_flags.in        |   4 +
>  src/xlat/nft_trace_types.in        |   6 ++
>  src/xlat/nft_verdicts.in           |  12 +++
>  16 files changed, 246 insertions(+), 26 deletions(-)
>  create mode 100644 src/xlat/nft_chain_flags.in
>  create mode 100644 src/xlat/nft_cmp_ops.in
>  create mode 100644 src/xlat/nft_flowtable_flags.in
>  create mode 100644 src/xlat/nft_meta_keys.in
>  create mode 100644 src/xlat/nft_objects.in
>  create mode 100644 src/xlat/nft_payload_bases.in
>  create mode 100644 src/xlat/nft_payload_csum_flags.in
>  create mode 100644 src/xlat/nft_payload_csum_types.in
>  create mode 100644 src/xlat/nft_registers.in
>  create mode 100644 src/xlat/nft_set_elem_flags.in
>  create mode 100644 src/xlat/nft_set_flags.in
>  create mode 100644 src/xlat/nft_set_policies.in
>  create mode 100644 src/xlat/nft_table_flags.in
>  create mode 100644 src/xlat/nft_trace_types.in
>  create mode 100644 src/xlat/nft_verdicts.in
> 
> diff --git a/src/netlink_netfilter.c b/src/netlink_netfilter.c
> index f2556c0a5..8fe11882c 100644
> --- a/src/netlink_netfilter.c
> +++ b/src/netlink_netfilter.c
> @@ -14,35 +14,99 @@
>  #include "netlink.h"
>  #include <linux/netfilter/nfnetlink.h>
>  #include <linux/netfilter/nf_tables.h>
> +#include <linux/netfilter.h>
>  
>  #include "xlat/netfilter_versions.h"
>  #include "xlat/nl_netfilter_msg_types.h"
>  #include "xlat/nl_netfilter_subsys_ids.h"
> +#include "xlat/nft_chain_flags.h"
> +#include "xlat/nft_flowtable_flags.h"
>  #include "xlat/nft_chain_attrs.h"
>  #include "xlat/nft_cmp_attrs.h"
> +#include "xlat/nft_cmp_ops.h"
>  #include "xlat/nft_data_attrs.h"
>  #include "xlat/nft_expr_attrs.h"
>  #include "xlat/nft_flowtable_attrs.h"
>  #include "xlat/nft_gen_attrs.h"
>  #include "xlat/nft_obj_attrs.h"
> +#include "xlat/nft_objects.h"
>  #include "xlat/nft_immediate_attrs.h"
>  #include "xlat/nft_list_attrs.h"
>  #include "xlat/nft_lookup_attrs.h"
>  #include "xlat/nft_meta_attrs.h"
> +#include "xlat/nft_meta_keys.h"
>  #include "xlat/nft_payload_attrs.h"
> +#include "xlat/nft_registers.h"
>  #include "xlat/nft_rule_attrs.h"
>  #include "xlat/nft_set_attrs.h"
>  #include "xlat/nft_set_elem_attrs.h"
>  #include "xlat/nft_set_elem_list_attrs.h"
> +#include "xlat/nft_set_flags.h"
> +#include "xlat/nft_set_elem_flags.h"
> +#include "xlat/nft_set_policies.h"
>  #include "xlat/nft_table_attrs.h"
> +#include "xlat/nft_table_flags.h"
>  #include "xlat/nft_trace_attrs.h"
> +#include "xlat/nft_trace_types.h"
> +#include "xlat/nft_payload_bases.h"
> +#include "xlat/nft_payload_csum_flags.h"
> +#include "xlat/nft_payload_csum_types.h"
> +#include "xlat/nft_verdicts.h"
>  #include "xlat/nft_verdict_attrs.h"
>  
> +static bool decode_u32(struct tcb *tcp, kernel_ulong_t addr, unsigned int len,
> +		       const struct xlat *xlat, const char *dflt, bool is_flags)
> +{
> +	uint32_t val;
> +
> +	if (len < sizeof(val))
> +		return false;
> +	else if (!umove_or_printaddr(tcp, addr, &val)) {
> +		tprints_arg_begin("htonl");
> +		if (is_flags)
> +			printflags(xlat, ntohl(val), dflt);
> +		else
> +			printxval(xlat, ntohl(val), dflt);
> +		tprint_arg_end();
> +	}
> +	return true;
> +}
> +
> +#define DEFINE_U32_DECODER(name, xlat, dflt, is_flags) \
> +	static bool decode_##name(struct tcb *tcp, \
> +				  kernel_ulong_t addr, \
> +				  unsigned int len, \
> +				  const void *opaque_data) \
> +	{ \
> +		return decode_u32(tcp, addr, len, xlat, dflt, is_flags); \
> +	}
> +
> +#define DEFINE_ENUM_DECODER(name, xlat, dflt) \
> +	DEFINE_U32_DECODER(name, xlat, dflt, false)
> +#define DEFINE_FLAGS_DECODER(name, xlat, dflt) \
> +	DEFINE_U32_DECODER(name, xlat, dflt, true)
> +
> +DEFINE_ENUM_DECODER(reg,			nft_registers,		"NFT_REG_???")

Could we harmonize the naming so that names of functions would be made from
table names by prepending "decode_" prefix?


-- 
ldv


More information about the Strace-devel mailing list