From: Yu Watanabe Date: Wed, 14 Oct 2020 06:22:56 +0000 (+0900) Subject: network: move IPv4ACD client for DHCPv4 from Network to Link object X-Git-Tag: v247-rc1~80^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=10fa21c0dcefdd158b0291e4ef731f5322e0f609;p=thirdparty%2Fsystemd.git network: move IPv4ACD client for DHCPv4 from Network to Link object A .network file may matches multiple interfaces. --- diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index e7dc488e376..6145007e8c7 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -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); } diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 7de6fdcf193..d42bbd179a7 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -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) { diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index b712bb262f3..6e435796e5f 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -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; diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 1ef3a6a6d80..9707c97653b 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -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]); diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index cbcbb738725..ccf739c8516 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -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;