summaryrefslogtreecommitdiff
path: root/src/libsystemd-network/sd-ipv4acd.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-06-21 02:29:46 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-07-01 00:49:02 +0900
commitfcb7345950beb1f21237df93e1e288c3e222493e (patch)
treeeee434e65b038d887f9b8f0a159b06b7ae62ef57 /src/libsystemd-network/sd-ipv4acd.c
parentd17ed573aae791ee440a1c84746868194896aa71 (diff)
downloadsystemd-fcb7345950beb1f21237df93e1e288c3e222493e.tar.gz
sd-ipv4acd: allow to change MAC address without restarting sd-ipv4acd
This also makes sd_ipv4acd_set_mac() refuses null MAC address.
Diffstat (limited to 'src/libsystemd-network/sd-ipv4acd.c')
-rw-r--r--src/libsystemd-network/sd-ipv4acd.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/libsystemd-network/sd-ipv4acd.c b/src/libsystemd-network/sd-ipv4acd.c
index ee4f215002..d763ba8e62 100644
--- a/src/libsystemd-network/sd-ipv4acd.c
+++ b/src/libsystemd-network/sd-ipv4acd.c
@@ -432,12 +432,24 @@ const char *sd_ipv4acd_get_ifname(sd_ipv4acd *acd) {
}
int sd_ipv4acd_set_mac(sd_ipv4acd *acd, const struct ether_addr *addr) {
+ int r;
+
assert_return(acd, -EINVAL);
assert_return(addr, -EINVAL);
- assert_return(acd->state == IPV4ACD_STATE_INIT, -EBUSY);
+ assert_return(!ether_addr_is_null(addr), -EINVAL);
acd->mac_addr = *addr;
+ 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) {
+ ipv4acd_reset(acd);
+ return r;
+ }
+
return 0;
}