if (!link->dhcp4_configured)
return;
- link_enter_configured(link);
+ if (link->state != LINK_STATE_CONFIGURED)
+ link_enter_configured(link);
return;
}
_cleanup_address_free_ Address *address = NULL;
Address *ad;
char buf[INET6_ADDRSTRLEN];
+ char valid_buf[FORMAT_TIMESPAN_MAX];
+ const char *valid_str = NULL;
bool address_dropped = false;
int r, ifindex;
return 0;
}
+ r = sd_rtnl_message_read_cache_info(message, IFA_CACHEINFO,
+ &address->cinfo);
+ if (r >= 0) {
+ if (address->cinfo.ifa_valid == CACHE_INFO_INFINITY_LIFE_TIME)
+ valid_str = "ever";
+ else
+ valid_str = format_timespan(valid_buf, FORMAT_TIMESPAN_MAX,
+ address->cinfo.ifa_valid * USEC_PER_SEC,
+ USEC_PER_SEC);
+ }
+
LIST_FOREACH(addresses, ad, link->addresses) {
if (address_equal(ad, address)) {
LIST_REMOVE(addresses, link->addresses, ad);
switch (type) {
case RTM_NEWADDR:
if (!address_dropped)
- log_debug_link(link, "added address: %s/%u", buf,
- address->prefixlen);
+ log_debug_link(link, "added address: %s/%u (valid for %s)",
+ buf, address->prefixlen,
+ strna(valid_str));
else
- log_debug_link(link, "updated address: %s/%u", buf,
- address->prefixlen);
+ log_debug_link(link, "updated address: %s/%u (valid for %s)",
+ buf, address->prefixlen,
+ strna(valid_str));
LIST_PREPEND(addresses, link->addresses, address);
address = NULL;
break;
case RTM_DELADDR:
if (address_dropped) {
- log_debug_link(link, "removed address: %s/%u", buf,
- address->prefixlen);
+ log_debug_link(link, "removed address: %s/%u (valid for %s)",
+ buf, address->prefixlen,
+ strna(valid_str));
link_save(link);
} else
log_warning_link(link,
- "removing non-existent address: %s/%u",
- buf, address->prefixlen);
+ "removing non-existent address: %s/%u (valid for %s)",
+ buf, address->prefixlen,
+ strna(valid_str));
break;
default:
/* no useful addresses found */
link->operstate = LINK_OPERSTATE_CARRIER;
} else if (link->flags & IFF_UP)
- link->operstate = LINK_OPERSTATE_UP;
+ link->operstate = LINK_OPERSTATE_NO_CARRIER;
else
- link->operstate = LINK_OPERSTATE_DOWN;
+ link->operstate = LINK_OPERSTATE_OFF;
}
int link_save(Link *link) {
if (link->network) {
char **address;
+ char **domain;
fputs("DNS=", f);
fputs("\n", f);
+ fprintf(f, "DOMAINS=");
+
+ if (link->network->dhcp_domains &&
+ link->dhcp_lease) {
+ const char *domainname;
+
+ r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
+ if (r >= 0) {
+ fputs(domainname, f);
+ if (link->network->domains)
+ fputs(" ", f);
+ }
+ }
+
+ STRV_FOREACH(domain, link->network->domains)
+ fprintf(f, "%s%s", *domain,
+ (domain + 1 ? " " : ""));
+
+ fputs("\n", f);
+
fprintf(f, "LLMNR=%s\n",
llmnr_support_to_string(link->network->llmnr));
}
DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState);
static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = {
- [LINK_OPERSTATE_DOWN] = "down",
- [LINK_OPERSTATE_UP] = "up",
+ [LINK_OPERSTATE_OFF] = "off",
+ [LINK_OPERSTATE_NO_CARRIER] = "no-carrier",
[LINK_OPERSTATE_DORMANT] = "dormant",
[LINK_OPERSTATE_CARRIER] = "carrier",
[LINK_OPERSTATE_DEGRADED] = "degraded",