]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/ipv4ll: introduce ipv4ll_start() helper function
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 20 Apr 2025 01:46:36 +0000 (10:46 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 20 Apr 2025 01:48:52 +0000 (10:48 +0900)
No effective functional change. Just refactoring.

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

index 85493334f5e7929b2d2ec84e7687090b384044f9..d793d6036290a8d0ec8a743e8d3a91eb22bf4304 100644 (file)
@@ -16,7 +16,7 @@
 #include "networkd-dhcp-prefix-delegation.h"
 #include "networkd-dhcp4-bus.h"
 #include "networkd-dhcp4.h"
-#include "networkd-ipv4acd.h"
+#include "networkd-ipv4ll.h"
 #include "networkd-link.h"
 #include "networkd-manager.h"
 #include "networkd-network.h"
@@ -1192,13 +1192,11 @@ static int dhcp4_handler(sd_dhcp_client *client, int event, void *userdata) {
                                 return 0;
                         }
 
-                        if (link->ipv4ll && !sd_ipv4ll_is_running(link->ipv4ll)) {
-                                log_link_debug(link, "DHCP client is stopped. Acquiring IPv4 link-local address");
-
-                                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");
-                        }
+                        r = ipv4ll_start(link);
+                        if (r < 0)
+                                return log_link_warning_errno(link, r, "Could not acquire IPv4 link-local address: %m");
+                        if (r > 0)
+                                log_link_debug(link, "DHCP client is stopped. Acquiring IPv4 link-local address.");
 
                         if (link->dhcp_lease) {
                                 if (link->network->dhcp_send_release) {
@@ -1270,13 +1268,11 @@ static int dhcp4_handler(sd_dhcp_client *client, int event, void *userdata) {
                         break;
 
                 case SD_DHCP_CLIENT_EVENT_TRANSIENT_FAILURE:
-                        if (link->ipv4ll && !sd_ipv4ll_is_running(link->ipv4ll)) {
+                        r = ipv4ll_start(link);
+                        if (r < 0)
+                                return log_link_warning_errno(link, r, "Could not acquire IPv4 link-local address: %m");
+                        if (r > 0)
                                 log_link_debug(link, "Problems acquiring DHCP lease, acquiring IPv4 link-local address");
-
-                                r = sd_ipv4ll_start(link->ipv4ll);
-                                if (r < 0)
-                                        return log_link_warning_errno(link, r, "Could not acquire IPv4 link-local address: %m");
-                        }
                         break;
 
                 default:
index ef8b0876b57a6f23a238fd58c2c32a2697e73bee..7522bca0aa87487205e20c13f037bcd695b3b5c7 100644 (file)
@@ -264,6 +264,34 @@ int ipv4ll_configure(Link *link) {
         return sd_ipv4ll_set_check_mac_callback(link->ipv4ll, ipv4ll_check_mac, link->manager);
 }
 
+int ipv4ll_start(Link *link) {
+        int r;
+
+        assert(link);
+
+        if (!link->ipv4ll)
+                return 0;
+
+        if (sd_ipv4ll_is_running(link->ipv4ll))
+                return 0;
+
+        if (!link_has_carrier(link))
+                return 0;
+
+        /* On exit, we cannot and should not start sd-ipv4ll. */
+        r = sd_event_get_state(link->manager->event);
+        if (r < 0)
+                return r;
+        if (r == SD_EVENT_FINISHED)
+                return 0;
+
+        r = sd_ipv4ll_start(link->ipv4ll);
+        if (r < 0)
+                return r;
+
+        return 1; /* started */
+}
+
 int link_drop_ipv4ll_config(Link *link, Network *network) {
         int ret = 0;
 
index f380afe9ece4bedca6d8956da55ac4a7b126b6a8..71cddbdd5bd155a1df2e0c116a89bf2e763dbd7d 100644 (file)
@@ -11,6 +11,7 @@ typedef struct Network Network;
 bool link_ipv4ll_enabled(Link *link);
 
 int ipv4ll_configure(Link *link);
+int ipv4ll_start(Link *link);
 int link_drop_ipv4ll_config(Link *link, Network *network);
 int ipv4ll_update_mac(Link *link);
 
index 64db17c3d34a5bde7f773f651c5a6b42bf704780..b13b668c1a3538c8095dc4ea6e25685b263060ab 100644 (file)
@@ -728,11 +728,11 @@ static int link_acquire_dynamic_ipv4_conf(Link *link) {
                                 return log_link_warning_errno(link, r, "Could not set IPv4 link-local start address: %m");
                 }
 
-                r = sd_ipv4ll_start(link->ipv4ll);
+                r = ipv4ll_start(link);
                 if (r < 0)
                         return log_link_warning_errno(link, r, "Could not acquire IPv4 link-local address: %m");
-
-                log_link_debug(link, "Acquiring IPv4 link-local address.");
+                if (r > 0)
+                        log_link_debug(link, "Acquiring IPv4 link-local address.");
         }
 
         r = link_start_dhcp4_server(link);