X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=src%2Fnetwork%2Fnetworkd-link.c;h=248022133f475a00bc65a66d749f32aee708cf6e;hb=2c36be2f4ba38f9097cdcdcd1e724ffa46da12c7;hp=908d834cd44e602e38df67182fc4b08bea9391ba;hpb=d3df0e3982777fd5de8cffaa585eba0af3773c08;p=elogind.git diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 908d834cd..248022133 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -380,7 +380,8 @@ void link_client_handler(Link *link) { if (!link->dhcp4_configured) return; - link_enter_configured(link); + if (link->state != LINK_STATE_CONFIGURED) + link_enter_configured(link); return; } @@ -1336,6 +1337,8 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, _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; @@ -1419,6 +1422,17 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, 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); @@ -1434,11 +1448,13 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, 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; @@ -1448,14 +1464,16 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, 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: @@ -1703,9 +1721,17 @@ int link_save(Link *link) { admin_state, oper_state); if (link->network) { - char **address; + char **address, **domain; + bool space; fputs("DNS=", f); + space = false; + STRV_FOREACH(address, link->network->dns) { + if (space) + fputc(' ', f); + fputs(*address, f); + space = true; + } if (link->network->dhcp_dns && link->dhcp_lease) { @@ -1713,19 +1739,22 @@ int link_save(Link *link) { r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses); if (r > 0) { + if (space) + fputc(' ', f); serialize_in_addrs(f, addresses, r); - if (link->network->dns) - fputs(" ", f); } } - STRV_FOREACH(address, link->network->dns) - fprintf(f, "%s%s", *address, - (address + 1 ? " " : "")); - fputs("\n", f); fprintf(f, "NTP="); + space = false; + STRV_FOREACH(address, link->network->ntp) { + if (space) + fputc(' ', f); + fputs(*address, f); + space = true; + } if (link->network->dhcp_ntp && link->dhcp_lease) { @@ -1733,18 +1762,40 @@ int link_save(Link *link) { r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses); if (r > 0) { + if (space) + fputc(' ', f); serialize_in_addrs(f, addresses, r); - if (link->network->ntp) - fputs(" ", f); } } - STRV_FOREACH(address, link->network->ntp) - fprintf(f, "%s%s", *address, - (address + 1 ? " " : "")); + fputs("\n", f); + + fprintf(f, "DOMAINS="); + space = false; + STRV_FOREACH(domain, link->network->domains) { + if (space) + fputc(' ', f); + fputs(*domain, f); + space = true; + } + + if (link->network->dhcp_domains && + link->dhcp_lease) { + const char *domainname; + + r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname); + if (r >= 0) { + if (space) + fputc(' ', f); + fputs(domainname, f); + } + } fputs("\n", f); + fprintf(f, "WILDCARD_DOMAIN=%s\n", + yes_no(link->network->wildcard_domain)); + fprintf(f, "LLMNR=%s\n", llmnr_support_to_string(link->network->llmnr)); }