]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: set previous DHCP4 address in link->addresses_foreign
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 28 Oct 2020 05:16:22 +0000 (14:16 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 28 Oct 2020 06:44:05 +0000 (15:44 +0900)
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.

src/network/networkd-address.c
src/network/networkd-address.h
src/network/networkd-dhcp4.c
src/network/networkd-dhcp4.h
src/network/networkd-link.c

index 9130fae77830f32bc60a763cc6034d7d60b1c16c..1bf6514a29316967e2c5f097452897cebefaf4ef 100644 (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);
index 0104747d9a5da713594bd29897f3053216c7dfdd..8b0fb9b0dfd3bcbe570f138667bd71fa57a92a68 100644 (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);
index bb8c34f7cc5959c048e21a3a6b61c73cb54453ec..eba6c3e16bd45765b90a749d0e8faddc335b2ad0 100644 (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,
index 8aa6ac9453eacd271e9cf6ed836651c2208ad88d..b8476bb38cf611bed982d6af0a496cf9a5d5e26a 100644 (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);
index 9dd29bb203081c308980651af22354c23642da08..735dee80835e72720de1bb41a07c01c843871758 100644 (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);