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); }
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)); } }
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); }
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; } } }