network: show address flag in debugging logs

This commit is contained in:
Yu Watanabe
2021-06-07 23:02:56 +09:00
parent b2c7d1bbc2
commit a23624846f
+45 -3
View File
@@ -19,6 +19,45 @@
#define ADDRESSES_PER_LINK_MAX 2048U
#define STATIC_ADDRESSES_PER_NETWORK_MAX 1024U
static int address_flags_to_string_alloc(uint32_t flags, int family, char **ret) {
_cleanup_free_ char *str = NULL;
static const struct {
uint32_t flag;
const char *name;
} map[] = {
{ IFA_F_SECONDARY, "secondary" }, /* This is also called "temporary" for ipv6. */
{ IFA_F_NODAD, "nodad" },
{ IFA_F_OPTIMISTIC, "optimistic" },
{ IFA_F_DADFAILED, "dadfailed" },
{ IFA_F_HOMEADDRESS, "home-address" },
{ IFA_F_DEPRECATED, "deprecated" },
{ IFA_F_TENTATIVE, "tentative" },
{ IFA_F_PERMANENT, "permanent" },
{ IFA_F_MANAGETEMPADDR, "manage-temporary-address" },
{ IFA_F_NOPREFIXROUTE, "no-prefixroute" },
{ IFA_F_MCAUTOJOIN, "auto-join" },
{ IFA_F_STABLE_PRIVACY, "stable-privacy" },
};
assert(IN_SET(family, AF_INET, AF_INET6));
assert(ret);
for (size_t i = 0; i < ELEMENTSOF(map); i++) {
if (!FLAGS_SET(flags, map[i].flag))
continue;
if (map[i].flag == IFA_F_SECONDARY && family == AF_INET6) {
if (!strextend_with_separator(&str, ",", "temporary"))
return -ENOMEM;
} else {
if (!strextend_with_separator(&str, ",", map[i].name))
return -ENOMEM;
}
}
*ret = TAKE_PTR(str);
return 0;
}
int generate_ipv6_eui_64_address(const Link *link, struct in6_addr *ret) {
assert(link);
assert(ret);
@@ -586,7 +625,7 @@ int manager_has_address(Manager *manager, int family, const union in_addr_union
}
static void log_address_debug(const Address *address, const char *str, const Link *link) {
_cleanup_free_ char *addr = NULL, *peer = NULL;
_cleanup_free_ char *addr = NULL, *peer = NULL, *flags_str = NULL;
char valid_buf[FORMAT_TIMESPAN_MAX], preferred_buf[FORMAT_TIMESPAN_MAX];
const char *valid_str = NULL, *preferred_str = NULL;
bool has_peer;
@@ -613,11 +652,14 @@ static void log_address_debug(const Address *address, const char *str, const Lin
address->cinfo.ifa_prefered * USEC_PER_SEC,
USEC_PER_SEC);
log_link_debug(link, "%s address: %s%s%s/%u (valid %s%s, preferred %s%s)",
(void) address_flags_to_string_alloc(address->flags, address->family, &flags_str);
log_link_debug(link, "%s address: %s%s%s/%u (valid %s%s, preferred %s%s), flags: %s",
str, strnull(addr), has_peer ? " peer " : "",
has_peer ? strnull(peer) : "", address->prefixlen,
valid_str ? "for " : "forever", strempty(valid_str),
preferred_str ? "for " : "forever", strempty(preferred_str));
preferred_str ? "for " : "forever", strempty(preferred_str),
strna(flags_str));
}
static int address_set_netlink_message(const Address *address, sd_netlink_message *req, Link *link) {