Ejemplo n.º 1
0
void ip_mc_down(struct in_device *in_dev)
{
	struct ip_mc_list *i;

	for (i=in_dev->mc_list; i; i=i->next)
		igmp_group_dropped(i);

	ip_mc_dec_group(in_dev, IGMP_ALL_HOSTS);
}
Ejemplo n.º 2
0
void ip_mc_destroy_dev(struct in_device *in_dev)
{
	struct ip_mc_list *i;

	while ((i = in_dev->mc_list) != NULL) {
		in_dev->mc_list = i->next;
		igmp_group_dropped(i);
		kfree_s(i, sizeof(*i));
	}
}
Ejemplo n.º 3
0
static void ip_mc_dec_group(struct device *dev, unsigned long addr)
{
	struct ip_mc_list **i;
	for(i=&(dev->ip_mc_list);(*i)!=NULL;i=&(*i)->next)
	{
		if((*i)->multiaddr==addr)
		{
			if(--((*i)->users) == 0)
			{
				struct ip_mc_list *tmp= *i;
				igmp_group_dropped(tmp);
				*i=(*i)->next;
				kfree_s(tmp,sizeof(*tmp));
			}
			return;
		}
	}
}
void ip_mc_destroy_dev(struct in_device *in_dev)
{
    struct ip_mc_list *i;

    ASSERT_RTNL();

    write_lock_bh(&in_dev->lock);
    while ((i = in_dev->mc_list) != NULL) {
        in_dev->mc_list = i->next;
        write_unlock_bh(&in_dev->lock);

        igmp_group_dropped(i);
        ip_ma_put(i);

        write_lock_bh(&in_dev->lock);
    }
    write_unlock_bh(&in_dev->lock);
}
void ip_mc_down(struct in_device *in_dev)
{
    struct ip_mc_list *i;

#ifdef CONFIG_RG_IGMP_PROXY
    igmprx_if_down(in_dev);
#endif
#ifdef CONFIG_RG_IGMP_PROXY_MODULE
    if (igmp_proxy_if_down)
        igmp_proxy_if_down(in_dev);
#endif

    ASSERT_RTNL();

    for (i=in_dev->mc_list; i; i=i->next)
        igmp_group_dropped(i);

    ip_mc_dec_group(in_dev, IGMP_ALL_HOSTS);
}
Ejemplo n.º 6
0
int ip_mc_dec_group(struct in_device *in_dev, u32 addr)
{
	struct ip_mc_list *i, **ip;

	for (ip=&in_dev->mc_list; (i=*ip)!=NULL; ip=&i->next) {
		if (i->multiaddr==addr) {
			if (--i->users == 0) {
				*ip = i->next;
				synchronize_bh();

				igmp_group_dropped(i);
				if (in_dev->dev->flags & IFF_UP)
					ip_rt_multicast_event(in_dev);
				kfree_s(i, sizeof(*i));
			}
			return 0;
		}
	}
	return -ESRCH;
}
void ip_mc_dec_group(struct in_device *in_dev, u32 addr)
{
    struct ip_mc_list *i, **ip;

    ASSERT_RTNL();

    for (ip=&in_dev->mc_list; (i=*ip)!=NULL; ip=&i->next) {
        if (i->multiaddr==addr) {
            if (--i->users == 0) {
                write_lock_bh(&in_dev->lock);
                *ip = i->next;
                write_unlock_bh(&in_dev->lock);
                igmp_group_dropped(i);

                if (in_dev->dev->flags & IFF_UP)
                    ip_rt_multicast_event(in_dev);

                ip_ma_put(i);
                return;
            }
            break;
        }
    }
}