kernel-netlink: Set NODAD flag for virtual IPv6 addresses

The Optimistic Duplicate Address Detection (DAD) seems to fail in some
cases (`dadfailed` in `ip addr`) rendering the virtual IP address unusable.

Fixes #2183.
This commit is contained in:
Tobias Brunner
2017-02-06 11:10:44 +01:00
parent 7a40162cb7
commit b062d3cc44
@@ -2155,10 +2155,15 @@ static status_t manage_ipaddr(private_kernel_netlink_net_t *this, int nlmsg_type
netlink_add_attribute(hdr, IFA_LOCAL, chunk, sizeof(request)); netlink_add_attribute(hdr, IFA_LOCAL, chunk, sizeof(request));
if (ip->get_family(ip) == AF_INET6 && this->rta_prefsrc_for_ipv6) if (ip->get_family(ip) == AF_INET6)
{ /* if source routes are possible we let the virtual IP get deprecated {
* immediately (but mark it as valid forever) so it gets only used if msg->ifa_flags |= IFA_F_NODAD;
* forced by our route, and not by the default IPv6 address selection */ if (this->rta_prefsrc_for_ipv6)
{
/* if source routes are possible we let the virtual IP get
* deprecated immediately (but mark it as valid forever) so it gets
* only used if forced by our route, and not by the default IPv6
* address selection */
struct ifa_cacheinfo cache = { struct ifa_cacheinfo cache = {
.ifa_valid = 0xFFFFFFFF, .ifa_valid = 0xFFFFFFFF,
.ifa_prefered = 0, .ifa_prefered = 0,
@@ -2166,6 +2171,7 @@ static status_t manage_ipaddr(private_kernel_netlink_net_t *this, int nlmsg_type
netlink_add_attribute(hdr, IFA_CACHEINFO, chunk_from_thing(cache), netlink_add_attribute(hdr, IFA_CACHEINFO, chunk_from_thing(cache),
sizeof(request)); sizeof(request));
} }
}
return this->socket->send_ack(this->socket, hdr); return this->socket->send_ack(this->socket, hdr);
} }