[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