From f076c7866790012c7c56c7b1ddd022aaf840c874 Mon Sep 17 00:00:00 2001 From: JingPiao Chen Date: Tue, 22 Aug 2017 14:45:48 +0800 Subject: [PATCH] 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. --- rtnl_addr.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) 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); } } -- 2.40.0