summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorMike Manning <mmanning@brocade.com>2016-07-22 18:32:11 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-08-16 09:34:58 +0200
commit201e07fe162762ac07cf074aa8b0cfdfe665eda9 (patch)
treefd0e12f9e3fa56636e100dcc8b780a9816c47a0e /net
parent5986b7b7284dbb5a3ea117c36608b19504b862a5 (diff)
downloadlwn-201e07fe162762ac07cf074aa8b0cfdfe665eda9.tar.gz
lwn-201e07fe162762ac07cf074aa8b0cfdfe665eda9.zip
net: ipv6: Always leave anycast and multicast groups on link down
[ Upstream commit ea06f7176413e2538d13bb85b65387d0917943d9 ] Default kernel behavior is to delete IPv6 addresses on link down, which entails deletion of the multicast and the subnet-router anycast addresses. These deletions do not happen with sysctl setting to keep global IPv6 addresses on link down, so every link down/up causes an increment of the anycast and multicast refcounts. These bogus refcounts may stop these addrs from being removed on subsequent calls to delete them. The solution is to leave the groups for the multicast and subnet anycast on link down for the callflow when global IPv6 addresses are kept. Fixes: f1705ec197e7 ("net: ipv6: Make address flushing on ifdown optional") Signed-off-by: Mike Manning <mmanning@brocade.com> Acked-by: David Ahern <dsa@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net')
-rw-r--r--net/ipv6/addrconf.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 47f837a58e0a..047c75a798b1 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -3562,6 +3562,10 @@ restart:
if (state != INET6_IFADDR_STATE_DEAD) {
__ipv6_ifa_notify(RTM_DELADDR, ifa);
inet6addr_notifier_call_chain(NETDEV_DOWN, ifa);
+ } else {
+ if (idev->cnf.forwarding)
+ addrconf_leave_anycast(ifa);
+ addrconf_leave_solict(ifa->idev, &ifa->addr);
}
write_lock_bh(&idev->lock);