summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHideaki Yoshifuji <yoshfuji@linux-ipv6.org>2004-09-25 14:39:28 +0900
committerHideaki Yoshifuji <yoshfuji@linux-ipv6.org>2004-09-25 14:39:28 +0900
commit59cd504fb1a6d5f5b0254fa7765d03c1bf112c97 (patch)
tree28f878e16e8ca28b7d402b5e287a4b4368835beb
parentd717b511d95a4b37a78558f267d69636da6f1a3b (diff)
[IPV6] leave solicited-node multicast address during device deletion.
Because in6_dev_get() fails during device deletion, we failed to leave solicited-node multicast address. Signed-off-by: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
-rw-r--r--include/net/addrconf.h3
-rw-r--r--net/ipv6/addrconf.c8
-rw-r--r--net/ipv6/anycast.c2
-rw-r--r--net/ipv6/mcast.c4
4 files changed, 9 insertions, 8 deletions
diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index fc2b279cd148..a0566bb6387f 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -74,7 +74,7 @@ extern int ipv6_rcv_saddr_equal(const struct sock *sk,
const struct sock *sk2);
extern void addrconf_join_solict(struct net_device *dev,
struct in6_addr *addr);
-extern void addrconf_leave_solict(struct net_device *dev,
+extern void addrconf_leave_solict(struct inet6_dev *idev,
struct in6_addr *addr);
/*
@@ -89,6 +89,7 @@ extern int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr,
struct in6_addr *src_addr);
extern int ipv6_dev_mc_inc(struct net_device *dev, struct in6_addr *addr);
+extern int __ipv6_dev_mc_dec(struct inet6_dev *idev, struct in6_addr *addr);
extern int ipv6_dev_mc_dec(struct net_device *dev, struct in6_addr *addr);
extern void ipv6_mc_up(struct inet6_dev *idev);
extern void ipv6_mc_down(struct inet6_dev *idev);
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 44f5bb448030..910b21052174 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -1060,15 +1060,15 @@ void addrconf_join_solict(struct net_device *dev, struct in6_addr *addr)
ipv6_dev_mc_inc(dev, &maddr);
}
-void addrconf_leave_solict(struct net_device *dev, struct in6_addr *addr)
+void addrconf_leave_solict(struct inet6_dev *idev, struct in6_addr *addr)
{
struct in6_addr maddr;
- if (dev->flags&(IFF_LOOPBACK|IFF_NOARP))
+ if (idev->dev->flags&(IFF_LOOPBACK|IFF_NOARP))
return;
addrconf_addr_solict_mult(addr, &maddr);
- ipv6_dev_mc_dec(dev, &maddr);
+ __ipv6_dev_mc_dec(idev, &maddr);
}
@@ -2994,7 +2994,7 @@ static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
dst_release(&ifp->rt->u.dst);
break;
case RTM_DELADDR:
- addrconf_leave_solict(ifp->idev->dev, &ifp->addr);
+ addrconf_leave_solict(ifp->idev, &ifp->addr);
if (ifp->idev->cnf.forwarding) {
struct in6_addr addr;
diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c
index 537dc37be239..1963903cb90e 100644
--- a/net/ipv6/anycast.c
+++ b/net/ipv6/anycast.c
@@ -408,7 +408,7 @@ int ipv6_dev_ac_dec(struct net_device *dev, struct in6_addr *addr)
else
idev->ac_list = aca->aca_next;
write_unlock_bh(&idev->lock);
- addrconf_leave_solict(dev, &aca->aca_addr);
+ addrconf_leave_solict(idev, &aca->aca_addr);
dst_hold(&aca->aca_rt->u.dst);
if (ip6_del_rt(aca->aca_rt, NULL, NULL))
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index bf7c0fc04f8f..51193e0f09a1 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -128,7 +128,7 @@ static rwlock_t ipv6_sk_mc_lock = RW_LOCK_UNLOCKED;
static struct socket *igmp6_socket;
-static int __ipv6_dev_mc_dec(struct inet6_dev *idev, struct in6_addr *addr);
+int __ipv6_dev_mc_dec(struct inet6_dev *idev, struct in6_addr *addr);
static void igmp6_join_group(struct ifmcaddr6 *ma);
static void igmp6_leave_group(struct ifmcaddr6 *ma);
@@ -872,7 +872,7 @@ int ipv6_dev_mc_inc(struct net_device *dev, struct in6_addr *addr)
/*
* device multicast group del
*/
-static int __ipv6_dev_mc_dec(struct inet6_dev *idev, struct in6_addr *addr)
+int __ipv6_dev_mc_dec(struct inet6_dev *idev, struct in6_addr *addr)
{
struct ifmcaddr6 *ma, **map;