diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-10-28 14:16:22 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-10-28 15:44:05 +0900 |
commit | 3def88503a623334febdd213c1121a66fd6bb222 (patch) | |
tree | c750d0a178ea831c33438c420f17f63419cba020 | |
parent | a149d4a95eabe39f36e913f0a0ad9c84007b4e4f (diff) | |
download | systemd-3def88503a623334febdd213c1121a66fd6bb222.tar.gz |
network: set previous DHCP4 address in link->addresses_foreign
Previously, the address was taken from the state file, but DHCP4_ADDRESS=
entry was dropped by 46986251d6eb4c78bb56c080ce310fd2b1f9439f.
Moreover, the link state file is always removed when networkd is
stopping. Let's take the address from the list of enumerated addresses.
-rw-r--r-- | src/network/networkd-address.c | 2 | ||||
-rw-r--r-- | src/network/networkd-address.h | 1 | ||||
-rw-r--r-- | src/network/networkd-dhcp4.c | 51 | ||||
-rw-r--r-- | src/network/networkd-dhcp4.h | 2 | ||||
-rw-r--r-- | src/network/networkd-link.c | 6 |
5 files changed, 29 insertions, 33 deletions
diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 9130fae778..1bf6514a29 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -528,7 +528,7 @@ static bool link_is_static_address_configured(const Link *link, const Address *a return false; } -static bool link_address_is_dynamic(const Link *link, const Address *address) { +bool link_address_is_dynamic(const Link *link, const Address *address) { Route *route; assert(link); diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h index 0104747d9a..8b0fb9b0df 100644 --- a/src/network/networkd-address.h +++ b/src/network/networkd-address.h @@ -64,6 +64,7 @@ int link_drop_addresses(Link *link); int link_drop_foreign_addresses(Link *link); int link_serialize_addresses(Link *link, FILE *f); int link_deserialize_addresses(Link *link, const char *addresses); +bool link_address_is_dynamic(const Link *link, const Address *address); void ipv4_dad_unref(Link *link); int ipv4_dad_stop(Link *link); diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index bb8c34f7cc..eba6c3e16b 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -1286,6 +1286,29 @@ static int dhcp4_set_client_identifier(Link *link) { return 0; } +static int dhcp4_set_request_address(Link *link) { + Address *a; + + assert(link); + assert(link->network); + assert(link->dhcp_client); + + if (!FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP)) + return 0; + + SET_FOREACH(a, link->addresses_foreign) { + if (a->family != AF_INET) + continue; + if (link_address_is_dynamic(link, a)) + break; + } + + if (!a) + return 0; + + return sd_dhcp_client_set_request_address(link->dhcp_client, &a->in_addr.in); +} + static int dhcp4_init(Link *link) { int r; @@ -1469,6 +1492,10 @@ int dhcp4_configure(Link *link) { return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed set to lease lifetime: %m"); } + r = dhcp4_set_request_address(link); + if (r < 0) + return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to set initial DHCPv4 address: %m"); + r = dhcp4_configure_dad(link); if (r < 0) return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to configure service type: %m"); @@ -1499,30 +1526,6 @@ int dhcp4_update_mac(Link *link) { return 0; } -int link_deserialize_dhcp4(Link *link, const char *dhcp4_address) { - union in_addr_union address; - int r; - - assert(link); - - if (isempty(dhcp4_address)) - return 0; - - r = in_addr_from_string(AF_INET, dhcp4_address, &address); - if (r < 0) - return log_link_debug_errno(link, r, "Failed to parse DHCPv4 address: %s", dhcp4_address); - - r = dhcp4_init(link); - if (r < 0) - return log_link_debug_errno(link, r, "Failed to initialize DHCPv4 client: %m"); - - r = sd_dhcp_client_set_request_address(link->dhcp_client, &address.in); - if (r < 0) - return log_link_debug_errno(link, r, "Failed to set initial DHCPv4 address %s: %m", dhcp4_address); - - return 0; -} - int config_parse_dhcp_max_attempts( const char *unit, const char *filename, diff --git a/src/network/networkd-dhcp4.h b/src/network/networkd-dhcp4.h index 8aa6ac9453..b8476bb38c 100644 --- a/src/network/networkd-dhcp4.h +++ b/src/network/networkd-dhcp4.h @@ -20,8 +20,6 @@ typedef enum DHCPClientIdentifier { int dhcp4_configure(Link *link); int dhcp4_update_mac(Link *link); -int link_deserialize_dhcp4(Link *link, const char *dhcp4_address); - CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_client_identifier); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_acl_ip_address); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_max_attempts); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 9dd29bb203..735dee8083 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -2415,7 +2415,6 @@ static int link_load(Link *link) { _cleanup_free_ char *network_file = NULL, *addresses = NULL, *routes = NULL, - *dhcp4_address = NULL, *ipv4ll_address = NULL; int r; @@ -2425,7 +2424,6 @@ static int link_load(Link *link) { "NETWORK_FILE", &network_file, "ADDRESSES", &addresses, "ROUTES", &routes, - "DHCP4_ADDRESS", &dhcp4_address, "IPV4LL_ADDRESS", &ipv4ll_address); if (r < 0 && r != -ENOENT) return log_link_error_errno(link, r, "Failed to read %s: %m", link->state_file); @@ -2463,10 +2461,6 @@ network_file_fail: if (r < 0) log_link_warning_errno(link, r, "Failed to load routes from %s, ignoring: %m", link->state_file); - r = link_deserialize_dhcp4(link, dhcp4_address); - if (r < 0) - log_link_warning_errno(link, r, "Failed to load DHCPv4 address from %s, ignoring: %m", link->state_file); - r = link_deserialize_ipv4ll(link, ipv4ll_address); if (r < 0) log_link_warning_errno(link, r, "Failed to load IPv4LL address from %s, ignoring: %m", link->state_file); |