|
@@ -1927,15 +1927,7 @@ static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed)
|
|
|
if (dad_failed)
|
|
|
ifp->flags |= IFA_F_DADFAILED;
|
|
|
|
|
|
- if (ifp->flags&IFA_F_PERMANENT) {
|
|
|
- spin_lock_bh(&ifp->lock);
|
|
|
- addrconf_del_dad_work(ifp);
|
|
|
- ifp->flags |= IFA_F_TENTATIVE;
|
|
|
- spin_unlock_bh(&ifp->lock);
|
|
|
- if (dad_failed)
|
|
|
- ipv6_ifa_notify(0, ifp);
|
|
|
- in6_ifa_put(ifp);
|
|
|
- } else if (ifp->flags&IFA_F_TEMPORARY) {
|
|
|
+ if (ifp->flags&IFA_F_TEMPORARY) {
|
|
|
struct inet6_ifaddr *ifpub;
|
|
|
spin_lock_bh(&ifp->lock);
|
|
|
ifpub = ifp->ifpub;
|
|
@@ -1948,6 +1940,14 @@ static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed)
|
|
|
spin_unlock_bh(&ifp->lock);
|
|
|
}
|
|
|
ipv6_del_addr(ifp);
|
|
|
+ } else if (ifp->flags&IFA_F_PERMANENT || !dad_failed) {
|
|
|
+ spin_lock_bh(&ifp->lock);
|
|
|
+ addrconf_del_dad_work(ifp);
|
|
|
+ ifp->flags |= IFA_F_TENTATIVE;
|
|
|
+ spin_unlock_bh(&ifp->lock);
|
|
|
+ if (dad_failed)
|
|
|
+ ipv6_ifa_notify(0, ifp);
|
|
|
+ in6_ifa_put(ifp);
|
|
|
} else {
|
|
|
ipv6_del_addr(ifp);
|
|
|
}
|