]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: move IPv4ACD client for DHCPv4 from Network to Link object
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 14 Oct 2020 06:22:56 +0000 (15:22 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 14 Oct 2020 06:38:29 +0000 (15:38 +0900)
A .network file may matches multiple interfaces.

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

index e7dc488e37655b48a6d0a1925a6c0c3f507b178c..6145007e8c7ba2a8b849c2ab8d1eeb5ec463f03f 100644 (file)
@@ -617,24 +617,31 @@ static void dhcp_address_on_acd(sd_ipv4acd *acd, int event, void *userdata) {
         return;
 }
 
-static int configure_dhcpv4_duplicate_address_detection(Link *link) {
+static int dhcp4_configure_dad(Link *link) {
         int r;
 
         assert(link);
+        assert(link->manager);
+        assert(link->network);
 
-        r = sd_ipv4acd_new(&link->network->dhcp_acd);
-        if (r < 0)
-                return r;
+        if (!link->network->dhcp_send_decline)
+                return 0;
 
-        r = sd_ipv4acd_attach_event(link->network->dhcp_acd, link->manager->event, 0);
-        if (r < 0)
-                return r;
+        if (!link->dhcp_acd) {
+                r = sd_ipv4acd_new(&link->dhcp_acd);
+                if (r < 0)
+                        return r;
+
+                r = sd_ipv4acd_attach_event(link->dhcp_acd, link->manager->event, 0);
+                if (r < 0)
+                        return r;
+        }
 
-        r = sd_ipv4acd_set_ifindex(link->network->dhcp_acd, link->ifindex);
+        r = sd_ipv4acd_set_ifindex(link->dhcp_acd, link->ifindex);
         if (r < 0)
                 return r;
 
-        r = sd_ipv4acd_set_mac(link->network->dhcp_acd, &link->mac);
+        r = sd_ipv4acd_set_mac(link->dhcp_acd, &link->mac);
         if (r < 0)
                 return r;
 
@@ -652,7 +659,7 @@ static int dhcp4_start_acd(Link *link) {
         if (!link->dhcp_lease)
                 return 0;
 
-        (void) sd_ipv4acd_stop(link->network->dhcp_acd);
+        (void) sd_ipv4acd_stop(link->dhcp_acd);
 
         link->dhcp4_address_bind = false;
 
@@ -660,15 +667,15 @@ static int dhcp4_start_acd(Link *link) {
         if (r < 0)
                 return r;
 
-        r = sd_ipv4acd_get_address(link->network->dhcp_acd, &old);
+        r = sd_ipv4acd_get_address(link->dhcp_acd, &old);
         if (r < 0)
                 return r;
 
-        r = sd_ipv4acd_set_address(link->network->dhcp_acd, &addr.in);
+        r = sd_ipv4acd_set_address(link->dhcp_acd, &addr.in);
         if (r < 0)
                 return r;
 
-        r = sd_ipv4acd_set_callback(link->network->dhcp_acd, dhcp_address_on_acd, link);
+        r = sd_ipv4acd_set_callback(link->dhcp_acd, dhcp_address_on_acd, link);
         if (r < 0)
                 return r;
 
@@ -679,7 +686,7 @@ static int dhcp4_start_acd(Link *link) {
                 log_link_debug(link, "Starting IPv4ACD client. Probing DHCPv4 address %s", strna(pretty));
         }
 
-        r = sd_ipv4acd_start(link->network->dhcp_acd, !in4_addr_equal(&addr.in, &old));
+        r = sd_ipv4acd_start(link->dhcp_acd, !in4_addr_equal(&addr.in, &old));
         if (r < 0)
                 return r;
 
@@ -1429,11 +1436,9 @@ int dhcp4_configure(Link *link) {
                         return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed set to lease lifetime: %m");
         }
 
-        if (link->network->dhcp_send_decline) {
-                r = configure_dhcpv4_duplicate_address_detection(link);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to configure service type: %m");
-        }
+        r = dhcp4_configure_dad(link);
+        if (r < 0)
+                return log_link_error_errno(link, r, "DHCP4 CLIENT: Failed to configure service type: %m");
 
         return dhcp4_set_client_identifier(link);
 }
index 7de6fdcf193ebd3ef5d2364821c80f79008e9466..d42bbd179a731cc803d6ed5e63c4ab9fc6434a9c 100644 (file)
@@ -503,6 +503,7 @@ static void link_free_engines(Link *link) {
         link->dhcp6_lease = sd_dhcp6_lease_unref(link->dhcp6_lease);
         link->ndisc = sd_ndisc_unref(link->ndisc);
         link->radv = sd_radv_unref(link->radv);
+        link->dhcp_acd = sd_ipv4acd_unref(link->dhcp_acd);
 }
 
 static Link *link_free(Link *link) {
index b712bb262f34c5d3eca96d034efed060006bed87..6e435796e5f8619e46482e45908a225c9a7afba5 100644 (file)
@@ -9,6 +9,7 @@
 #include "sd-dhcp-client.h"
 #include "sd-dhcp-server.h"
 #include "sd-dhcp6-client.h"
+#include "sd-ipv4acd.h"
 #include "sd-ipv4ll.h"
 #include "sd-lldp.h"
 #include "sd-ndisc.h"
@@ -105,6 +106,7 @@ typedef struct Link {
         uint32_t original_mtu;
         unsigned dhcp4_messages;
         unsigned dhcp4_remove_messages;
+        sd_ipv4acd *dhcp_acd;
         bool dhcp4_route_failed:1;
         bool dhcp4_route_retrying:1;
         bool dhcp4_configured:1;
index 1ef3a6a6d80c3a1924647a12df7128b56d8b93db..9707c97653bdcbfe3c6e2712486be95911288f95 100644 (file)
@@ -636,9 +636,6 @@ static Network *network_free(Network *network) {
         strv_free(network->dhcp6_user_class);
         strv_free(network->dhcp6_vendor_class);
 
-        if (network->dhcp_acd)
-                sd_ipv4acd_unref(network->dhcp_acd);
-
         strv_free(network->ntp);
         for (unsigned i = 0; i < network->n_dns; i++)
                 in_addr_full_free(network->dns[i]);
index cbcbb73872518291876b3f7368497e95065dba48..ccf739c8516330186e28b63adc51b90d3c32f764 100644 (file)
@@ -5,7 +5,6 @@
 
 #include "sd-bus.h"
 #include "sd-device.h"
-#include "sd-ipv4acd.h"
 
 #include "bridge.h"
 #include "condition.h"
@@ -123,7 +122,6 @@ struct Network {
         bool dhcp_send_release;
         bool dhcp_send_decline;
         DHCPUseDomains dhcp_use_domains;
-        sd_ipv4acd *dhcp_acd;
         Set *dhcp_deny_listed_ip;
         Set *dhcp_allow_listed_ip;
         Set *dhcp_request_options;