diff --git a/monitor/nlmon.c b/monitor/nlmon.c index d036d5f1..b4578c85 100644 --- a/monitor/nlmon.c +++ b/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); } +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[] = { { 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, const void *buf, uint16_t size) { @@ -6642,6 +6694,8 @@ static struct attr_entry addr_entry[] = { { .function = print_inet_addr } }, { IFA_LABEL, "Label", ATTR_STRING }, { IFA_CACHEINFO, "CacheInfo", ATTR_BINARY }, + { IFA_FLAGS, "Flags", ATTR_CUSTOM, + { .function = print_ifa_flags } }, { }, }; @@ -6792,26 +6846,16 @@ static void print_rtnl_attributes(int indent, const struct attr_entry *table, } } -static void flags_str(const struct flag_names *table, - char *str, size_t size, uint16_t flags) +static const char *family_to_string(uint8_t family) { - 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 ? "," : ""); - } + switch (family) { + case AF_INET: + return "AF_INET"; + case AF_INET6: + return "AF_INET6"; + default: + return "Unknown"; } - - pos += sprintf(str + pos, "]"); } static void print_ifinfomsg(const struct ifinfomsg *info) @@ -6841,7 +6885,7 @@ static void print_ifinfomsg(const struct ifinfomsg *info) if (!info) 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 Index: %d", info->ifi_index); 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) { + char str[1024]; + if (!addr) 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 Index: %d", addr->ifa_index); 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) @@ -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); } +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) { const char *str = NULL; @@ -7139,8 +7196,7 @@ static void print_rtnl_msg(const struct timeval *tv, return; print_nlmsghdr(tv, nlmsg); - print_ifaddrmsg(addr); - print_rtnl_attributes(1, addr_entry, IFA_RTA(addr), len); + print_rtm_addr(nlmsg->nlmsg_type, addr, len); break; } }