#include "netlink-util.h"
#include "networkd-address.h"
#include "networkd-manager.h"
+#include "networkd-ndisc.h"
#include "parse-util.h"
#include "set.h"
#include "socket-util.h"
}
if (address->link && !address->acd) {
+ NDiscAddress *n;
+
set_remove(address->link->addresses, address);
set_remove(address->link->addresses_foreign, address);
set_remove(address->link->static_addresses, address);
set_remove(address->link->dhcp6_addresses_old, address);
set_remove(address->link->dhcp6_pd_addresses, address);
set_remove(address->link->dhcp6_pd_addresses_old, address);
- set_remove(address->link->ndisc_addresses, address);
- set_remove(address->link->ndisc_addresses_old, address);
+ SET_FOREACH(n, address->link->ndisc_addresses)
+ if (n->address == address)
+ free(set_remove(address->link->ndisc_addresses, n));
if (in_addr_equal(AF_INET6, &address->in_addr, (const union in_addr_union *) &address->link->ipv6ll_address))
memzero(&address->link->ipv6ll_address, sizeof(struct in6_addr));
return be32toh(a->in_addr.in.s_addr) >> (32 - a->prefixlen);
}
-static void address_hash_func(const Address *a, struct siphash *state) {
+void address_hash_func(const Address *a, struct siphash *state) {
assert(a);
siphash24_compress(&a->family, sizeof(a->family), state);
}
}
-static int address_compare_func(const Address *a1, const Address *a2) {
+int address_compare_func(const Address *a1, const Address *a2) {
int r;
r = CMP(a1->family, a2->family);
static bool address_exists_internal(Set *addresses, int family, const union in_addr_union *in_addr) {
Address *address;
- Iterator i;
- SET_FOREACH(address, addresses, i) {
+ SET_FOREACH(address, addresses) {
if (address->family != family)
continue;
if (in_addr_equal(address->family, &address->in_addr, in_addr))
r = sd_netlink_message_get_errno(m);
if (r < 0 && r != -EADDRNOTAVAIL)
log_link_message_warning_errno(link, m, r, "Could not drop address");
- else
+ else if (r >= 0)
(void) manager_rtnl_process_address(rtnl, m, link->manager);
return 1;