summaryrefslogtreecommitdiff
path: root/src/network
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 /src/network
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.
Diffstat (limited to 'src/network')
-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);