diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index bcd3ae6621..f95a138a2e 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -201,18 +201,14 @@ Address *address_free(Address *address) { if (address->network) { assert(address->section); ordered_hashmap_remove(address->network->addresses_by_section, address->section); + + if (address->network->dhcp_server_address == address) + address->network->dhcp_server_address = NULL; } - if (address->link) { + if (address->link) set_remove(address->link->addresses, address); - if (address->family == AF_INET6 && - in6_addr_equal(&address->in_addr.in6, &address->link->ipv6ll_address)) - memzero(&address->link->ipv6ll_address, sizeof(struct in6_addr)); - - ipv4acd_detach(address->link, address); - } - config_section_free(address->section); free(address->label); free(address->netlabel); @@ -778,6 +774,13 @@ static int address_drop(Address *address) { address_del_netlabel(address); + /* FIXME: if the IPv6LL address is dropped, stop DHCPv6, NDISC, RADV. */ + if (address->family == AF_INET6 && + in6_addr_equal(&address->in_addr.in6, &link->ipv6ll_address)) + link->ipv6ll_address = (const struct in6_addr) {}; + + ipv4acd_detach(link, address); + address_free(address); link_update_operstate(link, /* also_update_master = */ true);