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;
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;
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;
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;
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);
}