[PATCH v2 7/8] netlink: add a basic rtnetlink parser of link messages

Dmitry V. Levin ldv at altlinux.org
Tue Aug 8 23:38:24 UTC 2017


On Tue, Aug 01, 2017 at 07:48:47AM +0800, JingPiao Chen wrote:
> * netlink_route.h: New file.
> * rtnl_link.c: Likewise.
> * Makefile.am (strace_SOURCES): Add them.
> * defs.h (arp_hardware_types, iffflags): New xlat prototypes.
> * netlink_route.c: Include "netlink_route.h"
> and <linux/rtnetlink.h>.
> (netlink_route_decoder_t): New typedef.
> (route_decoders): New array.
> (decode_netlink_route): Use it.
> 
> Co-authored-by: Fabien Siron <fabien.siron at epita.fr>
> ---
>  Makefile.am     |  2 ++
>  defs.h          |  2 ++
>  netlink_route.c | 24 ++++++++++++++++++++++--
>  netlink_route.h | 44 +++++++++++++++++++++++++++++++++++++++++++
>  rtnl_link.c     | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 128 insertions(+), 2 deletions(-)
>  create mode 100644 netlink_route.h
>  create mode 100644 rtnl_link.c
> 
> diff --git a/Makefile.am b/Makefile.am
> index d10811c..5981f4c 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -189,6 +189,7 @@ strace_SOURCES =	\
>  	netlink_netlink_diag.c \
>  	netlink_packet_diag.c \
>  	netlink_route.c	\
> +	netlink_route.h	\
>  	netlink_selinux.c \
>  	netlink_smc_diag.c \
>  	netlink_sock_diag.c \
> @@ -242,6 +243,7 @@ strace_SOURCES =	\
>  	rt_sigframe.c	\
>  	rt_sigreturn.c	\
>  	rtc.c		\
> +	rtnl_link.c	\
>  	sched.c		\
>  	sched_attr.h	\
>  	scsi.c		\
> diff --git a/defs.h b/defs.h
> index d70323c..3da1184 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -282,11 +282,13 @@ struct tcb {
>  #include "xlat.h"
>  
>  extern const struct xlat addrfams[];
> +extern const struct xlat arp_hardware_types[];
>  extern const struct xlat at_flags[];
>  extern const struct xlat clocknames[];
>  extern const struct xlat dirent_types[];
>  extern const struct xlat ethernet_protocols[];
>  extern const struct xlat evdev_abs[];
> +extern const struct xlat iffflags[];
>  extern const struct xlat inet_protocols[];
>  extern const struct xlat msg_flags[];
>  extern const struct xlat netlink_protocols[];
> diff --git a/netlink_route.c b/netlink_route.c
> index dc5a13f..c6338fd 100644
> --- a/netlink_route.c
> +++ b/netlink_route.c
> @@ -29,6 +29,9 @@
>  
>  #include "defs.h"
>  #include "netlink.h"
> +#include "netlink_route.h"
> +
> +#include <linux/rtnetlink.h>
>  
>  #include "xlat/nl_route_types.h"
>  
> @@ -46,19 +49,36 @@ decode_family(struct tcb *const tcp, const uint8_t family,
>  	tprints("}");
>  }
>  
> +typedef DECL_NETLINK_ROUTE_DECODER((*netlink_route_decoder_t));
> +
> +static const netlink_route_decoder_t route_decoders[] = {
> +	[RTM_DELLINK - RTM_BASE] = decode_ifinfomsg,
> +	[RTM_GETLINK - RTM_BASE] = decode_ifinfomsg,
> +	[RTM_NEWLINK - RTM_BASE] = decode_ifinfomsg,
> +	[RTM_SETLINK - RTM_BASE] = decode_ifinfomsg
> +};
> +
>  bool
>  decode_netlink_route(struct tcb *const tcp,
>  		     const struct nlmsghdr *const nlmsghdr,
>  		     const kernel_ulong_t addr,
>  		     const unsigned int len)
>  {
> +	unsigned int type = nlmsghdr->nlmsg_type;
>  	uint8_t family;
>  
>  	if (nlmsghdr->nlmsg_type == NLMSG_DONE)
>  		return false;
>  
> -	if (!umove_or_printaddr(tcp, addr, &family))
> -		decode_family(tcp, family, addr, len);
> +	if (!umove_or_printaddr(tcp, addr, &family)) {
> +		if (type >= RTM_BASE
> +		    && type - RTM_BASE < ARRAY_SIZE(route_decoders)
> +		    && route_decoders[type - RTM_BASE]) {
> +			route_decoders[type - RTM_BASE](tcp, nlmsghdr,
> +							family, addr, len);

What if you assigned "type - RTM_BASE" to a variable and used it instead?


-- 
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/20170809/cd8ac94e/attachment.bin>


More information about the Strace-devel mailing list