[PATCH v4 4/5] netlink: decode family name of Netlink GENERIC protocol

Dmitry V. Levin ldv at altlinux.org
Tue Jun 20 00:25:25 UTC 2017


On Mon, Jun 19, 2017 at 12:45:51PM +0900, Masatake YAMATO wrote:
> GENERIC is a protocol stacked on Netlink protocol.  Via GENERIC
> protocol, a process can communicate with a kernel subsystem.
> 
> An integer named "family" is assigned to each subsystem that can be
> communicated via GENERIC protocol. A process sets the integer to the
> type field of Netlink packet.
> 
> A subsystem registers its name to the kernel at run-time, and gets an
> integer for family. So even strace can know the integer that the
> target process uses in the communication, a user of strace cannot know
> the subsystem which the target process communicates with.
> 
> This change decodes the integer for family which is stored to the
> type field by accessing kernel at run-time.
> 
> Example session:
> 
>   $ ./strace -yy -e 'sendto' ip tcp_metrics > /dev/null
>   sendto(4<NETLINK:[GENERIC:7939]>, {{len=20, type=tcp_metrics, ...
>   +++ exited with 0 +++
> 
> type= that specifies a family in Netlink GENERIC protocol
> is decoded well.
> 
> * netlink.c (nlmsg_types): Remove const modifiers to allow to
> install a xlat table for decoding the field made at run-time.
> Add an element for NETLINK_GENERIC.
> (decode_nlmsg_type): Install the xlat table to the NETLINK_GENERIC
> element of nlmsg_types.

I've reworded this commit message, hope it's OK.

> Changes in v4:
> 
> 	* Update this log to clear the relationship between an integer
> 	for "family" and "type" field.
> 
> Signed-off-by: Masatake YAMATO <yamato at redhat.com>
> ---
>  netlink.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/netlink.c b/netlink.c
> index 4bef949..ff837f4 100644
> --- a/netlink.c
> +++ b/netlink.c
> @@ -109,6 +109,15 @@ decode_nlmsg_type_default(const struct xlat *const xlat,
>  }
>  
>  static void
> +decode_nlmsg_type_generic(const struct xlat *const xlat,
> +			  const uint16_t type,
> +			  const char *const dflt)
> +{
> +	const struct xlat *const my_xlat = genl_families_xlat();
> +	printxval(my_xlat, type, dflt);

I've replaced these two lines with a single line:
	printxval(genl_families_xlat(), type, dflt);

> +}
> +
> +static void
>  decode_nlmsg_type_netfilter(const struct xlat *const xlat,
>  			    const uint16_t type,
>  			    const char *const dflt)
> @@ -146,6 +155,11 @@ static const struct {
>  	const char *const dflt;
>  } nlmsg_types[] = {
>  	[NETLINK_AUDIT] = { NULL, nl_audit_types, "AUDIT_???" },
> +	[NETLINK_GENERIC] = {
> +		decode_nlmsg_type_generic,
> +		NULL,
> +		"GENERIC_FAMILY_???"
> +	},
>  	[NETLINK_NETFILTER] = {
>  		decode_nlmsg_type_netfilter,
>  		nl_netfilter_subsys_ids,

Applied, thanks!


-- 
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20170620/47d87be2/attachment.bin>


More information about the Strace-devel mailing list