From 0ca787b5ba2c4394ed835442a4b9312915156c2a Mon Sep 17 00:00:00 2001 From: JingPiao Chen Date: Sun, 13 Aug 2017 10:22:21 +0800 Subject: [PATCH] netlink: add a basic rtnetlink parser of route messages * defs.h (routing_scopes): New xlat prototype. * rtnl_route.c: New file. * Makefile.am (strace_SOURCES): Add it. * netlink_route.h (decode_rtmsg): New prototype. * netlink_route.c (route_decoders): Add RTM_DELROUTE, RTM_GETROUTE, and RTM_NEWROUTE. * xlat/ip_type_of_services.in: New file. * xlat/routing_flags.in: Likewise. * xlat/routing_protocols.in: Likewise. * xlat/routing_table_ids.in: Likewise. * xlat/routing_types.in: Likewise. Co-authored-by: Fabien Siron --- Makefile.am | 1 + defs.h | 1 + netlink_route.c | 6 ++- netlink_route.h | 1 + rtnl_route.c | 74 +++++++++++++++++++++++++++++++++++++ xlat/ip_type_of_services.in | 4 ++ xlat/routing_flags.in | 5 +++ xlat/routing_protocols.in | 16 ++++++++ xlat/routing_table_ids.in | 5 +++ xlat/routing_types.in | 12 ++++++ 10 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 rtnl_route.c create mode 100644 xlat/ip_type_of_services.in create mode 100644 xlat/routing_flags.in create mode 100644 xlat/routing_protocols.in create mode 100644 xlat/routing_table_ids.in create mode 100644 xlat/routing_types.in diff --git a/Makefile.am b/Makefile.am index ff11a914..cea4d94a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -249,6 +249,7 @@ strace_SOURCES = \ rtc.c \ rtnl_addr.c \ rtnl_link.c \ + rtnl_route.c \ sched.c \ sched_attr.h \ scsi.c \ diff --git a/defs.h b/defs.h index 2efbfa36..8ce28c4f 100644 --- a/defs.h +++ b/defs.h @@ -298,6 +298,7 @@ extern const struct xlat nl_route_types[]; extern const struct xlat open_access_modes[]; extern const struct xlat open_mode_flags[]; extern const struct xlat resource_flags[]; +extern const struct xlat routing_scopes[]; extern const struct xlat setns_types[]; extern const struct xlat sg_io_info[]; extern const struct xlat socketlayers[]; diff --git a/netlink_route.c b/netlink_route.c index 5e3ed24c..e32d832b 100644 --- a/netlink_route.c +++ b/netlink_route.c @@ -61,7 +61,11 @@ static const netlink_route_decoder_t route_decoders[] = { [RTM_GETADDR - RTM_BASE] = decode_ifaddrmsg, [RTM_GETANYCAST - RTM_BASE] = decode_ifaddrmsg, [RTM_GETMULTICAST - RTM_BASE] = decode_ifaddrmsg, - [RTM_NEWADDR - RTM_BASE] = decode_ifaddrmsg + [RTM_NEWADDR - RTM_BASE] = decode_ifaddrmsg, + + [RTM_DELROUTE - RTM_BASE] = decode_rtmsg, + [RTM_GETROUTE - RTM_BASE] = decode_rtmsg, + [RTM_NEWROUTE - RTM_BASE] = decode_rtmsg }; bool diff --git a/netlink_route.h b/netlink_route.h index f644d612..02d37899 100644 --- a/netlink_route.h +++ b/netlink_route.h @@ -41,5 +41,6 @@ route_decode_name(struct tcb *tcp, \ extern DECL_NETLINK_ROUTE_DECODER(decode_ifaddrmsg); extern DECL_NETLINK_ROUTE_DECODER(decode_ifinfomsg); +extern DECL_NETLINK_ROUTE_DECODER(decode_rtmsg); #endif /* !STRACE_NETLINK_ROUTE_H */ diff --git a/rtnl_route.c b/rtnl_route.c new file mode 100644 index 00000000..f25d0382 --- /dev/null +++ b/rtnl_route.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2016 Fabien Siron + * Copyright (c) 2017 JingPiao Chen + * Copyright (c) 2016-2017 The strace developers. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "defs.h" +#include "netlink_route.h" +#include "print_fields.h" + +#include +#include "netlink.h" +#include + +#include "xlat/ip_type_of_services.h" +#include "xlat/routing_flags.h" +#include "xlat/routing_protocols.h" +#include "xlat/routing_table_ids.h" +#include "xlat/routing_types.h" + +DECL_NETLINK_ROUTE_DECODER(decode_rtmsg) +{ + struct rtmsg rtmsg = { .rtm_family = family }; + const size_t offset = sizeof(rtmsg.rtm_family); + + PRINT_FIELD_XVAL("{", rtmsg, rtm_family, addrfams, "AF_???"); + + tprints(", "); + if (len >= sizeof(rtmsg)) { + if (!umoven_or_printaddr(tcp, addr + offset, + sizeof(rtmsg) - offset, + (void *) &rtmsg + offset)) { + PRINT_FIELD_U("", rtmsg, rtm_dst_len); + PRINT_FIELD_U(", ", rtmsg, rtm_src_len); + PRINT_FIELD_FLAGS(", ", rtmsg, rtm_tos, + ip_type_of_services, "IPTOS_TOS_???"); + PRINT_FIELD_XVAL(", ", rtmsg, rtm_table, + routing_table_ids, NULL); + PRINT_FIELD_XVAL(", ", rtmsg, rtm_protocol, + routing_protocols, "RTPROT_???"); + PRINT_FIELD_XVAL(", ", rtmsg, rtm_scope, + routing_scopes, NULL); + PRINT_FIELD_XVAL(", ", rtmsg, rtm_type, + routing_types, "RTN_???"); + PRINT_FIELD_FLAGS(", ", rtmsg, rtm_flags, + routing_flags, "RTM_F_???"); + } + } else + tprints("..."); + tprints("}"); +} diff --git a/xlat/ip_type_of_services.in b/xlat/ip_type_of_services.in new file mode 100644 index 00000000..41c526a1 --- /dev/null +++ b/xlat/ip_type_of_services.in @@ -0,0 +1,4 @@ +IPTOS_LOWDELAY +IPTOS_THROUGHPUT +IPTOS_RELIABILITY +IPTOS_MINCOST diff --git a/xlat/routing_flags.in b/xlat/routing_flags.in new file mode 100644 index 00000000..fe66b678 --- /dev/null +++ b/xlat/routing_flags.in @@ -0,0 +1,5 @@ +RTM_F_NOTIFY +RTM_F_CLONED +RTM_F_EQUALIZE +RTM_F_PREFIX +RTM_F_LOOKUP_TABLE diff --git a/xlat/routing_protocols.in b/xlat/routing_protocols.in new file mode 100644 index 00000000..d366b670 --- /dev/null +++ b/xlat/routing_protocols.in @@ -0,0 +1,16 @@ +RTPROT_UNSPEC +RTPROT_REDIRECT +RTPROT_KERNEL +RTPROT_BOOT +RTPROT_STATIC +RTPROT_GATED +RTPROT_RA +RTPROT_MRT +RTPROT_ZEBRA +RTPROT_BIRD +RTPROT_DNROUTED +RTPROT_XORP +RTPROT_NTK +RTPROT_DHCP +RTPROT_MROUTED +RTPROT_BABEL diff --git a/xlat/routing_table_ids.in b/xlat/routing_table_ids.in new file mode 100644 index 00000000..6a1f7977 --- /dev/null +++ b/xlat/routing_table_ids.in @@ -0,0 +1,5 @@ +RT_TABLE_UNSPEC 0 +RT_TABLE_COMPAT 252 +RT_TABLE_DEFAULT 253 +RT_TABLE_MAIN 254 +RT_TABLE_LOCAL 255 diff --git a/xlat/routing_types.in b/xlat/routing_types.in new file mode 100644 index 00000000..f7079d4e --- /dev/null +++ b/xlat/routing_types.in @@ -0,0 +1,12 @@ +RTN_UNSPEC 0 +RTN_UNICAST 1 +RTN_LOCAL 2 +RTN_BROADCAST 3 +RTN_ANYCAST 4 +RTN_MULTICAST 5 +RTN_BLACKHOLE 6 +RTN_UNREACHABLE 7 +RTN_PROHIBIT 8 +RTN_THROW 9 +RTN_NAT 10 +RTN_XRESOLVE 11 -- 2.40.0