networkd: address - properly take over a foreign address

This commit is contained in:
Tom Gundersen
2015-10-30 12:32:48 +01:00
parent a3a019e125
commit cab974b035
+29 -5
View File
@@ -272,14 +272,34 @@ int address_add_foreign(Link *link, int family, const union in_addr_union *in_ad
}
static int address_add(Link *link, int family, const union in_addr_union *in_addr, unsigned char prefixlen, Address **ret) {
Address *address;
int r;
r = address_add_internal(link, &link->addresses, family, in_addr, prefixlen, ret);
if (r < 0)
r = address_get(link, family, in_addr, prefixlen, &address);
if (r == -ENOENT) {
/* Address does not exist, create a new one */
r = address_add_internal(link, &link->addresses, family, in_addr, prefixlen, &address);
if (r < 0)
return r;
} else if (r == 0) {
/* Take over a foreign address */
r = set_ensure_allocated(&link->addresses, &address_hash_ops);
if (r < 0)
return r;
r = set_put(link->addresses, address);
if (r < 0)
return r;
set_remove(link->addresses_foreign, address);
} else if (r == 1) {
/* Already exists, do nothing */
;
} else
return r;
link_update_operstate(link);
link_dirty(link);
if (ret)
*ret = address;
return 0;
}
@@ -360,7 +380,11 @@ int address_get(Link *link, int family, const union in_addr_union *in_addr, unsi
address.prefixlen = prefixlen;
existing = set_get(link->addresses, &address);
if (!existing) {
if (existing) {
*ret = existing;
return 1;
} else {
existing = set_get(link->addresses_foreign, &address);
if (!existing)
return -ENOENT;