From: JingPiao Chen Date: Tue, 22 Aug 2017 06:45:48 +0000 (+0800) Subject: rtnl_addr: decode ifaddrmsg netlink attributes X-Git-Tag: v4.19~73 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f076c7866790012c7c56c7b1ddd022aaf840c874;p=strace rtnl_addr: decode ifaddrmsg netlink attributes * rtnl_addr.c (decode_ifa_address, decode_ifa_cacheinfo, decode_ifa_flags): New functions. (ifaddrmsg_nla_decoders): New array. (decode_ifaddrmsg): Use it. --- diff --git a/rtnl_addr.c b/rtnl_addr.c index c7e37eab..a05cfbed 100644 --- a/rtnl_addr.c +++ b/rtnl_addr.c @@ -42,6 +42,67 @@ #include "xlat/routing_scopes.h" #include "xlat/rtnl_addr_attrs.h" +static bool +decode_ifa_address(struct tcb *const tcp, + const kernel_ulong_t addr, + const unsigned int len, + const void *const opaque_data) +{ + const struct ifaddrmsg *const ifaddr = opaque_data; + + decode_inet_addr(tcp, addr, len, ifaddr->ifa_family, NULL); + + return true; +} + +static bool +decode_ifa_cacheinfo(struct tcb *const tcp, + const kernel_ulong_t addr, + const unsigned int len, + const void *const opaque_data) +{ + struct ifa_cacheinfo ci; + + if (len < sizeof(ci)) + return false; + else if (!umove_or_printaddr(tcp, addr, &ci)) { + PRINT_FIELD_U("{", ci, ifa_prefered); + PRINT_FIELD_U(", ", ci, ifa_valid); + PRINT_FIELD_U(", ", ci, cstamp); + PRINT_FIELD_U(", ", ci, tstamp); + tprintf("}"); + } + + return true; +} + +static bool +decode_ifa_flags(struct tcb *const tcp, + const kernel_ulong_t addr, + const unsigned int len, + const void *const opaque_data) +{ + uint32_t ifa_flags; + + if (len < sizeof(ifa_flags)) + return false; + else if (!umove_or_printaddr(tcp, addr, &ifa_flags)) + printflags(ifaddrflags, ifa_flags, "IFA_F_???"); + + return true; +} + +static const nla_decoder_t ifaddrmsg_nla_decoders[] = { + [IFA_ADDRESS] = decode_ifa_address, + [IFA_LOCAL] = decode_ifa_address, + [IFA_LABEL] = decode_nla_str, + [IFA_BROADCAST] = decode_ifa_address, + [IFA_ANYCAST] = decode_ifa_address, + [IFA_CACHEINFO] = decode_ifa_cacheinfo, + [IFA_MULTICAST] = decode_ifa_address, + [IFA_FLAGS] = decode_ifa_flags +}; + DECL_NETLINK_ROUTE_DECODER(decode_ifaddrmsg) { struct ifaddrmsg ifaddr = { .ifa_family = family }; @@ -71,6 +132,8 @@ DECL_NETLINK_ROUTE_DECODER(decode_ifaddrmsg) if (decode_nla && len > offset) { tprints(", "); decode_nlattr(tcp, addr + offset, len - offset, - rtnl_addr_attrs, "IFA_???", NULL, 0, NULL); + rtnl_addr_attrs, "IFA_???", + ifaddrmsg_nla_decoders, + ARRAY_SIZE(ifaddrmsg_nla_decoders), &ifaddr); } }