X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-link.c;h=11ac1307d88ccb85302487a33debcf5745acf99c;hb=84b5b79a8f7b423c5b7cad4170eb68d57fe5e26c;hp=1b7b1898c4e13bd4907ea2a5e353a3e94435a59e;hpb=51d18171529dcdad1366e422e42d538434af0ff6;p=elogind.git diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 1b7b1898c..11ac1307d 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -35,6 +35,46 @@ #include "dhcp-lease-internal.h" +static bool link_dhcp6_enabled(Link *link) { + if (link->flags & IFF_LOOPBACK) + return false; + + if (!link->network) + return false; + + return IN_SET(link->network->dhcp, DHCP_SUPPORT_V6, DHCP_SUPPORT_BOTH); +} + +static bool link_dhcp4_enabled(Link *link) { + if (link->flags & IFF_LOOPBACK) + return false; + + if (!link->network) + return false; + + return IN_SET(link->network->dhcp, DHCP_SUPPORT_V4, DHCP_SUPPORT_BOTH); +} + +static bool link_dhcp4_server_enabled(Link *link) { + if (link->flags & IFF_LOOPBACK) + return false; + + if (!link->network) + return false; + + return link->network->dhcp_server; +} + +static bool link_ipv4ll_enabled(Link *link) { + if (link->flags & IFF_LOOPBACK) + return false; + + if (!link->network) + return false; + + return link->network->ipv4ll; +} + #define FLAG_STRING(string, flag, old, new) \ (((old ^ new) & flag) \ ? ((old & flag) ? (" -" string) : (" +" string)) \ @@ -387,7 +427,7 @@ static int link_enter_configured(Link *link) { assert(link->network); assert(link->state == LINK_STATE_SETTING_ROUTES); - if (link->network->dhcp_server && + if (link_dhcp4_server_enabled(link) && !sd_dhcp_server_is_running(link->dhcp_server)) { struct in_addr pool_start; Address *address; @@ -454,13 +494,12 @@ void link_client_handler(Link *link) { if (!link->static_configured) return; - if (link->network->ipv4ll) + if (link_ipv4ll_enabled(link)) if (!link->ipv4ll_address || !link->ipv4ll_route) return; - if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) - if (!link->dhcp4_configured) + if (link_dhcp4_enabled(link) && !link->dhcp4_configured) return; if (link->state != LINK_STATE_CONFIGURED) @@ -904,7 +943,7 @@ static int link_acquire_conf(Link *link) { assert(link->manager); assert(link->manager->event); - if (link->network->ipv4ll) { + if (link_ipv4ll_enabled(link)) { assert(link->ipv4ll); log_debug_link(link, "acquiring IPv4 link-local address"); @@ -917,7 +956,7 @@ static int link_acquire_conf(Link *link) { } } - if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) { + if (link_dhcp4_enabled(link)) { assert(link->dhcp_client); log_debug_link(link, "acquiring DHCPv4 lease"); @@ -930,7 +969,7 @@ static int link_acquire_conf(Link *link) { } } - if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) { + if (link_dhcp6_enabled(link)) { assert(link->icmp6_router_discovery); log_debug_link(link, "discovering IPv6 routers"); @@ -1170,19 +1209,19 @@ static int link_configure(Link *link) { assert(link->network); assert(link->state == LINK_STATE_PENDING); - if (link->network->ipv4ll) { + if (link_ipv4ll_enabled(link)) { r = ipv4ll_configure(link); if (r < 0) return r; } - if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) { + if (link_dhcp4_enabled(link)) { r = dhcp4_configure(link); if (r < 0) return r; } - if (link->network->dhcp_server) { + if (link_dhcp4_server_enabled(link)) { r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex); if (r < 0) return r; @@ -1192,7 +1231,7 @@ static int link_configure(Link *link) { return r; } - if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) { + if (link_dhcp6_enabled(link)) { r = sd_icmp6_nd_new(&link->icmp6_router_discovery); if (r < 0) return r; @@ -1250,6 +1289,17 @@ static int link_initialized_and_synced(sd_rtnl *rtnl, sd_rtnl_message *m, } else if (r < 0) return r; + if (link->flags & IFF_LOOPBACK) { + if (network->ipv4ll) + log_debug_link(link, "ignoring IPv4LL for loopback link"); + + if (network->dhcp != DHCP_SUPPORT_NONE) + log_debug_link(link, "ignoring DHCP clients for loopback link"); + + if (network->dhcp_server) + log_debug_link(link, "ignoring DHCP server for loopback link"); + } + r = network_apply(link->manager, network, link); if (r < 0) return r; @@ -1330,7 +1380,7 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, } else { r = link_get(m, ifindex, &link); if (r < 0 || !link) { - log_warning("rtnl: received address for a nonexistent link, ignoring"); + log_warning("rtnl: received address for a nonexistent link (%d), ignoring", ifindex); return 0; } } @@ -1735,6 +1785,8 @@ int link_save(Link *link) { char **address, **domain; bool space; + fprintf(f, "NETWORK_FILE=%s\n", link->network->filename); + fputs("DNS=", f); space = false; STRV_FOREACH(address, link->network->dns) {