X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-network%2Fsd-ipv4ll.c;h=ad8b4e3b4334974b66cd344d1a1ea5df0a00b070;hb=4644fee04fb515787bcfbba53b3cabe58c81d317;hp=689dce9adffba972f5996106dbfed22c4d0ae275;hpb=9765ce69e15fd294db9553777b621515fa57f2c6;p=elogind.git diff --git a/src/libsystemd-network/sd-ipv4ll.c b/src/libsystemd-network/sd-ipv4ll.c index 689dce9ad..ad8b4e3b4 100644 --- a/src/libsystemd-network/sd-ipv4ll.c +++ b/src/libsystemd-network/sd-ipv4ll.c @@ -375,10 +375,25 @@ int sd_ipv4ll_set_index(sd_ipv4ll *ll, int interface_index) { } int sd_ipv4ll_set_mac(sd_ipv4ll *ll, const struct ether_addr *addr) { + bool need_restart = false; + assert_return(ll, -EINVAL); - assert_return(ll->state == IPV4LL_STATE_INIT, -EBUSY); + assert_return(addr, -EINVAL); + + if (memcmp(&ll->mac_addr, addr, ETH_ALEN) == 0) + return 0; + + if (ll->state != IPV4LL_STATE_INIT) { + log_ipv4ll(ll, "Changing MAC address on running IPv4LL " + "client, restarting"); + sd_ipv4ll_stop(ll); + need_restart = true; + } + + memcpy(&ll->mac_addr, addr, ETH_ALEN); - memcpy(&ll->mac_addr.ether_addr_octet, addr, ETH_ALEN); + if (need_restart) + sd_ipv4ll_start(ll); return 0; }