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.
This commit is contained in:
parent
89cab1f000
commit
f076c78667
65
rtnl_addr.c
65
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);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user