Lines Matching full:im
158 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im,
160 static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im);
169 static void ip_ma_put(struct ip_mc_list *im) in ip_ma_put() argument
171 if (refcount_dec_and_test(&im->refcnt)) { in ip_ma_put()
172 in_dev_put(im->interface); in ip_ma_put()
173 kfree_rcu(im, rcu); in ip_ma_put()
204 static void igmp_stop_timer(struct ip_mc_list *im) in igmp_stop_timer() argument
206 spin_lock_bh(&im->lock); in igmp_stop_timer()
207 if (del_timer(&im->timer)) in igmp_stop_timer()
208 refcount_dec(&im->refcnt); in igmp_stop_timer()
209 im->tm_running = 0; in igmp_stop_timer()
210 im->reporter = 0; in igmp_stop_timer()
211 im->unsolicit_count = 0; in igmp_stop_timer()
212 spin_unlock_bh(&im->lock); in igmp_stop_timer()
215 /* It must be called with locked im->lock */
216 static void igmp_start_timer(struct ip_mc_list *im, int max_delay) in igmp_start_timer() argument
220 im->tm_running = 1; in igmp_start_timer()
221 if (refcount_inc_not_zero(&im->refcnt)) { in igmp_start_timer()
222 if (mod_timer(&im->timer, jiffies + tv + 2)) in igmp_start_timer()
223 ip_ma_put(im); in igmp_start_timer()
249 static void igmp_mod_timer(struct ip_mc_list *im, int max_delay) in igmp_mod_timer() argument
251 spin_lock_bh(&im->lock); in igmp_mod_timer()
252 im->unsolicit_count = 0; in igmp_mod_timer()
253 if (del_timer(&im->timer)) { in igmp_mod_timer()
254 if ((long)(im->timer.expires-jiffies) < max_delay) { in igmp_mod_timer()
255 add_timer(&im->timer); in igmp_mod_timer()
256 im->tm_running = 1; in igmp_mod_timer()
257 spin_unlock_bh(&im->lock); in igmp_mod_timer()
260 refcount_dec(&im->refcnt); in igmp_mod_timer()
262 igmp_start_timer(im, max_delay); in igmp_mod_timer()
263 spin_unlock_bh(&im->lock); in igmp_mod_timer()
842 struct ip_mc_list *im = from_timer(im, t, timer); in igmp_timer_expire() local
843 struct in_device *in_dev = im->interface; in igmp_timer_expire()
845 spin_lock(&im->lock); in igmp_timer_expire()
846 im->tm_running = 0; in igmp_timer_expire()
848 if (im->unsolicit_count && --im->unsolicit_count) in igmp_timer_expire()
849 igmp_start_timer(im, unsolicited_report_interval(in_dev)); in igmp_timer_expire()
851 im->reporter = 1; in igmp_timer_expire()
852 spin_unlock(&im->lock); in igmp_timer_expire()
855 igmp_send_report(in_dev, im, IGMP_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
857 igmp_send_report(in_dev, im, IGMPV2_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
859 igmp_send_report(in_dev, im, IGMPV3_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
861 ip_ma_put(im); in igmp_timer_expire()
923 struct ip_mc_list *im; in igmp_heard_report() local
935 for_each_pmc_rcu(in_dev, im) { in igmp_heard_report()
936 if (im->multiaddr == group) { in igmp_heard_report()
937 igmp_stop_timer(im); in igmp_heard_report()
951 struct ip_mc_list *im; in igmp_heard_query() local
1048 for_each_pmc_rcu(in_dev, im) { in igmp_heard_query()
1051 if (group && group != im->multiaddr) in igmp_heard_query()
1053 if (im->multiaddr == IGMP_ALL_HOSTS) in igmp_heard_query()
1055 if (ipv4_is_local_multicast(im->multiaddr) && in igmp_heard_query()
1058 spin_lock_bh(&im->lock); in igmp_heard_query()
1059 if (im->tm_running) in igmp_heard_query()
1060 im->gsquery = im->gsquery && mark; in igmp_heard_query()
1062 im->gsquery = mark; in igmp_heard_query()
1063 changed = !im->gsquery || in igmp_heard_query()
1064 igmp_marksources(im, ntohs(ih3->nsrcs), ih3->srcs); in igmp_heard_query()
1065 spin_unlock_bh(&im->lock); in igmp_heard_query()
1067 igmp_mod_timer(im, max_delay); in igmp_heard_query()
1177 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im, in igmpv3_add_delrec() argument
1193 spin_lock_bh(&im->lock); in igmpv3_add_delrec()
1194 pmc->interface = im->interface; in igmpv3_add_delrec()
1196 pmc->multiaddr = im->multiaddr; in igmpv3_add_delrec()
1198 pmc->sfmode = im->sfmode; in igmpv3_add_delrec()
1202 pmc->tomb = im->tomb; in igmpv3_add_delrec()
1203 pmc->sources = im->sources; in igmpv3_add_delrec()
1204 im->tomb = im->sources = NULL; in igmpv3_add_delrec()
1208 spin_unlock_bh(&im->lock); in igmpv3_add_delrec()
1219 static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im) in igmpv3_del_delrec() argument
1224 __be32 multiaddr = im->multiaddr; in igmpv3_del_delrec()
1241 spin_lock_bh(&im->lock); in igmpv3_del_delrec()
1243 im->interface = pmc->interface; in igmpv3_del_delrec()
1244 if (im->sfmode == MCAST_INCLUDE) { in igmpv3_del_delrec()
1245 swap(im->tomb, pmc->tomb); in igmpv3_del_delrec()
1246 swap(im->sources, pmc->sources); in igmpv3_del_delrec()
1247 for (psf = im->sources; psf; psf = psf->sf_next) in igmpv3_del_delrec()
1251 im->crcount = in_dev->mr_qrv ?: in igmpv3_del_delrec()
1257 spin_unlock_bh(&im->lock); in igmpv3_del_delrec()
1293 static void __igmp_group_dropped(struct ip_mc_list *im, gfp_t gfp) in __igmp_group_dropped() argument
1295 struct in_device *in_dev = im->interface; in __igmp_group_dropped()
1301 if (im->loaded) { in __igmp_group_dropped()
1302 im->loaded = 0; in __igmp_group_dropped()
1303 ip_mc_filter_del(in_dev, im->multiaddr); in __igmp_group_dropped()
1307 if (im->multiaddr == IGMP_ALL_HOSTS) in __igmp_group_dropped()
1309 if (ipv4_is_local_multicast(im->multiaddr) && in __igmp_group_dropped()
1313 reporter = im->reporter; in __igmp_group_dropped()
1314 igmp_stop_timer(im); in __igmp_group_dropped()
1321 igmp_send_report(in_dev, im, IGMP_HOST_LEAVE_MESSAGE); in __igmp_group_dropped()
1325 igmpv3_add_delrec(in_dev, im, gfp); in __igmp_group_dropped()
1332 static void igmp_group_dropped(struct ip_mc_list *im) in igmp_group_dropped() argument
1334 __igmp_group_dropped(im, GFP_KERNEL); in igmp_group_dropped()
1337 static void igmp_group_added(struct ip_mc_list *im) in igmp_group_added() argument
1339 struct in_device *in_dev = im->interface; in igmp_group_added()
1344 if (im->loaded == 0) { in igmp_group_added()
1345 im->loaded = 1; in igmp_group_added()
1346 ip_mc_filter_add(in_dev, im->multiaddr); in igmp_group_added()
1350 if (im->multiaddr == IGMP_ALL_HOSTS) in igmp_group_added()
1352 if (ipv4_is_local_multicast(im->multiaddr) && in igmp_group_added()
1359 im->unsolicit_count = READ_ONCE(net->ipv4.sysctl_igmp_qrv); in igmp_group_added()
1361 spin_lock_bh(&im->lock); in igmp_group_added()
1362 igmp_start_timer(im, IGMP_INITIAL_REPORT_DELAY); in igmp_group_added()
1363 spin_unlock_bh(&im->lock); in igmp_group_added()
1372 if (im->sfmode == MCAST_EXCLUDE) in igmp_group_added()
1373 im->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv); in igmp_group_added()
1384 static u32 ip_mc_hash(const struct ip_mc_list *im) in ip_mc_hash() argument
1386 return hash_32((__force u32)im->multiaddr, MC_HASH_SZ_LOG); in ip_mc_hash()
1390 struct ip_mc_list *im) in ip_mc_hash_add() argument
1397 hash = ip_mc_hash(im); in ip_mc_hash_add()
1398 im->next_hash = mc_hash[hash]; in ip_mc_hash_add()
1399 rcu_assign_pointer(mc_hash[hash], im); in ip_mc_hash_add()
1412 for_each_pmc_rtnl(in_dev, im) { in ip_mc_hash_add()
1413 hash = ip_mc_hash(im); in ip_mc_hash_add()
1414 im->next_hash = mc_hash[hash]; in ip_mc_hash_add()
1415 RCU_INIT_POINTER(mc_hash[hash], im); in ip_mc_hash_add()
1422 struct ip_mc_list *im) in ip_mc_hash_remove() argument
1429 mc_hash += ip_mc_hash(im); in ip_mc_hash_remove()
1430 while ((aux = rtnl_dereference(*mc_hash)) != im) in ip_mc_hash_remove()
1432 *mc_hash = im->next_hash; in ip_mc_hash_remove()
1436 const struct ip_mc_list *im, int event) in inet_fill_ifmcaddr() argument
1453 ci.cstamp = (READ_ONCE(im->mca_cstamp) - INITIAL_JIFFIES) * 100UL / HZ; in inet_fill_ifmcaddr()
1458 if (nla_put_in_addr(skb, IFA_MULTICAST, im->multiaddr) < 0 || in inet_fill_ifmcaddr()
1469 const struct ip_mc_list *im, int event) in inet_ifmcaddr_notify() argument
1482 err = inet_fill_ifmcaddr(skb, dev, im, event); in inet_ifmcaddr_notify()
1502 struct ip_mc_list *im; in ____ip_mc_inc_group() local
1510 for (im = rtnl_dereference(mc_hash[hash]); in ____ip_mc_inc_group()
1511 im; in ____ip_mc_inc_group()
1512 im = rtnl_dereference(im->next_hash)) { in ____ip_mc_inc_group()
1513 if (im->multiaddr == addr) in ____ip_mc_inc_group()
1517 for_each_pmc_rtnl(in_dev, im) { in ____ip_mc_inc_group()
1518 if (im->multiaddr == addr) in ____ip_mc_inc_group()
1523 if (im) { in ____ip_mc_inc_group()
1524 im->users++; in ____ip_mc_inc_group()
1529 im = kzalloc(sizeof(*im), gfp); in ____ip_mc_inc_group()
1530 if (!im) in ____ip_mc_inc_group()
1533 im->users = 1; in ____ip_mc_inc_group()
1534 im->interface = in_dev; in ____ip_mc_inc_group()
1536 im->multiaddr = addr; in ____ip_mc_inc_group()
1537 im->mca_cstamp = jiffies; in ____ip_mc_inc_group()
1538 im->mca_tstamp = im->mca_cstamp; in ____ip_mc_inc_group()
1540 im->sfmode = mode; in ____ip_mc_inc_group()
1541 im->sfcount[mode] = 1; in ____ip_mc_inc_group()
1542 refcount_set(&im->refcnt, 1); in ____ip_mc_inc_group()
1543 spin_lock_init(&im->lock); in ____ip_mc_inc_group()
1545 timer_setup(&im->timer, igmp_timer_expire, 0); in ____ip_mc_inc_group()
1548 im->next_rcu = in_dev->mc_list; in ____ip_mc_inc_group()
1550 rcu_assign_pointer(in_dev->mc_list, im); in ____ip_mc_inc_group()
1552 ip_mc_hash_add(in_dev, im); in ____ip_mc_inc_group()
1555 igmpv3_del_delrec(in_dev, im); in ____ip_mc_inc_group()
1557 igmp_group_added(im); in ____ip_mc_inc_group()
1558 inet_ifmcaddr_notify(in_dev->dev, im, RTM_NEWMULTICAST); in ____ip_mc_inc_group()
1725 struct ip_mc_list *im; in ip_mc_rejoin_groups() local
1731 for_each_pmc_rtnl(in_dev, im) { in ip_mc_rejoin_groups()
1732 if (im->multiaddr == IGMP_ALL_HOSTS) in ip_mc_rejoin_groups()
1734 if (ipv4_is_local_multicast(im->multiaddr) && in ip_mc_rejoin_groups()
1747 igmp_send_report(in_dev, im, type); in ip_mc_rejoin_groups()
2803 struct ip_mc_list *im; in ip_check_mc_rcu() local
2812 for (im = rcu_dereference(mc_hash[hash]); in ip_check_mc_rcu()
2813 im != NULL; in ip_check_mc_rcu()
2814 im = rcu_dereference(im->next_hash)) { in ip_check_mc_rcu()
2815 if (im->multiaddr == mc_addr) in ip_check_mc_rcu()
2819 for_each_pmc_rcu(in_dev, im) { in ip_check_mc_rcu()
2820 if (im->multiaddr == mc_addr) in ip_check_mc_rcu()
2824 if (im && proto == IPPROTO_IGMP) { in ip_check_mc_rcu()
2826 } else if (im) { in ip_check_mc_rcu()
2828 spin_lock_bh(&im->lock); in ip_check_mc_rcu()
2829 for (psf = im->sources; psf; psf = psf->sf_next) { in ip_check_mc_rcu()
2836 im->sfcount[MCAST_EXCLUDE]; in ip_check_mc_rcu()
2838 rv = im->sfcount[MCAST_EXCLUDE] != 0; in ip_check_mc_rcu()
2839 spin_unlock_bh(&im->lock); in ip_check_mc_rcu()
2858 struct ip_mc_list *im = NULL; in igmp_mc_get_first() local
2868 im = rcu_dereference(in_dev->mc_list); in igmp_mc_get_first()
2869 if (im) { in igmp_mc_get_first()
2874 return im; in igmp_mc_get_first()
2877 static struct ip_mc_list *igmp_mc_get_next(struct seq_file *seq, struct ip_mc_list *im) in igmp_mc_get_next() argument
2881 im = rcu_dereference(im->next_rcu); in igmp_mc_get_next()
2882 while (!im) { in igmp_mc_get_next()
2891 im = rcu_dereference(state->in_dev->mc_list); in igmp_mc_get_next()
2893 return im; in igmp_mc_get_next()
2898 struct ip_mc_list *im = igmp_mc_get_first(seq); in igmp_mc_get_idx() local
2899 if (im) in igmp_mc_get_idx()
2900 while (pos && (im = igmp_mc_get_next(seq, im)) != NULL) in igmp_mc_get_idx()
2902 return pos ? NULL : im; in igmp_mc_get_idx()
2914 struct ip_mc_list *im; in igmp_mc_seq_next() local
2916 im = igmp_mc_get_first(seq); in igmp_mc_seq_next()
2918 im = igmp_mc_get_next(seq, v); in igmp_mc_seq_next()
2920 return im; in igmp_mc_seq_next()
2939 struct ip_mc_list *im = v; in igmp_mc_seq_show() local
2952 if (rcu_access_pointer(state->in_dev->mc_list) == im) { in igmp_mc_seq_show()
2957 delta = im->timer.expires - jiffies; in igmp_mc_seq_show()
2960 im->multiaddr, im->users, in igmp_mc_seq_show()
2961 im->tm_running, in igmp_mc_seq_show()
2962 im->tm_running ? jiffies_delta_to_clock_t(delta) : 0, in igmp_mc_seq_show()
2963 im->reporter); in igmp_mc_seq_show()
2979 struct ip_mc_list *im; member
2988 struct ip_mc_list *im = NULL; in igmp_mcf_get_first() local
2992 state->im = NULL; in igmp_mcf_get_first()
2998 im = rcu_dereference(idev->mc_list); in igmp_mcf_get_first()
2999 if (likely(im)) { in igmp_mcf_get_first()
3000 spin_lock_bh(&im->lock); in igmp_mcf_get_first()
3001 psf = im->sources; in igmp_mcf_get_first()
3003 state->im = im; in igmp_mcf_get_first()
3007 spin_unlock_bh(&im->lock); in igmp_mcf_get_first()
3019 spin_unlock_bh(&state->im->lock); in igmp_mcf_get_next()
3020 state->im = state->im->next; in igmp_mcf_get_next()
3021 while (!state->im) { in igmp_mcf_get_next()
3030 state->im = rcu_dereference(state->idev->mc_list); in igmp_mcf_get_next()
3032 spin_lock_bh(&state->im->lock); in igmp_mcf_get_next()
3033 psf = state->im->sources; in igmp_mcf_get_next()
3070 if (likely(state->im)) { in igmp_mcf_seq_stop()
3071 spin_unlock_bh(&state->im->lock); in igmp_mcf_seq_stop()
3072 state->im = NULL; in igmp_mcf_seq_stop()
3091 ntohl(state->im->multiaddr), in igmp_mcf_seq_show()