From: Yu Watanabe Date: Sun, 20 Jun 2021 17:47:20 +0000 (+0900) Subject: sd-ipv4acd: allow to change requesting address without restarting sd-ipv4acd X-Git-Tag: v249-rc3~17^2~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5c35c13a4d6c6c457dd07e128c92abfd76550516;p=thirdparty%2Fsystemd.git sd-ipv4acd: allow to change requesting address without restarting sd-ipv4acd --- diff --git a/src/libsystemd-network/sd-ipv4acd.c b/src/libsystemd-network/sd-ipv4acd.c index 699e2baf6d1..e1ddd3fcace 100644 --- a/src/libsystemd-network/sd-ipv4acd.c +++ b/src/libsystemd-network/sd-ipv4acd.c @@ -490,14 +490,35 @@ int sd_ipv4acd_set_callback(sd_ipv4acd *acd, sd_ipv4acd_callback_t cb, void *use } int sd_ipv4acd_set_address(sd_ipv4acd *acd, const struct in_addr *address) { + int r; + assert_return(acd, -EINVAL); assert_return(address, -EINVAL); assert_return(in4_addr_is_set(address), -EINVAL); - assert_return(acd->state == IPV4ACD_STATE_INIT, -EBUSY); + + if (in4_addr_equal(&acd->address, address)) + return 0; acd->address = *address; + if (!sd_ipv4acd_is_running(acd)) + return 0; + + assert(acd->fd >= 0); + r = arp_update_filter(acd->fd, &acd->address, &acd->mac_addr); + if (r < 0) + goto fail; + + r = ipv4acd_set_next_wakeup(acd, 0, 0); + if (r < 0) + goto fail; + + ipv4acd_set_state(acd, IPV4ACD_STATE_STARTED, true); return 0; + +fail: + ipv4acd_reset(acd); + return r; } int sd_ipv4acd_get_address(sd_ipv4acd *acd, struct in_addr *address) {