]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/ipv4ll: not necessary to set initial address on each start 34995/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 1 Nov 2024 15:13:00 +0000 (00:13 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 2 Nov 2024 13:42:01 +0000 (22:42 +0900)
src/network/networkd-dhcp4.c
src/network/networkd-ipv4ll.c

index 19b9a3ecba4445f6d1dfcb32772989dfe75c6625..f22bc3954ca36d00f638037222999d64d0584fc4 100644 (file)
@@ -1173,15 +1173,9 @@ static int dhcp4_handler(sd_dhcp_client *client, int event, void *userdata) {
                                 return 0;
                         }
 
-                        if (link->ipv4ll) {
+                        if (link->ipv4ll && !sd_ipv4ll_is_running(link->ipv4ll)) {
                                 log_link_debug(link, "DHCP client is stopped. Acquiring IPv4 link-local address");
 
-                                if (in4_addr_is_set(&link->network->ipv4ll_start_address)) {
-                                        r = sd_ipv4ll_set_address(link->ipv4ll, &link->network->ipv4ll_start_address);
-                                        if (r < 0)
-                                                return log_link_warning_errno(link, r, "Could not set IPv4 link-local start address: %m");
-                                }
-
                                 r = sd_ipv4ll_start(link->ipv4ll);
                                 if (r < 0 && r != -ESTALE) /* On exit, we cannot and should not start sd-ipv4ll. */
                                         return log_link_warning_errno(link, r, "Could not acquire IPv4 link-local address: %m");
@@ -1260,12 +1254,6 @@ static int dhcp4_handler(sd_dhcp_client *client, int event, void *userdata) {
                         if (link->ipv4ll && !sd_ipv4ll_is_running(link->ipv4ll)) {
                                 log_link_debug(link, "Problems acquiring DHCP lease, acquiring IPv4 link-local address");
 
-                                if (in4_addr_is_set(&link->network->ipv4ll_start_address)) {
-                                        r = sd_ipv4ll_set_address(link->ipv4ll, &link->network->ipv4ll_start_address);
-                                        if (r < 0)
-                                                return log_link_warning_errno(link, r, "Could not set IPv4 link-local start address: %m");
-                                }
-
                                 r = sd_ipv4ll_start(link->ipv4ll);
                                 if (r < 0)
                                         return log_link_warning_errno(link, r, "Could not acquire IPv4 link-local address: %m");
index ea960593bbce1000234fb96916c9cda9e486d1ba..648f20d596cbf6a6d251523dcebc6733147e801a 100644 (file)
@@ -174,6 +174,17 @@ static int ipv4ll_check_mac(sd_ipv4ll *ll, const struct ether_addr *mac, void *u
         return link_get_by_hw_addr(m, &hw_addr, NULL) >= 0;
 }
 
+static int ipv4ll_set_address(Link *link) {
+        assert(link);
+        assert(link->network);
+        assert(link->ipv4ll);
+
+        if (!in4_addr_is_set(&link->network->ipv4ll_start_address))
+                return 0;
+
+        return sd_ipv4ll_set_address(link->ipv4ll, &link->network->ipv4ll_start_address);
+}
+
 int ipv4ll_configure(Link *link) {
         uint64_t seed;
         int r;
@@ -201,6 +212,10 @@ int ipv4ll_configure(Link *link) {
                         return r;
         }
 
+        r = ipv4ll_set_address(link);
+        if (r < 0)
+                return r;
+
         r = sd_ipv4ll_set_mac(link->ipv4ll, &link->hw_addr.ether);
         if (r < 0)
                 return r;