Lines Matching refs:im

165 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im);
166 static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im);
175 static void ip_ma_put(struct ip_mc_list *im) in ip_ma_put() argument
177 if (refcount_dec_and_test(&im->refcnt)) { in ip_ma_put()
178 in_dev_put(im->interface); in ip_ma_put()
179 kfree_rcu(im, rcu); in ip_ma_put()
199 static void igmp_stop_timer(struct ip_mc_list *im) in igmp_stop_timer() argument
201 spin_lock_bh(&im->lock); in igmp_stop_timer()
202 if (del_timer(&im->timer)) in igmp_stop_timer()
203 refcount_dec(&im->refcnt); in igmp_stop_timer()
204 im->tm_running = 0; in igmp_stop_timer()
205 im->reporter = 0; in igmp_stop_timer()
206 im->unsolicit_count = 0; in igmp_stop_timer()
207 spin_unlock_bh(&im->lock); in igmp_stop_timer()
211 static void igmp_start_timer(struct ip_mc_list *im, int max_delay) in igmp_start_timer() argument
215 im->tm_running = 1; in igmp_start_timer()
216 if (!mod_timer(&im->timer, jiffies+tv+2)) in igmp_start_timer()
217 refcount_inc(&im->refcnt); in igmp_start_timer()
242 static void igmp_mod_timer(struct ip_mc_list *im, int max_delay) in igmp_mod_timer() argument
244 spin_lock_bh(&im->lock); in igmp_mod_timer()
245 im->unsolicit_count = 0; in igmp_mod_timer()
246 if (del_timer(&im->timer)) { in igmp_mod_timer()
247 if ((long)(im->timer.expires-jiffies) < max_delay) { in igmp_mod_timer()
248 add_timer(&im->timer); in igmp_mod_timer()
249 im->tm_running = 1; in igmp_mod_timer()
250 spin_unlock_bh(&im->lock); in igmp_mod_timer()
253 refcount_dec(&im->refcnt); in igmp_mod_timer()
255 igmp_start_timer(im, max_delay); in igmp_mod_timer()
256 spin_unlock_bh(&im->lock); in igmp_mod_timer()
817 struct ip_mc_list *im = from_timer(im, t, timer); in igmp_timer_expire() local
818 struct in_device *in_dev = im->interface; in igmp_timer_expire()
820 spin_lock(&im->lock); in igmp_timer_expire()
821 im->tm_running = 0; in igmp_timer_expire()
823 if (im->unsolicit_count && --im->unsolicit_count) in igmp_timer_expire()
824 igmp_start_timer(im, unsolicited_report_interval(in_dev)); in igmp_timer_expire()
826 im->reporter = 1; in igmp_timer_expire()
827 spin_unlock(&im->lock); in igmp_timer_expire()
830 igmp_send_report(in_dev, im, IGMP_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
832 igmp_send_report(in_dev, im, IGMPV2_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
834 igmp_send_report(in_dev, im, IGMPV3_HOST_MEMBERSHIP_REPORT); in igmp_timer_expire()
836 ip_ma_put(im); in igmp_timer_expire()
898 struct ip_mc_list *im; in igmp_heard_report() local
909 for_each_pmc_rcu(in_dev, im) { in igmp_heard_report()
910 if (im->multiaddr == group) { in igmp_heard_report()
911 igmp_stop_timer(im); in igmp_heard_report()
925 struct ip_mc_list *im; in igmp_heard_query() local
1007 for_each_pmc_rcu(in_dev, im) { in igmp_heard_query()
1010 if (group && group != im->multiaddr) in igmp_heard_query()
1012 if (im->multiaddr == IGMP_ALL_HOSTS) in igmp_heard_query()
1014 if (ipv4_is_local_multicast(im->multiaddr) && in igmp_heard_query()
1017 spin_lock_bh(&im->lock); in igmp_heard_query()
1018 if (im->tm_running) in igmp_heard_query()
1019 im->gsquery = im->gsquery && mark; in igmp_heard_query()
1021 im->gsquery = mark; in igmp_heard_query()
1022 changed = !im->gsquery || in igmp_heard_query()
1023 igmp_marksources(im, ntohs(ih3->nsrcs), ih3->srcs); in igmp_heard_query()
1024 spin_unlock_bh(&im->lock); in igmp_heard_query()
1026 igmp_mod_timer(im, max_delay); in igmp_heard_query()
1136 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im) in igmpv3_add_delrec() argument
1151 spin_lock_bh(&im->lock); in igmpv3_add_delrec()
1152 pmc->interface = im->interface; in igmpv3_add_delrec()
1154 pmc->multiaddr = im->multiaddr; in igmpv3_add_delrec()
1156 pmc->sfmode = im->sfmode; in igmpv3_add_delrec()
1160 pmc->tomb = im->tomb; in igmpv3_add_delrec()
1161 pmc->sources = im->sources; in igmpv3_add_delrec()
1162 im->tomb = im->sources = NULL; in igmpv3_add_delrec()
1166 spin_unlock_bh(&im->lock); in igmpv3_add_delrec()
1177 static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im) in igmpv3_del_delrec() argument
1182 __be32 multiaddr = im->multiaddr; in igmpv3_del_delrec()
1199 spin_lock_bh(&im->lock); in igmpv3_del_delrec()
1201 im->interface = pmc->interface; in igmpv3_del_delrec()
1202 if (im->sfmode == MCAST_INCLUDE) { in igmpv3_del_delrec()
1203 im->tomb = pmc->tomb; in igmpv3_del_delrec()
1204 im->sources = pmc->sources; in igmpv3_del_delrec()
1205 for (psf = im->sources; psf; psf = psf->sf_next) in igmpv3_del_delrec()
1208 im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; in igmpv3_del_delrec()
1213 spin_unlock_bh(&im->lock); in igmpv3_del_delrec()
1252 static void igmp_group_dropped(struct ip_mc_list *im) in igmp_group_dropped() argument
1254 struct in_device *in_dev = im->interface; in igmp_group_dropped()
1260 if (im->loaded) { in igmp_group_dropped()
1261 im->loaded = 0; in igmp_group_dropped()
1262 ip_mc_filter_del(in_dev, im->multiaddr); in igmp_group_dropped()
1266 if (im->multiaddr == IGMP_ALL_HOSTS) in igmp_group_dropped()
1268 if (ipv4_is_local_multicast(im->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports) in igmp_group_dropped()
1271 reporter = im->reporter; in igmp_group_dropped()
1272 igmp_stop_timer(im); in igmp_group_dropped()
1279 igmp_send_report(in_dev, im, IGMP_HOST_LEAVE_MESSAGE); in igmp_group_dropped()
1283 igmpv3_add_delrec(in_dev, im); in igmp_group_dropped()
1290 static void igmp_group_added(struct ip_mc_list *im) in igmp_group_added() argument
1292 struct in_device *in_dev = im->interface; in igmp_group_added()
1297 if (im->loaded == 0) { in igmp_group_added()
1298 im->loaded = 1; in igmp_group_added()
1299 ip_mc_filter_add(in_dev, im->multiaddr); in igmp_group_added()
1303 if (im->multiaddr == IGMP_ALL_HOSTS) in igmp_group_added()
1305 if (ipv4_is_local_multicast(im->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports) in igmp_group_added()
1311 im->unsolicit_count = net->ipv4.sysctl_igmp_qrv; in igmp_group_added()
1313 spin_lock_bh(&im->lock); in igmp_group_added()
1314 igmp_start_timer(im, IGMP_INITIAL_REPORT_DELAY); in igmp_group_added()
1315 spin_unlock_bh(&im->lock); in igmp_group_added()
1324 if (im->sfmode == MCAST_EXCLUDE) in igmp_group_added()
1325 im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; in igmp_group_added()
1336 static u32 ip_mc_hash(const struct ip_mc_list *im) in ip_mc_hash() argument
1338 return hash_32((__force u32)im->multiaddr, MC_HASH_SZ_LOG); in ip_mc_hash()
1342 struct ip_mc_list *im) in ip_mc_hash_add() argument
1349 hash = ip_mc_hash(im); in ip_mc_hash_add()
1350 im->next_hash = mc_hash[hash]; in ip_mc_hash_add()
1351 rcu_assign_pointer(mc_hash[hash], im); in ip_mc_hash_add()
1364 for_each_pmc_rtnl(in_dev, im) { in ip_mc_hash_add()
1365 hash = ip_mc_hash(im); in ip_mc_hash_add()
1366 im->next_hash = mc_hash[hash]; in ip_mc_hash_add()
1367 RCU_INIT_POINTER(mc_hash[hash], im); in ip_mc_hash_add()
1374 struct ip_mc_list *im) in ip_mc_hash_remove() argument
1381 mc_hash += ip_mc_hash(im); in ip_mc_hash_remove()
1382 while ((aux = rtnl_dereference(*mc_hash)) != im) in ip_mc_hash_remove()
1384 *mc_hash = im->next_hash; in ip_mc_hash_remove()
1394 struct ip_mc_list *im; in __ip_mc_inc_group() local
1398 for_each_pmc_rtnl(in_dev, im) { in __ip_mc_inc_group()
1399 if (im->multiaddr == addr) { in __ip_mc_inc_group()
1400 im->users++; in __ip_mc_inc_group()
1406 im = kzalloc(sizeof(*im), GFP_KERNEL); in __ip_mc_inc_group()
1407 if (!im) in __ip_mc_inc_group()
1410 im->users = 1; in __ip_mc_inc_group()
1411 im->interface = in_dev; in __ip_mc_inc_group()
1413 im->multiaddr = addr; in __ip_mc_inc_group()
1415 im->sfmode = mode; in __ip_mc_inc_group()
1416 im->sfcount[mode] = 1; in __ip_mc_inc_group()
1417 refcount_set(&im->refcnt, 1); in __ip_mc_inc_group()
1418 spin_lock_init(&im->lock); in __ip_mc_inc_group()
1420 timer_setup(&im->timer, igmp_timer_expire, 0); in __ip_mc_inc_group()
1423 im->next_rcu = in_dev->mc_list; in __ip_mc_inc_group()
1425 rcu_assign_pointer(in_dev->mc_list, im); in __ip_mc_inc_group()
1427 ip_mc_hash_add(in_dev, im); in __ip_mc_inc_group()
1430 igmpv3_del_delrec(in_dev, im); in __ip_mc_inc_group()
1432 igmp_group_added(im); in __ip_mc_inc_group()
1616 struct ip_mc_list *im; in ip_mc_rejoin_groups() local
1622 for_each_pmc_rtnl(in_dev, im) { in ip_mc_rejoin_groups()
1623 if (im->multiaddr == IGMP_ALL_HOSTS) in ip_mc_rejoin_groups()
1625 if (ipv4_is_local_multicast(im->multiaddr) && in ip_mc_rejoin_groups()
1638 igmp_send_report(in_dev, im, type); in ip_mc_rejoin_groups()
2685 struct ip_mc_list *im; in ip_check_mc_rcu() local
2694 for (im = rcu_dereference(mc_hash[hash]); in ip_check_mc_rcu()
2695 im != NULL; in ip_check_mc_rcu()
2696 im = rcu_dereference(im->next_hash)) { in ip_check_mc_rcu()
2697 if (im->multiaddr == mc_addr) in ip_check_mc_rcu()
2701 for_each_pmc_rcu(in_dev, im) { in ip_check_mc_rcu()
2702 if (im->multiaddr == mc_addr) in ip_check_mc_rcu()
2706 if (im && proto == IPPROTO_IGMP) { in ip_check_mc_rcu()
2708 } else if (im) { in ip_check_mc_rcu()
2710 for (psf = im->sources; psf; psf = psf->sf_next) { in ip_check_mc_rcu()
2717 im->sfcount[MCAST_EXCLUDE]; in ip_check_mc_rcu()
2719 rv = im->sfcount[MCAST_EXCLUDE] != 0; in ip_check_mc_rcu()
2738 struct ip_mc_list *im = NULL; in igmp_mc_get_first() local
2748 im = rcu_dereference(in_dev->mc_list); in igmp_mc_get_first()
2749 if (im) { in igmp_mc_get_first()
2754 return im; in igmp_mc_get_first()
2757 static struct ip_mc_list *igmp_mc_get_next(struct seq_file *seq, struct ip_mc_list *im) in igmp_mc_get_next() argument
2761 im = rcu_dereference(im->next_rcu); in igmp_mc_get_next()
2762 while (!im) { in igmp_mc_get_next()
2771 im = rcu_dereference(state->in_dev->mc_list); in igmp_mc_get_next()
2773 return im; in igmp_mc_get_next()
2778 struct ip_mc_list *im = igmp_mc_get_first(seq); in igmp_mc_get_idx() local
2779 if (im) in igmp_mc_get_idx()
2780 while (pos && (im = igmp_mc_get_next(seq, im)) != NULL) in igmp_mc_get_idx()
2782 return pos ? NULL : im; in igmp_mc_get_idx()
2794 struct ip_mc_list *im; in igmp_mc_seq_next() local
2796 im = igmp_mc_get_first(seq); in igmp_mc_seq_next()
2798 im = igmp_mc_get_next(seq, v); in igmp_mc_seq_next()
2800 return im; in igmp_mc_seq_next()
2819 struct ip_mc_list *im = (struct ip_mc_list *)v; in igmp_mc_seq_show() local
2832 if (rcu_access_pointer(state->in_dev->mc_list) == im) { in igmp_mc_seq_show()
2837 delta = im->timer.expires - jiffies; in igmp_mc_seq_show()
2840 im->multiaddr, im->users, in igmp_mc_seq_show()
2841 im->tm_running, in igmp_mc_seq_show()
2842 im->tm_running ? jiffies_delta_to_clock_t(delta) : 0, in igmp_mc_seq_show()
2843 im->reporter); in igmp_mc_seq_show()
2859 struct ip_mc_list *im; member
2868 struct ip_mc_list *im = NULL; in igmp_mcf_get_first() local
2872 state->im = NULL; in igmp_mcf_get_first()
2878 im = rcu_dereference(idev->mc_list); in igmp_mcf_get_first()
2879 if (likely(im)) { in igmp_mcf_get_first()
2880 spin_lock_bh(&im->lock); in igmp_mcf_get_first()
2881 psf = im->sources; in igmp_mcf_get_first()
2883 state->im = im; in igmp_mcf_get_first()
2887 spin_unlock_bh(&im->lock); in igmp_mcf_get_first()
2899 spin_unlock_bh(&state->im->lock); in igmp_mcf_get_next()
2900 state->im = state->im->next; in igmp_mcf_get_next()
2901 while (!state->im) { in igmp_mcf_get_next()
2910 state->im = rcu_dereference(state->idev->mc_list); in igmp_mcf_get_next()
2912 if (!state->im) in igmp_mcf_get_next()
2914 spin_lock_bh(&state->im->lock); in igmp_mcf_get_next()
2915 psf = state->im->sources; in igmp_mcf_get_next()
2952 if (likely(state->im)) { in igmp_mcf_seq_stop()
2953 spin_unlock_bh(&state->im->lock); in igmp_mcf_seq_stop()
2954 state->im = NULL; in igmp_mcf_seq_stop()
2973 ntohl(state->im->multiaddr), in igmp_mcf_seq_show()