Lines Matching refs:im
159 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im,
161 static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im);
170 static void ip_ma_put(struct ip_mc_list *im) in ip_ma_put() argument
172 if (refcount_dec_and_test(&im->refcnt)) { in ip_ma_put()
173 in_dev_put(im->interface); in ip_ma_put()
174 kfree_rcu(im, rcu); in ip_ma_put()
205 static void igmp_stop_timer(struct ip_mc_list *im) in igmp_stop_timer() argument
207 spin_lock_bh(&im->lock); in igmp_stop_timer()
208 if (timer_delete(&im->timer)) in igmp_stop_timer()
209 refcount_dec(&im->refcnt); in igmp_stop_timer()
210 im->tm_running = 0; in igmp_stop_timer()
211 im->reporter = 0; in igmp_stop_timer()
212 im->unsolicit_count = 0; in igmp_stop_timer()
213 spin_unlock_bh(&im->lock); in igmp_stop_timer()
217 static void igmp_start_timer(struct ip_mc_list *im, int max_delay) in igmp_start_timer() argument
221 im->tm_running = 1; in igmp_start_timer()
222 if (refcount_inc_not_zero(&im->refcnt)) { in igmp_start_timer()
223 if (mod_timer(&im->timer, jiffies + tv + 2)) in igmp_start_timer()
224 ip_ma_put(im); in igmp_start_timer()
250 static void igmp_mod_timer(struct ip_mc_list *im, int max_delay) in igmp_mod_timer() argument
252 spin_lock_bh(&im->lock); in igmp_mod_timer()
253 im->unsolicit_count = 0; in igmp_mod_timer()
254 if (timer_delete(&im->timer)) { in igmp_mod_timer()
255 if ((long)(im->timer.expires-jiffies) < max_delay) { in igmp_mod_timer()
256 add_timer(&im->timer); in igmp_mod_timer()
257 im->tm_running = 1; in igmp_mod_timer()
258 spin_unlock_bh(&im->lock); in igmp_mod_timer()
261 refcount_dec(&im->refcnt); in igmp_mod_timer()
263 igmp_start_timer(im, max_delay); in igmp_mod_timer()
264 spin_unlock_bh(&im->lock); in igmp_mod_timer()
843 struct ip_mc_list *im = timer_container_of(im, t, timer); in igmp_timer_expire() local
844 struct in_device *in_dev = im->interface; in igmp_timer_expire()
846 spin_lock(&im->lock); in igmp_timer_expire()
847 im->tm_running = 0; in igmp_timer_expire()
849 if (im->unsolicit_count && --im->unsolicit_count) in igmp_timer_expire()
850 igmp_start_timer(im, unsolicited_report_interval(in_dev)); in igmp_timer_expire()
852 im->reporter = 1; in igmp_timer_expire()
853 spin_unlock(&im->lock); in igmp_timer_expire()
856 igmp_send_report(in_dev, im, IGMP_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
858 igmp_send_report(in_dev, im, IGMPV2_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
860 igmp_send_report(in_dev, im, IGMPV3_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
862 ip_ma_put(im); in igmp_timer_expire()
924 struct ip_mc_list *im; in igmp_heard_report() local
936 for_each_pmc_rcu(in_dev, im) { in igmp_heard_report()
937 if (im->multiaddr == group) { in igmp_heard_report()
938 igmp_stop_timer(im); in igmp_heard_report()
952 struct ip_mc_list *im; in igmp_heard_query() local
1049 for_each_pmc_rcu(in_dev, im) { in igmp_heard_query()
1052 if (group && group != im->multiaddr) in igmp_heard_query()
1054 if (im->multiaddr == IGMP_ALL_HOSTS) in igmp_heard_query()
1056 if (ipv4_is_local_multicast(im->multiaddr) && in igmp_heard_query()
1059 spin_lock_bh(&im->lock); in igmp_heard_query()
1060 if (im->tm_running) in igmp_heard_query()
1061 im->gsquery = im->gsquery && mark; in igmp_heard_query()
1063 im->gsquery = mark; in igmp_heard_query()
1064 changed = !im->gsquery || in igmp_heard_query()
1065 igmp_marksources(im, ntohs(ih3->nsrcs), ih3->srcs); in igmp_heard_query()
1066 spin_unlock_bh(&im->lock); in igmp_heard_query()
1068 igmp_mod_timer(im, max_delay); in igmp_heard_query()
1178 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im, in igmpv3_add_delrec() argument
1194 spin_lock_bh(&im->lock); in igmpv3_add_delrec()
1195 pmc->interface = im->interface; in igmpv3_add_delrec()
1197 pmc->multiaddr = im->multiaddr; in igmpv3_add_delrec()
1199 pmc->sfmode = im->sfmode; in igmpv3_add_delrec()
1203 pmc->tomb = im->tomb; in igmpv3_add_delrec()
1204 pmc->sources = im->sources; in igmpv3_add_delrec()
1205 im->tomb = im->sources = NULL; in igmpv3_add_delrec()
1209 spin_unlock_bh(&im->lock); in igmpv3_add_delrec()
1220 static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im) in igmpv3_del_delrec() argument
1225 __be32 multiaddr = im->multiaddr; in igmpv3_del_delrec()
1242 spin_lock_bh(&im->lock); in igmpv3_del_delrec()
1244 im->interface = pmc->interface; in igmpv3_del_delrec()
1245 if (im->sfmode == MCAST_INCLUDE) { in igmpv3_del_delrec()
1246 swap(im->tomb, pmc->tomb); in igmpv3_del_delrec()
1247 swap(im->sources, pmc->sources); in igmpv3_del_delrec()
1248 for (psf = im->sources; psf; psf = psf->sf_next) in igmpv3_del_delrec()
1252 im->crcount = in_dev->mr_qrv ?: in igmpv3_del_delrec()
1258 spin_unlock_bh(&im->lock); in igmpv3_del_delrec()
1294 static void __igmp_group_dropped(struct ip_mc_list *im, gfp_t gfp) in __igmp_group_dropped() argument
1296 struct in_device *in_dev = im->interface; in __igmp_group_dropped()
1302 if (im->loaded) { in __igmp_group_dropped()
1303 im->loaded = 0; in __igmp_group_dropped()
1304 ip_mc_filter_del(in_dev, im->multiaddr); in __igmp_group_dropped()
1308 if (im->multiaddr == IGMP_ALL_HOSTS) in __igmp_group_dropped()
1310 if (ipv4_is_local_multicast(im->multiaddr) && in __igmp_group_dropped()
1314 reporter = im->reporter; in __igmp_group_dropped()
1315 igmp_stop_timer(im); in __igmp_group_dropped()
1322 igmp_send_report(in_dev, im, IGMP_HOST_LEAVE_MESSAGE); in __igmp_group_dropped()
1326 igmpv3_add_delrec(in_dev, im, gfp); in __igmp_group_dropped()
1333 static void igmp_group_dropped(struct ip_mc_list *im) in igmp_group_dropped() argument
1335 __igmp_group_dropped(im, GFP_KERNEL); in igmp_group_dropped()
1338 static void igmp_group_added(struct ip_mc_list *im) in igmp_group_added() argument
1340 struct in_device *in_dev = im->interface; in igmp_group_added()
1345 if (im->loaded == 0) { in igmp_group_added()
1346 im->loaded = 1; in igmp_group_added()
1347 ip_mc_filter_add(in_dev, im->multiaddr); in igmp_group_added()
1351 if (im->multiaddr == IGMP_ALL_HOSTS) in igmp_group_added()
1353 if (ipv4_is_local_multicast(im->multiaddr) && in igmp_group_added()
1360 im->unsolicit_count = READ_ONCE(net->ipv4.sysctl_igmp_qrv); in igmp_group_added()
1362 spin_lock_bh(&im->lock); in igmp_group_added()
1363 igmp_start_timer(im, IGMP_INITIAL_REPORT_DELAY); in igmp_group_added()
1364 spin_unlock_bh(&im->lock); in igmp_group_added()
1373 if (im->sfmode == MCAST_EXCLUDE) in igmp_group_added()
1374 im->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv); in igmp_group_added()
1385 static u32 ip_mc_hash(const struct ip_mc_list *im) in ip_mc_hash() argument
1387 return hash_32((__force u32)im->multiaddr, MC_HASH_SZ_LOG); in ip_mc_hash()
1391 struct ip_mc_list *im) in ip_mc_hash_add() argument
1398 hash = ip_mc_hash(im); in ip_mc_hash_add()
1399 im->next_hash = mc_hash[hash]; in ip_mc_hash_add()
1400 rcu_assign_pointer(mc_hash[hash], im); in ip_mc_hash_add()
1413 for_each_pmc_rtnl(in_dev, im) { in ip_mc_hash_add()
1414 hash = ip_mc_hash(im); in ip_mc_hash_add()
1415 im->next_hash = mc_hash[hash]; in ip_mc_hash_add()
1416 RCU_INIT_POINTER(mc_hash[hash], im); in ip_mc_hash_add()
1423 struct ip_mc_list *im) in ip_mc_hash_remove() argument
1430 mc_hash += ip_mc_hash(im); in ip_mc_hash_remove()
1431 while ((aux = rtnl_dereference(*mc_hash)) != im) in ip_mc_hash_remove()
1433 *mc_hash = im->next_hash; in ip_mc_hash_remove()
1437 const struct ip_mc_list *im, in inet_fill_ifmcaddr() argument
1456 ci.cstamp = (READ_ONCE(im->mca_cstamp) - INITIAL_JIFFIES) * 100UL / HZ; in inet_fill_ifmcaddr()
1461 if (nla_put_in_addr(skb, IFA_MULTICAST, im->multiaddr) < 0 || in inet_fill_ifmcaddr()
1472 const struct ip_mc_list *im, int event) in inet_ifmcaddr_notify() argument
1488 err = inet_fill_ifmcaddr(skb, dev, im, &fillargs); in inet_ifmcaddr_notify()
1508 struct ip_mc_list *im; in ____ip_mc_inc_group() local
1516 for (im = rtnl_dereference(mc_hash[hash]); in ____ip_mc_inc_group()
1517 im; in ____ip_mc_inc_group()
1518 im = rtnl_dereference(im->next_hash)) { in ____ip_mc_inc_group()
1519 if (im->multiaddr == addr) in ____ip_mc_inc_group()
1523 for_each_pmc_rtnl(in_dev, im) { in ____ip_mc_inc_group()
1524 if (im->multiaddr == addr) in ____ip_mc_inc_group()
1529 if (im) { in ____ip_mc_inc_group()
1530 im->users++; in ____ip_mc_inc_group()
1535 im = kzalloc(sizeof(*im), gfp); in ____ip_mc_inc_group()
1536 if (!im) in ____ip_mc_inc_group()
1539 im->users = 1; in ____ip_mc_inc_group()
1540 im->interface = in_dev; in ____ip_mc_inc_group()
1542 im->multiaddr = addr; in ____ip_mc_inc_group()
1543 im->mca_cstamp = jiffies; in ____ip_mc_inc_group()
1544 im->mca_tstamp = im->mca_cstamp; in ____ip_mc_inc_group()
1546 im->sfmode = mode; in ____ip_mc_inc_group()
1547 im->sfcount[mode] = 1; in ____ip_mc_inc_group()
1548 refcount_set(&im->refcnt, 1); in ____ip_mc_inc_group()
1549 spin_lock_init(&im->lock); in ____ip_mc_inc_group()
1551 timer_setup(&im->timer, igmp_timer_expire, 0); in ____ip_mc_inc_group()
1554 im->next_rcu = in_dev->mc_list; in ____ip_mc_inc_group()
1556 rcu_assign_pointer(in_dev->mc_list, im); in ____ip_mc_inc_group()
1558 ip_mc_hash_add(in_dev, im); in ____ip_mc_inc_group()
1561 igmpv3_del_delrec(in_dev, im); in ____ip_mc_inc_group()
1563 igmp_group_added(im); in ____ip_mc_inc_group()
1564 inet_ifmcaddr_notify(in_dev->dev, im, RTM_NEWMULTICAST); in ____ip_mc_inc_group()
1731 struct ip_mc_list *im; in ip_mc_rejoin_groups() local
1737 for_each_pmc_rtnl(in_dev, im) { in ip_mc_rejoin_groups()
1738 if (im->multiaddr == IGMP_ALL_HOSTS) in ip_mc_rejoin_groups()
1740 if (ipv4_is_local_multicast(im->multiaddr) && in ip_mc_rejoin_groups()
1753 igmp_send_report(in_dev, im, type); in ip_mc_rejoin_groups()
2809 struct ip_mc_list *im; in ip_check_mc_rcu() local
2818 for (im = rcu_dereference(mc_hash[hash]); in ip_check_mc_rcu()
2819 im != NULL; in ip_check_mc_rcu()
2820 im = rcu_dereference(im->next_hash)) { in ip_check_mc_rcu()
2821 if (im->multiaddr == mc_addr) in ip_check_mc_rcu()
2825 for_each_pmc_rcu(in_dev, im) { in ip_check_mc_rcu()
2826 if (im->multiaddr == mc_addr) in ip_check_mc_rcu()
2830 if (im && proto == IPPROTO_IGMP) { in ip_check_mc_rcu()
2832 } else if (im) { in ip_check_mc_rcu()
2834 spin_lock_bh(&im->lock); in ip_check_mc_rcu()
2835 for (psf = im->sources; psf; psf = psf->sf_next) { in ip_check_mc_rcu()
2842 im->sfcount[MCAST_EXCLUDE]; in ip_check_mc_rcu()
2844 rv = im->sfcount[MCAST_EXCLUDE] != 0; in ip_check_mc_rcu()
2845 spin_unlock_bh(&im->lock); in ip_check_mc_rcu()
2864 struct ip_mc_list *im = NULL; in igmp_mc_get_first() local
2874 im = rcu_dereference(in_dev->mc_list); in igmp_mc_get_first()
2875 if (im) { in igmp_mc_get_first()
2880 return im; in igmp_mc_get_first()
2883 static struct ip_mc_list *igmp_mc_get_next(struct seq_file *seq, struct ip_mc_list *im) in igmp_mc_get_next() argument
2887 im = rcu_dereference(im->next_rcu); in igmp_mc_get_next()
2888 while (!im) { in igmp_mc_get_next()
2897 im = rcu_dereference(state->in_dev->mc_list); in igmp_mc_get_next()
2899 return im; in igmp_mc_get_next()
2904 struct ip_mc_list *im = igmp_mc_get_first(seq); in igmp_mc_get_idx() local
2905 if (im) in igmp_mc_get_idx()
2906 while (pos && (im = igmp_mc_get_next(seq, im)) != NULL) in igmp_mc_get_idx()
2908 return pos ? NULL : im; in igmp_mc_get_idx()
2920 struct ip_mc_list *im; in igmp_mc_seq_next() local
2922 im = igmp_mc_get_first(seq); in igmp_mc_seq_next()
2924 im = igmp_mc_get_next(seq, v); in igmp_mc_seq_next()
2926 return im; in igmp_mc_seq_next()
2945 struct ip_mc_list *im = v; in igmp_mc_seq_show() local
2958 if (rcu_access_pointer(state->in_dev->mc_list) == im) { in igmp_mc_seq_show()
2963 delta = im->timer.expires - jiffies; in igmp_mc_seq_show()
2966 im->multiaddr, im->users, in igmp_mc_seq_show()
2967 im->tm_running, in igmp_mc_seq_show()
2968 im->tm_running ? jiffies_delta_to_clock_t(delta) : 0, in igmp_mc_seq_show()
2969 im->reporter); in igmp_mc_seq_show()
2985 struct ip_mc_list *im; member
2994 struct ip_mc_list *im = NULL; in igmp_mcf_get_first() local
2998 state->im = NULL; in igmp_mcf_get_first()
3004 im = rcu_dereference(idev->mc_list); in igmp_mcf_get_first()
3005 if (likely(im)) { in igmp_mcf_get_first()
3006 spin_lock_bh(&im->lock); in igmp_mcf_get_first()
3007 psf = im->sources; in igmp_mcf_get_first()
3009 state->im = im; in igmp_mcf_get_first()
3013 spin_unlock_bh(&im->lock); in igmp_mcf_get_first()
3025 spin_unlock_bh(&state->im->lock); in igmp_mcf_get_next()
3026 state->im = state->im->next; in igmp_mcf_get_next()
3027 while (!state->im) { in igmp_mcf_get_next()
3036 state->im = rcu_dereference(state->idev->mc_list); in igmp_mcf_get_next()
3038 spin_lock_bh(&state->im->lock); in igmp_mcf_get_next()
3039 psf = state->im->sources; in igmp_mcf_get_next()
3076 if (likely(state->im)) { in igmp_mcf_seq_stop()
3077 spin_unlock_bh(&state->im->lock); in igmp_mcf_seq_stop()
3078 state->im = NULL; in igmp_mcf_seq_stop()
3097 ntohl(state->im->multiaddr), in igmp_mcf_seq_show()