3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-11-26 02:19:26 +01:00

monitor: Improve RTM_NEWADDR/GETADDR/DELADDR decoding

This commit is contained in:
Denis Kenzior 2020-10-05 22:41:12 -05:00
parent e9179c4270
commit 84e32ba448

View File

@ -6585,6 +6585,28 @@ static void print_link_mode(unsigned int indent, const char *str,
link_mode_to_ascii(link_mode), link_mode); link_mode_to_ascii(link_mode), link_mode);
} }
static void flags_str(const struct flag_names *table,
char *str, size_t size, uint16_t flags)
{
int pos, i;
pos = sprintf(str, "(0x%02x)", flags);
if (!flags)
return;
pos += sprintf(str + pos, " [");
for (i = 0; table[i].name; i++) {
if (flags & table[i].flag) {
flags &= ~table[i].flag;
pos += sprintf(str + pos, "%s%s", table[i].name,
flags ? "," : "");
}
}
pos += sprintf(str + pos, "]");
}
static struct attr_entry link_info_entry[] = { static struct attr_entry link_info_entry[] = {
{ IFLA_INFO_KIND, "Kind", ATTR_STRING }, { IFLA_INFO_KIND, "Kind", ATTR_STRING },
{ }, { },
@ -6619,6 +6641,36 @@ static struct attr_entry info_entry[] = {
{ }, { },
}; };
static struct flag_names ifa_flags[] = {
{ IFA_F_SECONDARY, "temporary" },
{ IFA_F_NODAD, "nodad" },
{ IFA_F_OPTIMISTIC, "optimistic" },
{ IFA_F_DADFAILED, "dadfailed" },
{ IFA_F_HOMEADDRESS, "homeaddress" },
{ IFA_F_DEPRECATED, "deprecated" },
{ IFA_F_TENTATIVE, "tentative" },
{ IFA_F_PERMANENT, "permanent" },
{ IFA_F_MANAGETEMPADDR, "managetempaddr" },
{ IFA_F_NOPREFIXROUTE, "noprefixroute" },
{ IFA_F_MCAUTOJOIN, "mcautojoin" },
{ IFA_F_STABLE_PRIVACY, "stableprivacy" },
{ },
};
static void print_ifa_flags(unsigned int indent, const char *str,
const void *buf, uint16_t size)
{
uint32_t flags;
char str_flags[1024];
if (size != 4)
return;
flags = l_get_u32(buf);
flags_str(ifa_flags, str_flags, sizeof(str_flags), flags);
print_attr(indent, "%s: %s", str, str_flags);
}
static void print_inet_addr(unsigned int indent, const char *str, static void print_inet_addr(unsigned int indent, const char *str,
const void *buf, uint16_t size) const void *buf, uint16_t size)
{ {
@ -6642,6 +6694,8 @@ static struct attr_entry addr_entry[] = {
{ .function = print_inet_addr } }, { .function = print_inet_addr } },
{ IFA_LABEL, "Label", ATTR_STRING }, { IFA_LABEL, "Label", ATTR_STRING },
{ IFA_CACHEINFO, "CacheInfo", ATTR_BINARY }, { IFA_CACHEINFO, "CacheInfo", ATTR_BINARY },
{ IFA_FLAGS, "Flags", ATTR_CUSTOM,
{ .function = print_ifa_flags } },
{ }, { },
}; };
@ -6792,28 +6846,18 @@ static void print_rtnl_attributes(int indent, const struct attr_entry *table,
} }
} }
static void flags_str(const struct flag_names *table, static const char *family_to_string(uint8_t family)
char *str, size_t size, uint16_t flags)
{ {
int pos, i; switch (family) {
case AF_INET:
pos = sprintf(str, "(0x%02x)", flags); return "AF_INET";
if (!flags) case AF_INET6:
return; return "AF_INET6";
default:
pos += sprintf(str + pos, " ["); return "Unknown";
for (i = 0; table[i].name; i++) {
if (flags & table[i].flag) {
flags &= ~table[i].flag;
pos += sprintf(str + pos, "%s%s", table[i].name,
flags ? "," : "");
} }
} }
pos += sprintf(str + pos, "]");
}
static void print_ifinfomsg(const struct ifinfomsg *info) static void print_ifinfomsg(const struct ifinfomsg *info)
{ {
static struct flag_names iff_flags[] = { static struct flag_names iff_flags[] = {
@ -6841,7 +6885,7 @@ static void print_ifinfomsg(const struct ifinfomsg *info)
if (!info) if (!info)
return; return;
print_field("IFLA Family: %u", info->ifi_family); print_field("IFLA Family: %s", family_to_string(info->ifi_family));
print_field("IFLA Type: %u", info->ifi_type); print_field("IFLA Type: %u", info->ifi_type);
print_field("IFLA Index: %d", info->ifi_index); print_field("IFLA Index: %d", info->ifi_index);
print_field("IFLA ChangeMask: %u", info->ifi_change); print_field("IFLA ChangeMask: %u", info->ifi_change);
@ -6851,14 +6895,17 @@ static void print_ifinfomsg(const struct ifinfomsg *info)
static void print_ifaddrmsg(const struct ifaddrmsg *addr) static void print_ifaddrmsg(const struct ifaddrmsg *addr)
{ {
char str[1024];
if (!addr) if (!addr)
return; return;
print_field("IFA Family: %u", addr->ifa_family); print_field("IFA Family: %s", family_to_string(addr->ifa_family));
print_field("IFA Prefixlen: %u", addr->ifa_prefixlen); print_field("IFA Prefixlen: %u", addr->ifa_prefixlen);
print_field("IFA Index: %d", addr->ifa_index); print_field("IFA Index: %d", addr->ifa_index);
print_field("IFA Scope: %s", scope_to_string(addr->ifa_scope)); print_field("IFA Scope: %s", scope_to_string(addr->ifa_scope));
print_field("IFA Flags: %u", addr->ifa_flags); flags_str(ifa_flags, str, sizeof(str), addr->ifa_flags);
print_field("IFA Flags: %s", str);
} }
static void print_rtmsg(const struct rtmsg *msg) static void print_rtmsg(const struct rtmsg *msg)
@ -6981,6 +7028,16 @@ static void print_rtm_route(uint16_t type, const struct rtmsg *msg, size_t len)
print_rtnl_attributes(1, route_entry, RTM_RTA(msg), len); print_rtnl_attributes(1, route_entry, RTM_RTA(msg), len);
} }
static void print_rtm_addr(uint16_t type, const struct ifaddrmsg *msg,
size_t len)
{
if (!msg || len < sizeof(struct ifaddrmsg))
return;
print_ifaddrmsg(msg);
print_rtnl_attributes(1, addr_entry, IFA_RTA(msg), len);
}
static const char *nlmsg_type_to_str(uint32_t msg_type) static const char *nlmsg_type_to_str(uint32_t msg_type)
{ {
const char *str = NULL; const char *str = NULL;
@ -7139,8 +7196,7 @@ static void print_rtnl_msg(const struct timeval *tv,
return; return;
print_nlmsghdr(tv, nlmsg); print_nlmsghdr(tv, nlmsg);
print_ifaddrmsg(addr); print_rtm_addr(nlmsg->nlmsg_type, addr, len);
print_rtnl_attributes(1, addr_entry, IFA_RTA(addr), len);
break; break;
} }
} }