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 46986251d6.
Moreover, the link state file is always removed when networkd is
stopping. Let's take the address from the list of enumerated addresses.
This commit is contained in:
Yu Watanabe
2020-10-28 15:44:05 +09:00
parent a149d4a95e
commit 3def88503a
5 changed files with 29 additions and 33 deletions
+1 -1
View File
@@ -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);
+1
View File
@@ -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);
+27 -24
View File
@@ -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,
-2
View File
@@ -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);
-6
View File
@@ -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);