diff options
-rw-r--r-- | src/network/networkd-address.c | 10 | ||||
-rw-r--r-- | src/network/networkd-dhcp4.c | 12 | ||||
-rw-r--r-- | src/network/networkd-ipv4ll.c | 4 | ||||
-rw-r--r-- | src/network/networkd-link.c | 20 | ||||
-rw-r--r-- | src/network/networkd-link.h | 2 | ||||
-rw-r--r-- | src/network/networkd-manager.c | 6 | ||||
-rw-r--r-- | src/network/networkd-network.c | 50 | ||||
-rw-r--r-- | src/network/networkd-network.h | 14 | ||||
-rw-r--r-- | src/network/networkd-route.c | 2 |
9 files changed, 79 insertions, 41 deletions
diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index a689fa68bd..0b7fbec28b 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -1274,8 +1274,8 @@ bool link_address_is_dynamic(const Link *link, const Address *address) { if (address->family != AF_INET) return false; - /* Even when the address is leased from a DHCP server, networkd assign the address - * without lifetime when KeepConfiguration=dhcp. So, let's check that we have + /* Even if an IPv4 address is leased from a DHCP server with a finite lifetime, networkd assign the + * address without lifetime when KeepConfiguration=dynamic. So, let's check that we have * corresponding routes with RTPROT_DHCP. */ SET_FOREACH(route, link->manager->routes) { if (route->source != NETWORK_CONFIG_SOURCE_FOREIGN) @@ -1410,9 +1410,9 @@ int link_drop_unmanaged_addresses(Link *link) { continue; /* link_address_is_dynamic() is slightly heavy. Let's call the function only when - * KeepConfiguration=dhcp or static. */ - if (IN_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP, KEEP_CONFIGURATION_STATIC) && - link_address_is_dynamic(link, address) == (link->network->keep_configuration == KEEP_CONFIGURATION_DHCP)) + * KeepConfiguration=dynamic or static. */ + if (IN_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DYNAMIC, KEEP_CONFIGURATION_STATIC) && + link_address_is_dynamic(link, address) == (link->network->keep_configuration == KEEP_CONFIGURATION_DYNAMIC)) continue; } else if (address->source != NETWORK_CONFIG_SOURCE_STATIC) diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 684580f5b6..d94ac1a213 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -915,7 +915,7 @@ static int dhcp4_request_address(Link *link, bool announce) { if (r < 0) return log_link_debug_errno(link, r, "DHCP error: failed to get DHCP server IP address: %m"); - if (!FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP)) { + if (!FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DYNAMIC)) { r = sd_dhcp_lease_get_lifetime_timestamp(link->dhcp_lease, CLOCK_BOOTTIME, &lifetime_usec); if (r < 0) return log_link_warning_errno(link, r, "DHCP error: failed to get lifetime: %m"); @@ -1168,7 +1168,7 @@ static int dhcp4_handler(sd_dhcp_client *client, int event, void *userdata) { switch (event) { case SD_DHCP_CLIENT_EVENT_STOP: - if (FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP)) { + if (FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DYNAMIC)) { log_link_notice(link, "DHCPv4 connection considered critical, ignoring request to reconfigure it."); return 0; } @@ -1199,7 +1199,7 @@ static int dhcp4_handler(sd_dhcp_client *client, int event, void *userdata) { break; case SD_DHCP_CLIENT_EVENT_EXPIRED: - if (FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP)) { + if (FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DYNAMIC)) { log_link_notice(link, "DHCPv4 connection considered critical, ignoring request to reconfigure it."); return 0; } @@ -1214,7 +1214,7 @@ static int dhcp4_handler(sd_dhcp_client *client, int event, void *userdata) { break; case SD_DHCP_CLIENT_EVENT_IP_CHANGE: - if (FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP)) { + if (FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DYNAMIC)) { log_link_notice(link, "DHCPv4 connection considered critical, ignoring request to reconfigure it."); return 0; } @@ -1400,8 +1400,8 @@ static int dhcp4_set_request_address(Link *link) { return sd_dhcp_client_set_request_address(link->dhcp_client, &link->network->dhcp_request_address); } - /* 3. If KeepConfiguration=dhcp, use a foreign dynamic address. */ - if (!FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP)) + /* 3. If KeepConfiguration=dynamic, use a foreign dynamic address. */ + if (!FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DYNAMIC)) return 0; SET_FOREACH(a, link->addresses) { diff --git a/src/network/networkd-ipv4ll.c b/src/network/networkd-ipv4ll.c index 9682d0d874..046e4ca957 100644 --- a/src/network/networkd-ipv4ll.c +++ b/src/network/networkd-ipv4ll.c @@ -195,8 +195,8 @@ static int ipv4ll_set_address(Link *link) { if (in4_addr_is_set(&link->network->ipv4ll_start_address)) return sd_ipv4ll_set_address(link->ipv4ll, &link->network->ipv4ll_start_address); - /* 3. If KeepConfiguration=dhcp, use a foreign IPv4LL address. */ - if (!FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP)) + /* 3. If KeepConfiguration=dynamic, use a foreign IPv4LL address. */ + if (!FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DYNAMIC)) return 0; SET_FOREACH(a, link->addresses) { diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 9d903b7057..4b341a96c7 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -369,20 +369,20 @@ void link_set_state(Link *link, LinkState state) { link_dirty(link); } -int link_stop_engines(Link *link, bool may_keep_dhcp) { +int link_stop_engines(Link *link, bool may_keep_dynamic) { int r, ret = 0; assert(link); assert(link->manager); assert(link->manager->event); - bool keep_dhcp = - may_keep_dhcp && + bool keep_dynamic = + may_keep_dynamic && link->network && (link->manager->state == MANAGER_RESTARTING || - FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP_ON_STOP)); + FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DYNAMIC_ON_STOP)); - if (!keep_dhcp) { + if (!keep_dynamic) { r = sd_dhcp_client_stop(link->dhcp_client); if (r < 0) RET_GATHER(ret, log_link_warning_errno(link, r, "Could not stop DHCPv4 client: %m")); @@ -449,7 +449,7 @@ void link_enter_failed(Link *link) { return; stop: - (void) link_stop_engines(link, /* may_keep_dhcp = */ false); + (void) link_stop_engines(link, /* may_keep_dynamic = */ false); } void link_check_ready(Link *link) { @@ -1339,7 +1339,7 @@ static void link_enter_unmanaged(Link *link) { log_link_full(link, link->state == LINK_STATE_INITIALIZED ? LOG_DEBUG : LOG_INFO, "Unmanaging interface."); - (void) link_stop_engines(link, /* may_keep_dhcp = */ false); + (void) link_stop_engines(link, /* may_keep_dynamic = */ false); (void) link_drop_requests(link); (void) link_drop_static_config(link); @@ -1410,10 +1410,10 @@ int link_reconfigure_impl(Link *link, LinkReconfigurationFlag flags) { /* Then, apply new .network file */ link->network = network_ref(network); - if (FLAGS_SET(network->keep_configuration, KEEP_CONFIGURATION_DHCP) || + if (FLAGS_SET(network->keep_configuration, KEEP_CONFIGURATION_DYNAMIC) || !FLAGS_SET(flags, LINK_RECONFIGURE_CLEANLY)) { /* To make 'networkctl reconfigure INTERFACE' work safely for an interface whose new .network - * file has KeepConfiguration=dhcp or yes, even if a clean reconfiguration is requested, + * file has KeepConfiguration=dynamic or yes, even if a clean reconfiguration is requested, * drop only unnecessary or possibly being changed dynamic configurations here. */ r = link_drop_dynamic_config(link, old_network); if (r < 0) @@ -1799,7 +1799,7 @@ static int link_carrier_lost_impl(Link *link) { if (!link->network) return ret; - RET_GATHER(ret, link_stop_engines(link, false)); + RET_GATHER(ret, link_stop_engines(link, /* may_keep_dynamic = */ false)); RET_GATHER(ret, link_drop_static_config(link)); return ret; diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 848e67c843..113217cdb6 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -257,7 +257,7 @@ bool link_ipv6_enabled(Link *link); int link_ipv6ll_gained(Link *link); bool link_has_ipv6_connectivity(Link *link); -int link_stop_engines(Link *link, bool may_keep_dhcp); +int link_stop_engines(Link *link, bool may_keep_dynamic); const char* link_state_to_string(LinkState s) _const_; LinkState link_state_from_string(const char *s) _pure_; diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index ca6ab48502..9290255ad0 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -481,7 +481,7 @@ static int manager_stop(Manager *manager, ManagerState state) { Link *link; HASHMAP_FOREACH(link, manager->links_by_index) - (void) link_stop_engines(link, /* may_keep_dhcp = */ true); + (void) link_stop_engines(link, /* may_keep_dynamic = */ true); return 0; } @@ -508,8 +508,8 @@ static int manager_set_keep_configuration(Manager *m) { assert(m); if (in_initrd()) { - log_debug("Running in initrd, keep DHCPv4 addresses on stopping networkd by default."); - m->keep_configuration = KEEP_CONFIGURATION_DHCP_ON_STOP; + log_debug("Running in initrd, keep dynamically assigned configurations on stopping networkd by default."); + m->keep_configuration = KEEP_CONFIGURATION_DYNAMIC_ON_STOP; return 0; } diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 2488530829..89dcf4f6c4 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -1093,15 +1093,53 @@ int config_parse_ignore_carrier_loss( return 0; } +int config_parse_keep_configuration( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + KeepConfiguration t, *k = ASSERT_PTR(data); + Network *network = ASSERT_PTR(userdata); + + if (isempty(rvalue)) { + *k = ASSERT_PTR(network->manager)->keep_configuration; + return 0; + } + + /* backward compatibility */ + if (streq(rvalue, "dhcp")) { + *k = KEEP_CONFIGURATION_DYNAMIC; + return 0; + } + + if (streq(rvalue, "dhcp-on-stop")) { + *k = KEEP_CONFIGURATION_DYNAMIC_ON_STOP; + return 0; + } + + t = keep_configuration_from_string(rvalue); + if (t < 0) + return log_syntax_parse_error(unit, filename, line, t, lvalue, rvalue); + + *k = t; + return 0; +} + DEFINE_CONFIG_PARSE_ENUM(config_parse_required_family_for_online, link_required_address_family, AddressFamily); -DEFINE_CONFIG_PARSE_ENUM(config_parse_keep_configuration, keep_configuration, KeepConfiguration); static const char* const keep_configuration_table[_KEEP_CONFIGURATION_MAX] = { - [KEEP_CONFIGURATION_NO] = "no", - [KEEP_CONFIGURATION_DHCP_ON_STOP] = "dhcp-on-stop", - [KEEP_CONFIGURATION_DHCP] = "dhcp", - [KEEP_CONFIGURATION_STATIC] = "static", - [KEEP_CONFIGURATION_YES] = "yes", + [KEEP_CONFIGURATION_NO] = "no", + [KEEP_CONFIGURATION_DYNAMIC_ON_STOP] = "dynamic-on-stop", + [KEEP_CONFIGURATION_DYNAMIC] = "dynamic", + [KEEP_CONFIGURATION_STATIC] = "static", + [KEEP_CONFIGURATION_YES] = "yes", }; DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(keep_configuration, KeepConfiguration, KEEP_CONFIGURATION_YES); diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 3ea94e0e49..03e3108623 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -32,14 +32,14 @@ #include "socket-netlink.h" typedef enum KeepConfiguration { - KEEP_CONFIGURATION_NO = 0, - KEEP_CONFIGURATION_DHCP_ON_START = 1 << 0, - KEEP_CONFIGURATION_DHCP_ON_STOP = 1 << 1, - KEEP_CONFIGURATION_DHCP = KEEP_CONFIGURATION_DHCP_ON_START | KEEP_CONFIGURATION_DHCP_ON_STOP, - KEEP_CONFIGURATION_STATIC = 1 << 2, - KEEP_CONFIGURATION_YES = KEEP_CONFIGURATION_DHCP | KEEP_CONFIGURATION_STATIC, + KEEP_CONFIGURATION_NO = 0, + KEEP_CONFIGURATION_DYNAMIC_ON_START = 1 << 0, + KEEP_CONFIGURATION_DYNAMIC_ON_STOP = 1 << 1, + KEEP_CONFIGURATION_DYNAMIC = KEEP_CONFIGURATION_DYNAMIC_ON_START | KEEP_CONFIGURATION_DYNAMIC_ON_STOP, + KEEP_CONFIGURATION_STATIC = 1 << 2, + KEEP_CONFIGURATION_YES = KEEP_CONFIGURATION_DYNAMIC | KEEP_CONFIGURATION_STATIC, _KEEP_CONFIGURATION_MAX, - _KEEP_CONFIGURATION_INVALID = -EINVAL, + _KEEP_CONFIGURATION_INVALID = -EINVAL, } KeepConfiguration; typedef enum ActivationPolicy { diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index b85d2a037a..0f3f79ec4f 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -1486,7 +1486,7 @@ int link_drop_routes(Link *link, bool only_static) { continue; if (IN_SET(route->protocol, RTPROT_DHCP, RTPROT_RA, RTPROT_REDIRECT) && - FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP)) + FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DYNAMIC)) continue; } } |