static struct socket *igmp6_socket;
+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);
static void igmp6_timer_handler(unsigned long data);
if (idev) {
(void) ip6_mc_leave_src(sk,mc_lst,idev);
+ __ipv6_dev_mc_dec(idev, &mc_lst->addr);
in6_dev_put(idev);
}
- ipv6_dev_mc_dec(dev, &mc_lst->addr);
dev_put(dev);
}
sock_kfree_s(sk, mc_lst, sizeof(*mc_lst));
if (idev) {
(void) ip6_mc_leave_src(sk, mc_lst, idev);
+ __ipv6_dev_mc_dec(idev, &mc_lst->addr);
in6_dev_put(idev);
}
- ipv6_dev_mc_dec(dev, &mc_lst->addr);
dev_put(dev);
}
/*
* device multicast group del
*/
-static int __ipv6_dev_mc_dec(struct net_device *dev, 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;
if (!idev)
return -ENODEV;
- err = __ipv6_dev_mc_dec(dev, idev, addr);
+ err = __ipv6_dev_mc_dec(idev, addr);
in6_dev_put(idev);
* addrconf.c has NULL'd out dev->ip6_ptr so in6_dev_get() will
* fail.
*/
- __ipv6_dev_mc_dec(idev->dev, idev, &maddr);
+ __ipv6_dev_mc_dec(idev, &maddr);
+
+ if (idev->cnf.forwarding) {
+ ipv6_addr_all_routers(&maddr);
+ __ipv6_dev_mc_dec(idev, &maddr);
+ }
write_lock_bh(&idev->lock);
while ((i = idev->mc_list) != NULL) {