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:
parent
e9179c4270
commit
84e32ba448
102
monitor/nlmon.c
102
monitor/nlmon.c
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user