diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 0c3c675ff8b225a2110d08b9de0abd6f1cf3beae..d0789497ad9180ca60147c88a3072c2520a80e23 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -1307,7 +1307,9 @@ int ipv6_chk_addr(struct net *net, const struct in6_addr *addr, if (!net_eq(dev_net(ifp->idev->dev), net)) continue; if (ipv6_addr_equal(&ifp->addr, addr) && - !(ifp->flags&IFA_F_TENTATIVE) && + (!(ifp->flags&IFA_F_TENTATIVE) || + (ipv6_use_optimistic_addr(ifp->idev) && + ifp->flags&IFA_F_OPTIMISTIC)) && (dev == NULL || ifp->idev->dev == dev || !(ifp->scope&(IFA_LINK|IFA_HOST) || strict))) { rcu_read_unlock_bh();