diff options
author | stephen hemminger <shemminger@vyatta.com> | 2010-04-12 01:41:32 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-04-13 05:29:27 -0400 |
commit | 27bdb2abcc5edb3526e25407b74bf17d1872c329 (patch) | |
tree | a25199ed5e17400b068980b179491f169292f4fe /net | |
parent | 93fa159abe50d3c55c7f83622d3f5c09b6e06f4b (diff) |
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>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv6/addrconf.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index a9913d23f7c7..9d78c1229497 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -2704,17 +2704,18 @@ static int addrconf_ifdown(struct net_device *dev, int how) | |||
2704 | /* Flag it for later restoration when link comes up */ | 2704 | /* Flag it for later restoration when link comes up */ |
2705 | ifa->flags |= IFA_F_TENTATIVE; | 2705 | ifa->flags |= IFA_F_TENTATIVE; |
2706 | in6_ifa_hold(ifa); | 2706 | in6_ifa_hold(ifa); |
2707 | write_unlock_bh(&idev->lock); | ||
2707 | } else { | 2708 | } else { |
2708 | list_del(&ifa->if_list); | 2709 | list_del(&ifa->if_list); |
2709 | ifa->dead = 1; | 2710 | ifa->dead = 1; |
2710 | } | 2711 | write_unlock_bh(&idev->lock); |
2711 | write_unlock_bh(&idev->lock); | ||
2712 | 2712 | ||
2713 | /* clear hash table */ | 2713 | /* clear hash table */ |
2714 | spin_lock_bh(&addrconf_hash_lock); | 2714 | spin_lock_bh(&addrconf_hash_lock); |
2715 | hlist_del_init_rcu(&ifa->addr_lst); | 2715 | hlist_del_init_rcu(&ifa->addr_lst); |
2716 | __in6_ifa_put(ifa); | 2716 | __in6_ifa_put(ifa); |
2717 | spin_unlock_bh(&addrconf_hash_lock); | 2717 | spin_unlock_bh(&addrconf_hash_lock); |
2718 | } | ||
2718 | 2719 | ||
2719 | __ipv6_ifa_notify(RTM_DELADDR, ifa); | 2720 | __ipv6_ifa_notify(RTM_DELADDR, ifa); |
2720 | atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifa); | 2721 | atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifa); |