summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2020-10-28 14:16:22 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2020-10-28 15:44:05 +0900
commit3def88503a623334febdd213c1121a66fd6bb222 (patch)
treec750d0a178ea831c33438c420f17f63419cba020
parenta149d4a95eabe39f36e913f0a0ad9c84007b4e4f (diff)
downloadsystemd-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.c2
-rw-r--r--src/network/networkd-address.h1
-rw-r--r--src/network/networkd-dhcp4.c51
-rw-r--r--src/network/networkd-dhcp4.h2
-rw-r--r--src/network/networkd-link.c6
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);