diff options
| author | Hideaki Yoshifuji <yoshfuji@linux-ipv6.org> | 2004-09-25 14:39:28 +0900 |
|---|---|---|
| committer | Hideaki Yoshifuji <yoshfuji@linux-ipv6.org> | 2004-09-25 14:39:28 +0900 |
| commit | 59cd504fb1a6d5f5b0254fa7765d03c1bf112c97 (patch) | |
| tree | 28f878e16e8ca28b7d402b5e287a4b4368835beb | |
| parent | d717b511d95a4b37a78558f267d69636da6f1a3b (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.h | 3 | ||||
| -rw-r--r-- | net/ipv6/addrconf.c | 8 | ||||
| -rw-r--r-- | net/ipv6/anycast.c | 2 | ||||
| -rw-r--r-- | net/ipv6/mcast.c | 4 |
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; |
