Lines Matching refs:pmc

160 static int sf_setstate(struct ip_mc_list *pmc);
161 static void sf_markstate(struct ip_mc_list *pmc);
163 static void ip_mc_clear_src(struct ip_mc_list *pmc);
175 #define for_each_pmc_rcu(in_dev, pmc) \
176 for (pmc = rcu_dereference(in_dev->mc_list); \
177 pmc != NULL; \
178 pmc = rcu_dereference(pmc->next_rcu))
180 #define for_each_pmc_rtnl(in_dev, pmc) \
181 for (pmc = rtnl_dereference(in_dev->mc_list); \
182 pmc != NULL; \
183 pmc = rtnl_dereference(pmc->next_rcu))
272 static int is_in(struct ip_mc_list *pmc, struct ip_sf_list *psf, int type,
280 if (!(pmc->gsquery && !psf->sf_gsresp)) {
281 if (pmc->sfmode == MCAST_INCLUDE)
288 return pmc->sfcount[MCAST_EXCLUDE] ==
299 if (pmc->sfcount[MCAST_EXCLUDE] == 0 ||
302 return pmc->sfcount[MCAST_EXCLUDE] ==
307 return (pmc->sfmode == MCAST_INCLUDE) ^ sdeleted;
309 if (pmc->sfmode == MCAST_INCLUDE)
317 igmp_scount(struct ip_mc_list *pmc, int type, int gdeleted, int sdeleted)
322 for (psf = pmc->sources; psf; psf = psf->sf_next) {
323 if (!is_in(pmc, psf, type, gdeleted, sdeleted))
430 static int grec_size(struct ip_mc_list *pmc, int type, int gdel, int sdel)
432 return sizeof(struct igmpv3_grec) + 4*igmp_scount(pmc, type, gdel, sdel);
435 static struct sk_buff *add_grhead(struct sk_buff *skb, struct ip_mc_list *pmc,
438 struct net_device *dev = pmc->interface->dev;
451 pgr->grec_mca = pmc->multiaddr;
460 static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,
463 struct net_device *dev = pmc->interface->dev;
471 if (pmc->multiaddr == IGMP_ALL_HOSTS)
473 if (ipv4_is_local_multicast(pmc->multiaddr) &&
488 psf_list = sdeleted ? &pmc->tomb : &pmc->sources;
498 AVAILABLE(skb) < grec_size(pmc, type, gdeleted, sdeleted)) {
511 if (!is_in(pmc, psf, type, gdeleted, sdeleted)) {
519 if (((gdeleted && pmc->sfmode == MCAST_EXCLUDE) ||
520 (!gdeleted && pmc->crcount)) &&
542 skb = add_grhead(skb, pmc, type, &pgr, mtu);
571 if (pmc->crcount || isquery) {
577 skb = add_grhead(skb, pmc, type, &pgr, mtu);
584 pmc->gsquery = 0; /* clear query state on report */
588 static int igmpv3_send_report(struct in_device *in_dev, struct ip_mc_list *pmc)
594 if (!pmc) {
596 for_each_pmc_rcu(in_dev, pmc) {
597 if (pmc->multiaddr == IGMP_ALL_HOSTS)
599 if (ipv4_is_local_multicast(pmc->multiaddr) &&
602 spin_lock_bh(&pmc->lock);
603 if (pmc->sfcount[MCAST_EXCLUDE])
607 skb = add_grec(skb, pmc, type, 0, 0);
608 spin_unlock_bh(&pmc->lock);
612 spin_lock_bh(&pmc->lock);
613 if (pmc->sfcount[MCAST_EXCLUDE])
617 skb = add_grec(skb, pmc, type, 0, 0);
618 spin_unlock_bh(&pmc->lock);
646 static void kfree_pmc(struct ip_mc_list *pmc)
648 ip_sf_list_clear_all(pmc->sources);
649 ip_sf_list_clear_all(pmc->tomb);
650 kfree(pmc);
655 struct ip_mc_list *pmc, *pmc_prev, *pmc_next;
664 for (pmc = in_dev->mc_tomb; pmc; pmc = pmc_next) {
665 pmc_next = pmc->next;
666 if (pmc->sfmode == MCAST_INCLUDE) {
669 skb = add_grec(skb, pmc, type, 1, 0);
670 skb = add_grec(skb, pmc, dtype, 1, 1);
672 if (pmc->crcount) {
673 if (pmc->sfmode == MCAST_EXCLUDE) {
675 skb = add_grec(skb, pmc, type, 1, 0);
677 pmc->crcount--;
678 if (pmc->crcount == 0) {
679 igmpv3_clear_zeros(&pmc->tomb);
680 igmpv3_clear_zeros(&pmc->sources);
683 if (pmc->crcount == 0 && !pmc->tomb && !pmc->sources) {
688 in_dev_put(pmc->interface);
689 kfree_pmc(pmc);
691 pmc_prev = pmc;
696 for_each_pmc_rcu(in_dev, pmc) {
697 spin_lock_bh(&pmc->lock);
698 if (pmc->sfcount[MCAST_EXCLUDE]) {
705 skb = add_grec(skb, pmc, type, 0, 0);
706 skb = add_grec(skb, pmc, dtype, 0, 1); /* deleted sources */
709 if (pmc->crcount) {
710 if (pmc->sfmode == MCAST_EXCLUDE)
714 skb = add_grec(skb, pmc, type, 0, 0);
715 pmc->crcount--;
717 spin_unlock_bh(&pmc->lock);
726 static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
735 __be32 group = pmc ? pmc->multiaddr : 0;
741 return igmpv3_send_report(in_dev, pmc);
863 static int igmp_xmarksources(struct ip_mc_list *pmc, int nsrcs, __be32 *srcs)
869 for (psf = pmc->sources; psf; psf = psf->sf_next) {
875 pmc->sfcount[MCAST_EXCLUDE] !=
884 pmc->gsquery = 0;
890 static int igmp_marksources(struct ip_mc_list *pmc, int nsrcs, __be32 *srcs)
895 if (pmc->sfmode == MCAST_EXCLUDE)
896 return igmp_xmarksources(pmc, nsrcs, srcs);
900 for (psf = pmc->sources; psf; psf = psf->sf_next) {
911 pmc->gsquery = 0;
914 pmc->gsquery = 1;
1178 struct ip_mc_list *pmc;
1187 pmc = kzalloc(sizeof(*pmc), gfp);
1188 if (!pmc)
1190 spin_lock_init(&pmc->lock);
1192 pmc->interface = im->interface;
1194 pmc->multiaddr = im->multiaddr;
1195 pmc->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv);
1196 pmc->sfmode = im->sfmode;
1197 if (pmc->sfmode == MCAST_INCLUDE) {
1200 pmc->tomb = im->tomb;
1201 pmc->sources = im->sources;
1203 for (psf = pmc->sources; psf; psf = psf->sf_next)
1204 psf->sf_crcount = pmc->crcount;
1209 pmc->next = in_dev->mc_tomb;
1210 in_dev->mc_tomb = pmc;
1219 struct ip_mc_list *pmc, *pmc_prev;
1226 for (pmc = in_dev->mc_tomb; pmc; pmc = pmc->next) {
1227 if (pmc->multiaddr == multiaddr)
1229 pmc_prev = pmc;
1231 if (pmc) {
1233 pmc_prev->next = pmc->next;
1235 in_dev->mc_tomb = pmc->next;
1240 if (pmc) {
1241 im->interface = pmc->interface;
1243 swap(im->tomb, pmc->tomb);
1244 swap(im->sources, pmc->sources);
1252 in_dev_put(pmc->interface);
1253 kfree_pmc(pmc);
1263 struct ip_mc_list *pmc, *nextpmc;
1266 pmc = in_dev->mc_tomb;
1270 for (; pmc; pmc = nextpmc) {
1271 nextpmc = pmc->next;
1272 ip_mc_clear_src(pmc);
1273 in_dev_put(pmc->interface);
1274 kfree_pmc(pmc);
1278 for_each_pmc_rcu(in_dev, pmc) {
1281 spin_lock_bh(&pmc->lock);
1282 psf = pmc->tomb;
1283 pmc->tomb = NULL;
1284 spin_unlock_bh(&pmc->lock);
1710 struct ip_mc_list *pmc;
1714 for_each_pmc_rtnl(in_dev, pmc)
1715 igmp_group_dropped(pmc);
1720 struct ip_mc_list *pmc;
1724 for_each_pmc_rtnl(in_dev, pmc) {
1726 igmpv3_del_delrec(in_dev, pmc);
1728 igmp_group_added(pmc);
1736 struct ip_mc_list *pmc;
1740 for_each_pmc_rtnl(in_dev, pmc)
1741 igmp_group_dropped(pmc);
1787 struct ip_mc_list *pmc;
1794 for_each_pmc_rtnl(in_dev, pmc) {
1796 igmpv3_del_delrec(in_dev, pmc);
1798 igmp_group_added(pmc);
1862 static int ip_mc_del1_src(struct ip_mc_list *pmc, int sfmode,
1869 for (psf = pmc->sources; psf; psf = psf->sf_next) {
1880 ip_rt_multicast_event(pmc->interface);
1884 struct in_device *in_dev = pmc->interface;
1892 pmc->sources = psf->sf_next;
1897 psf->sf_next = pmc->tomb;
1898 pmc->tomb = psf;
1914 struct ip_mc_list *pmc;
1921 for_each_pmc_rcu(in_dev, pmc) {
1922 if (*pmca == pmc->multiaddr)
1925 if (!pmc) {
1930 spin_lock_bh(&pmc->lock);
1933 sf_markstate(pmc);
1937 if (!pmc->sfcount[sfmode])
1939 pmc->sfcount[sfmode]--;
1943 int rv = ip_mc_del1_src(pmc, sfmode, &psfsrc[i]);
1949 if (pmc->sfmode == MCAST_EXCLUDE &&
1950 pmc->sfcount[MCAST_EXCLUDE] == 0 &&
1951 pmc->sfcount[MCAST_INCLUDE]) {
1958 pmc->sfmode = MCAST_INCLUDE;
1960 pmc->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv);
1961 WRITE_ONCE(in_dev->mr_ifc_count, pmc->crcount);
1962 for (psf = pmc->sources; psf; psf = psf->sf_next)
1964 igmp_ifc_event(pmc->interface);
1965 } else if (sf_setstate(pmc) || changerec) {
1966 igmp_ifc_event(pmc->interface);
1970 spin_unlock_bh(&pmc->lock);
1977 static int ip_mc_add1_src(struct ip_mc_list *pmc, int sfmode,
1983 for (psf = pmc->sources; psf; psf = psf->sf_next) {
1996 pmc->sources = psf;
2000 ip_rt_multicast_event(pmc->interface);
2006 static void sf_markstate(struct ip_mc_list *pmc)
2009 int mca_xcount = pmc->sfcount[MCAST_EXCLUDE];
2011 for (psf = pmc->sources; psf; psf = psf->sf_next)
2012 if (pmc->sfcount[MCAST_EXCLUDE]) {
2020 static int sf_setstate(struct ip_mc_list *pmc)
2023 int mca_xcount = pmc->sfcount[MCAST_EXCLUDE];
2024 int qrv = pmc->interface->mr_qrv;
2028 for (psf = pmc->sources; psf; psf = psf->sf_next) {
2029 if (pmc->sfcount[MCAST_EXCLUDE]) {
2038 for (dpsf = pmc->tomb; dpsf; dpsf = dpsf->sf_next) {
2047 pmc->tomb = dpsf->sf_next;
2060 for (dpsf = pmc->tomb; dpsf; dpsf = dpsf->sf_next)
2068 /* pmc->lock held by callers */
2069 dpsf->sf_next = pmc->tomb;
2070 pmc->tomb = dpsf;
2086 struct ip_mc_list *pmc;
2093 for_each_pmc_rcu(in_dev, pmc) {
2094 if (*pmca == pmc->multiaddr)
2097 if (!pmc) {
2102 spin_lock_bh(&pmc->lock);
2106 sf_markstate(pmc);
2108 isexclude = pmc->sfmode == MCAST_EXCLUDE;
2110 pmc->sfcount[sfmode]++;
2113 err = ip_mc_add1_src(pmc, sfmode, &psfsrc[i]);
2121 pmc->sfcount[sfmode]--;
2123 (void) ip_mc_del1_src(pmc, sfmode, &psfsrc[j]);
2124 } else if (isexclude != (pmc->sfcount[MCAST_EXCLUDE] != 0)) {
2127 struct net *net = dev_net(pmc->interface->dev);
2128 in_dev = pmc->interface;
2132 if (pmc->sfcount[MCAST_EXCLUDE])
2133 pmc->sfmode = MCAST_EXCLUDE;
2134 else if (pmc->sfcount[MCAST_INCLUDE])
2135 pmc->sfmode = MCAST_INCLUDE;
2139 pmc->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv);
2140 WRITE_ONCE(in_dev->mr_ifc_count, pmc->crcount);
2141 for (psf = pmc->sources; psf; psf = psf->sf_next)
2144 } else if (sf_setstate(pmc)) {
2148 spin_unlock_bh(&pmc->lock);
2152 static void ip_mc_clear_src(struct ip_mc_list *pmc)
2156 spin_lock_bh(&pmc->lock);
2157 tomb = pmc->tomb;
2158 pmc->tomb = NULL;
2159 sources = pmc->sources;
2160 pmc->sources = NULL;
2161 pmc->sfmode = MCAST_EXCLUDE;
2162 pmc->sfcount[MCAST_INCLUDE] = 0;
2163 pmc->sfcount[MCAST_EXCLUDE] = 1;
2164 spin_unlock_bh(&pmc->lock);
2312 struct ip_mc_socklist *pmc;
2336 for_each_pmc_rtnl(inet, pmc) {
2337 if ((pmc->multi.imr_multiaddr.s_addr ==
2339 (pmc->multi.imr_ifindex == imr.imr_ifindex))
2342 if (!pmc) { /* must have a prior join */
2347 if (pmc->sflist) {
2348 if (pmc->sfmode != omode) {
2352 } else if (pmc->sfmode != omode) {
2355 ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, pmc->sfmode, 0,
2357 pmc->sfmode = omode;
2360 psl = rtnl_dereference(pmc->sflist);
2415 rcu_assign_pointer(pmc->sflist, newpsl);
2448 struct ip_mc_socklist *pmc;
2479 for_each_pmc_rtnl(inet, pmc) {
2480 if (pmc->multi.imr_multiaddr.s_addr == msf->imsf_multiaddr &&
2481 pmc->multi.imr_ifindex == imr.imr_ifindex)
2484 if (!pmc) { /* must have a prior join */
2509 psl = rtnl_dereference(pmc->sflist);
2511 (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
2516 (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
2519 rcu_assign_pointer(pmc->sflist, newpsl);
2522 pmc->sfmode = msf->imsf_fmode;
2536 struct ip_mc_socklist *pmc;
2558 for_each_pmc_rtnl(inet, pmc) {
2559 if (pmc->multi.imr_multiaddr.s_addr == msf->imsf_multiaddr &&
2560 pmc->multi.imr_ifindex == imr.imr_ifindex)
2563 if (!pmc) /* must have a prior join */
2565 msf->imsf_fmode = pmc->sfmode;
2566 psl = rtnl_dereference(pmc->sflist);
2594 struct ip_mc_socklist *pmc;
2607 for_each_pmc_rtnl(inet, pmc) {
2608 if (pmc->multi.imr_multiaddr.s_addr == addr &&
2609 pmc->multi.imr_ifindex == gsf->gf_interface)
2612 if (!pmc) /* must have a prior join */
2614 gsf->gf_fmode = pmc->sfmode;
2615 psl = rtnl_dereference(pmc->sflist);
2639 struct ip_mc_socklist *pmc;
2649 for_each_pmc_rcu(inet, pmc) {
2650 if (pmc->multi.imr_multiaddr.s_addr == loc_addr &&
2651 (pmc->multi.imr_ifindex == dif ||
2652 (sdif && pmc->multi.imr_ifindex == sdif)))
2656 if (!pmc)
2658 psl = rcu_dereference(pmc->sflist);
2659 ret = (pmc->sfmode == MCAST_EXCLUDE);
2668 if (pmc->sfmode == MCAST_INCLUDE && i >= psl->sl_count)
2670 if (pmc->sfmode == MCAST_EXCLUDE && i < psl->sl_count)