Lines Matching refs:im

156 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im,
158 static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im);
167 static void ip_ma_put(struct ip_mc_list *im)
169 if (refcount_dec_and_test(&im->refcnt)) {
170 in_dev_put(im->interface);
171 kfree_rcu(im, rcu);
202 static void igmp_stop_timer(struct ip_mc_list *im)
204 spin_lock_bh(&im->lock);
205 if (del_timer(&im->timer))
206 refcount_dec(&im->refcnt);
207 im->tm_running = 0;
208 im->reporter = 0;
209 im->unsolicit_count = 0;
210 spin_unlock_bh(&im->lock);
213 /* It must be called with locked im->lock */
214 static void igmp_start_timer(struct ip_mc_list *im, int max_delay)
218 im->tm_running = 1;
219 if (refcount_inc_not_zero(&im->refcnt)) {
220 if (mod_timer(&im->timer, jiffies + tv + 2))
221 ip_ma_put(im);
247 static void igmp_mod_timer(struct ip_mc_list *im, int max_delay)
249 spin_lock_bh(&im->lock);
250 im->unsolicit_count = 0;
251 if (del_timer(&im->timer)) {
252 if ((long)(im->timer.expires-jiffies) < max_delay) {
253 add_timer(&im->timer);
254 im->tm_running = 1;
255 spin_unlock_bh(&im->lock);
258 refcount_dec(&im->refcnt);
260 igmp_start_timer(im, max_delay);
261 spin_unlock_bh(&im->lock);
840 struct ip_mc_list *im = from_timer(im, t, timer);
841 struct in_device *in_dev = im->interface;
843 spin_lock(&im->lock);
844 im->tm_running = 0;
846 if (im->unsolicit_count && --im->unsolicit_count)
847 igmp_start_timer(im, unsolicited_report_interval(in_dev));
849 im->reporter = 1;
850 spin_unlock(&im->lock);
853 igmp_send_report(in_dev, im, IGMP_HOST_MEMBERSHIP_REPORT);
855 igmp_send_report(in_dev, im, IGMPV2_HOST_MEMBERSHIP_REPORT);
857 igmp_send_report(in_dev, im, IGMPV3_HOST_MEMBERSHIP_REPORT);
859 ip_ma_put(im);
921 struct ip_mc_list *im;
933 for_each_pmc_rcu(in_dev, im) {
934 if (im->multiaddr == group) {
935 igmp_stop_timer(im);
949 struct ip_mc_list *im;
1046 for_each_pmc_rcu(in_dev, im) {
1049 if (group && group != im->multiaddr)
1051 if (im->multiaddr == IGMP_ALL_HOSTS)
1053 if (ipv4_is_local_multicast(im->multiaddr) &&
1056 spin_lock_bh(&im->lock);
1057 if (im->tm_running)
1058 im->gsquery = im->gsquery && mark;
1060 im->gsquery = mark;
1061 changed = !im->gsquery ||
1062 igmp_marksources(im, ntohs(ih3->nsrcs), ih3->srcs);
1063 spin_unlock_bh(&im->lock);
1065 igmp_mod_timer(im, max_delay);
1175 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im,
1191 spin_lock_bh(&im->lock);
1192 pmc->interface = im->interface;
1194 pmc->multiaddr = im->multiaddr;
1196 pmc->sfmode = im->sfmode;
1200 pmc->tomb = im->tomb;
1201 pmc->sources = im->sources;
1202 im->tomb = im->sources = NULL;
1206 spin_unlock_bh(&im->lock);
1217 static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im)
1222 __be32 multiaddr = im->multiaddr;
1239 spin_lock_bh(&im->lock);
1241 im->interface = pmc->interface;
1242 if (im->sfmode == MCAST_INCLUDE) {
1243 swap(im->tomb, pmc->tomb);
1244 swap(im->sources, pmc->sources);
1245 for (psf = im->sources; psf; psf = psf->sf_next)
1249 im->crcount = in_dev->mr_qrv ?:
1255 spin_unlock_bh(&im->lock);
1291 static void __igmp_group_dropped(struct ip_mc_list *im, gfp_t gfp)
1293 struct in_device *in_dev = im->interface;
1299 if (im->loaded) {
1300 im->loaded = 0;
1301 ip_mc_filter_del(in_dev, im->multiaddr);
1305 if (im->multiaddr == IGMP_ALL_HOSTS)
1307 if (ipv4_is_local_multicast(im->multiaddr) &&
1311 reporter = im->reporter;
1312 igmp_stop_timer(im);
1319 igmp_send_report(in_dev, im, IGMP_HOST_LEAVE_MESSAGE);
1323 igmpv3_add_delrec(in_dev, im, gfp);
1330 static void igmp_group_dropped(struct ip_mc_list *im)
1332 __igmp_group_dropped(im, GFP_KERNEL);
1335 static void igmp_group_added(struct ip_mc_list *im)
1337 struct in_device *in_dev = im->interface;
1342 if (im->loaded == 0) {
1343 im->loaded = 1;
1344 ip_mc_filter_add(in_dev, im->multiaddr);
1348 if (im->multiaddr == IGMP_ALL_HOSTS)
1350 if (ipv4_is_local_multicast(im->multiaddr) &&
1357 im->unsolicit_count = READ_ONCE(net->ipv4.sysctl_igmp_qrv);
1359 spin_lock_bh(&im->lock);
1360 igmp_start_timer(im, IGMP_INITIAL_REPORT_DELAY);
1361 spin_unlock_bh(&im->lock);
1370 if (im->sfmode == MCAST_EXCLUDE)
1371 im->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv);
1382 static u32 ip_mc_hash(const struct ip_mc_list *im)
1384 return hash_32((__force u32)im->multiaddr, MC_HASH_SZ_LOG);
1388 struct ip_mc_list *im)
1395 hash = ip_mc_hash(im);
1396 im->next_hash = mc_hash[hash];
1397 rcu_assign_pointer(mc_hash[hash], im);
1410 for_each_pmc_rtnl(in_dev, im) {
1411 hash = ip_mc_hash(im);
1412 im->next_hash = mc_hash[hash];
1413 RCU_INIT_POINTER(mc_hash[hash], im);
1420 struct ip_mc_list *im)
1427 mc_hash += ip_mc_hash(im);
1428 while ((aux = rtnl_dereference(*mc_hash)) != im)
1430 *mc_hash = im->next_hash;
1440 struct ip_mc_list *im;
1444 for_each_pmc_rtnl(in_dev, im) {
1445 if (im->multiaddr == addr) {
1446 im->users++;
1452 im = kzalloc(sizeof(*im), gfp);
1453 if (!im)
1456 im->users = 1;
1457 im->interface = in_dev;
1459 im->multiaddr = addr;
1461 im->sfmode = mode;
1462 im->sfcount[mode] = 1;
1463 refcount_set(&im->refcnt, 1);
1464 spin_lock_init(&im->lock);
1466 timer_setup(&im->timer, igmp_timer_expire, 0);
1469 im->next_rcu = in_dev->mc_list;
1471 rcu_assign_pointer(in_dev->mc_list, im);
1473 ip_mc_hash_add(in_dev, im);
1476 igmpv3_del_delrec(in_dev, im);
1478 igmp_group_added(im);
1645 struct ip_mc_list *im;
1651 for_each_pmc_rtnl(in_dev, im) {
1652 if (im->multiaddr == IGMP_ALL_HOSTS)
1654 if (ipv4_is_local_multicast(im->multiaddr) &&
1667 igmp_send_report(in_dev, im, type);
2720 struct ip_mc_list *im;
2729 for (im = rcu_dereference(mc_hash[hash]);
2730 im != NULL;
2731 im = rcu_dereference(im->next_hash)) {
2732 if (im->multiaddr == mc_addr)
2736 for_each_pmc_rcu(in_dev, im) {
2737 if (im->multiaddr == mc_addr)
2741 if (im && proto == IPPROTO_IGMP) {
2743 } else if (im) {
2745 spin_lock_bh(&im->lock);
2746 for (psf = im->sources; psf; psf = psf->sf_next) {
2753 im->sfcount[MCAST_EXCLUDE];
2755 rv = im->sfcount[MCAST_EXCLUDE] != 0;
2756 spin_unlock_bh(&im->lock);
2775 struct ip_mc_list *im = NULL;
2785 im = rcu_dereference(in_dev->mc_list);
2786 if (im) {
2791 return im;
2794 static struct ip_mc_list *igmp_mc_get_next(struct seq_file *seq, struct ip_mc_list *im)
2798 im = rcu_dereference(im->next_rcu);
2799 while (!im) {
2808 im = rcu_dereference(state->in_dev->mc_list);
2810 return im;
2815 struct ip_mc_list *im = igmp_mc_get_first(seq);
2816 if (im)
2817 while (pos && (im = igmp_mc_get_next(seq, im)) != NULL)
2819 return pos ? NULL : im;
2831 struct ip_mc_list *im;
2833 im = igmp_mc_get_first(seq);
2835 im = igmp_mc_get_next(seq, v);
2837 return im;
2856 struct ip_mc_list *im = v;
2869 if (rcu_access_pointer(state->in_dev->mc_list) == im) {
2874 delta = im->timer.expires - jiffies;
2877 im->multiaddr, im->users,
2878 im->tm_running,
2879 im->tm_running ? jiffies_delta_to_clock_t(delta) : 0,
2880 im->reporter);
2896 struct ip_mc_list *im;
2905 struct ip_mc_list *im = NULL;
2909 state->im = NULL;
2915 im = rcu_dereference(idev->mc_list);
2916 if (likely(im)) {
2917 spin_lock_bh(&im->lock);
2918 psf = im->sources;
2920 state->im = im;
2924 spin_unlock_bh(&im->lock);
2936 spin_unlock_bh(&state->im->lock);
2937 state->im = state->im->next;
2938 while (!state->im) {
2947 state->im = rcu_dereference(state->idev->mc_list);
2949 if (!state->im)
2951 spin_lock_bh(&state->im->lock);
2952 psf = state->im->sources;
2989 if (likely(state->im)) {
2990 spin_unlock_bh(&state->im->lock);
2991 state->im = NULL;
3010 ntohl(state->im->multiaddr),