[PATCH 1/1] ipv6:remove ipv6 global address after the interface is down

From: yanjun . zhu
Date: Tue Apr 01 2014 - 05:09:11 EST


2.6.34.x kernels require a similar logic change as commit 73a8bd74
[ipv6:Revert 'administrative down' address handling changes]
introduces for newer kernels.

In 2.6.34.x kernels, when an interface with ipv6 global address is
restarted, the ipv6 route item disappear, but ipv6 global address
still remains. Compared with kernel versions 3.4+, the ipv6 global
address and route item should both disappear. To be consistent with
kernel versions 3.4+, we remove ipv6 address from the interface that
is shutdown.

Signed-off-by: yanjun.zhu <yanjun.zhu@xxxxxxxxxxxxx>
---
net/ipv6/addrconf.c | 39 ++++-----------------------------------
1 files changed, 4 insertions(+), 35 deletions(-)

diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 2b82070..6fd29fb 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -2624,7 +2624,7 @@ static void addrconf_bonding_change(struct net_device *dev, unsigned long event)
static int addrconf_ifdown(struct net_device *dev, int how)
{
struct inet6_dev *idev;
- struct inet6_ifaddr *ifa, *keep_list, **bifa;
+ struct inet6_ifaddr *ifa, **bifa;
struct net *net = dev_net(dev);
int i;

@@ -2657,9 +2657,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)

write_lock_bh(&addrconf_hash_lock);
while ((ifa = *bifa) != NULL) {
- if (ifa->idev == idev &&
- (how || !(ifa->flags&IFA_F_PERMANENT) ||
- ipv6_addr_type(&ifa->addr) & IPV6_ADDR_LINKLOCAL)) {
+ if (ifa->idev == idev){
*bifa = ifa->lst_next;
ifa->lst_next = NULL;
__in6_ifa_put(ifa);
@@ -2698,40 +2696,12 @@ static int addrconf_ifdown(struct net_device *dev, int how)
write_lock_bh(&idev->lock);
}
#endif
- keep_list = NULL;
- bifa = &keep_list;
while ((ifa = idev->addr_list) != NULL) {
idev->addr_list = ifa->if_next;
ifa->if_next = NULL;

addrconf_del_timer(ifa);
-
- /* If just doing link down, and address is permanent
- and not link-local, then retain it. */
- if (how == 0 &&
- (ifa->flags&IFA_F_PERMANENT) &&
- !(ipv6_addr_type(&ifa->addr) & IPV6_ADDR_LINKLOCAL)) {
-
- /* Move to holding list */
- *bifa = ifa;
- bifa = &ifa->if_next;
-
- /* If not doing DAD on this address, just keep it. */
- if ((dev->flags&(IFF_NOARP|IFF_LOOPBACK)) ||
- idev->cnf.accept_dad <= 0 ||
- (ifa->flags & IFA_F_NODAD))
- continue;
-
- /* If it was tentative already, no need to notify */
- if (ifa->flags & IFA_F_TENTATIVE)
- continue;
-
- /* Flag it for later restoration when link comes up */
- ifa->flags |= IFA_F_TENTATIVE;
- in6_ifa_hold(ifa);
- } else {
- ifa->dead = 1;
- }
+ ifa->dead = 1;
write_unlock_bh(&idev->lock);

__ipv6_ifa_notify(RTM_DELADDR, ifa);
@@ -2743,8 +2713,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
write_lock_bh(&idev->lock);
}

- idev->addr_list = keep_list;
-
+ idev->addr_list = NULL;
write_unlock_bh(&idev->lock);

/* Step 5: Discard multicast list */
--
1.7.3.5


--------------070107000106050307040707--
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/