IPv6: keep tentative addresses in hash table
When link goes down, want address to be preserved but in a tentative state, therefore it has to stay in hash list. Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
93fa159abe
commit
27bdb2abcc
|
@ -2704,17 +2704,18 @@ static int addrconf_ifdown(struct net_device *dev, int how)
|
||||||
/* Flag it for later restoration when link comes up */
|
/* Flag it for later restoration when link comes up */
|
||||||
ifa->flags |= IFA_F_TENTATIVE;
|
ifa->flags |= IFA_F_TENTATIVE;
|
||||||
in6_ifa_hold(ifa);
|
in6_ifa_hold(ifa);
|
||||||
|
write_unlock_bh(&idev->lock);
|
||||||
} else {
|
} else {
|
||||||
list_del(&ifa->if_list);
|
list_del(&ifa->if_list);
|
||||||
ifa->dead = 1;
|
ifa->dead = 1;
|
||||||
}
|
write_unlock_bh(&idev->lock);
|
||||||
write_unlock_bh(&idev->lock);
|
|
||||||
|
|
||||||
/* clear hash table */
|
/* clear hash table */
|
||||||
spin_lock_bh(&addrconf_hash_lock);
|
spin_lock_bh(&addrconf_hash_lock);
|
||||||
hlist_del_init_rcu(&ifa->addr_lst);
|
hlist_del_init_rcu(&ifa->addr_lst);
|
||||||
__in6_ifa_put(ifa);
|
__in6_ifa_put(ifa);
|
||||||
spin_unlock_bh(&addrconf_hash_lock);
|
spin_unlock_bh(&addrconf_hash_lock);
|
||||||
|
}
|
||||||
|
|
||||||
__ipv6_ifa_notify(RTM_DELADDR, ifa);
|
__ipv6_ifa_notify(RTM_DELADDR, ifa);
|
||||||
atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifa);
|
atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifa);
|
||||||
|
|
Loading…
Reference in New Issue