Lines Matching refs:pmc

79 static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *pmc);
80 static void mld_del_delrec(struct inet6_dev *idev, struct ifmcaddr6 *pmc);
83 static int sf_setstate(struct ifmcaddr6 *pmc);
84 static void sf_markstate(struct ifmcaddr6 *pmc);
85 static void ip6_mc_clear_src(struct ifmcaddr6 *pmc);
116 #define for_each_pmc_rcu(np, pmc) \
117 for (pmc = rcu_dereference(np->ipv6_mc_list); \
118 pmc != NULL; \
119 pmc = rcu_dereference(pmc->next))
332 struct ipv6_mc_socklist *pmc;
357 for_each_pmc_rcu(inet6, pmc) {
358 if (pgsr->gsr_interface && pmc->ifindex != pgsr->gsr_interface)
360 if (ipv6_addr_equal(&pmc->addr, group))
363 if (!pmc) { /* must have a prior join */
368 if (pmc->sflist) {
369 if (pmc->sfmode != omode) {
373 } else if (pmc->sfmode != omode) {
376 ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0);
377 pmc->sfmode = omode;
380 write_lock(&pmc->sflock);
383 psl = pmc->sflist;
435 pmc->sflist = psl = newpsl;
452 write_unlock(&pmc->sflock);
464 struct ipv6_mc_socklist *pmc;
495 for_each_pmc_rcu(inet6, pmc) {
496 if (pmc->ifindex != gsf->gf_interface)
498 if (ipv6_addr_equal(&pmc->addr, group))
501 if (!pmc) { /* must have a prior join */
530 write_lock(&pmc->sflock);
531 psl = pmc->sflist;
533 (void) ip6_mc_del_src(idev, group, pmc->sfmode,
537 (void) ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0);
538 pmc->sflist = newpsl;
539 pmc->sfmode = gsf->gf_fmode;
540 write_unlock(&pmc->sflock);
555 struct ipv6_mc_socklist *pmc;
580 for_each_pmc_rcu(inet6, pmc) {
581 if (pmc->ifindex != gsf->gf_interface)
583 if (ipv6_addr_equal(group, &pmc->addr))
586 if (!pmc) /* must have a prior join */
588 gsf->gf_fmode = pmc->sfmode;
589 psl = pmc->sflist;
597 * on pmc->sflock. We have the socket lock so reading here is safe.
726 struct ifmcaddr6 *pmc;
734 pmc = kzalloc(sizeof(*pmc), GFP_ATOMIC);
735 if (!pmc)
739 spin_lock_init(&pmc->mca_lock);
740 pmc->idev = im->idev;
742 pmc->mca_addr = im->mca_addr;
743 pmc->mca_crcount = idev->mc_qrv;
744 pmc->mca_sfmode = im->mca_sfmode;
745 if (pmc->mca_sfmode == MCAST_INCLUDE) {
748 pmc->mca_tomb = im->mca_tomb;
749 pmc->mca_sources = im->mca_sources;
751 for (psf = pmc->mca_sources; psf; psf = psf->sf_next)
752 psf->sf_crcount = pmc->mca_crcount;
757 pmc->next = idev->mc_tomb;
758 idev->mc_tomb = pmc;
764 struct ifmcaddr6 *pmc, *pmc_prev;
770 for (pmc = idev->mc_tomb; pmc; pmc = pmc->next) {
771 if (ipv6_addr_equal(&pmc->mca_addr, pmca))
773 pmc_prev = pmc;
775 if (pmc) {
777 pmc_prev->next = pmc->next;
779 idev->mc_tomb = pmc->next;
784 if (pmc) {
785 im->idev = pmc->idev;
787 swap(im->mca_tomb, pmc->mca_tomb);
788 swap(im->mca_sources, pmc->mca_sources);
794 in6_dev_put(pmc->idev);
795 ip6_mc_clear_src(pmc);
796 kfree(pmc);
803 struct ifmcaddr6 *pmc, *nextpmc;
806 pmc = idev->mc_tomb;
810 for (; pmc; pmc = nextpmc) {
811 nextpmc = pmc->next;
812 ip6_mc_clear_src(pmc);
813 in6_dev_put(pmc->idev);
814 kfree(pmc);
819 for (pmc = idev->mc_list; pmc; pmc = pmc->next) {
822 spin_lock_bh(&pmc->mca_lock);
823 psf = pmc->mca_tomb;
824 pmc->mca_tomb = NULL;
825 spin_unlock_bh(&pmc->mca_lock);
1103 static bool mld_xmarksources(struct ifmcaddr6 *pmc, int nsrcs,
1110 for (psf = pmc->mca_sources; psf; psf = psf->sf_next) {
1116 pmc->mca_sfcount[MCAST_EXCLUDE] !=
1125 pmc->mca_flags &= ~MAF_GSQUERY;
1131 static bool mld_marksources(struct ifmcaddr6 *pmc, int nsrcs,
1137 if (pmc->mca_sfmode == MCAST_EXCLUDE)
1138 return mld_xmarksources(pmc, nsrcs, srcs);
1143 for (psf = pmc->mca_sources; psf; psf = psf->sf_next) {
1155 pmc->mca_flags &= ~MAF_GSQUERY;
1158 pmc->mca_flags |= MAF_GSQUERY;
1503 static bool is_in(struct ifmcaddr6 *pmc, struct ip6_sf_list *psf, int type,
1511 if (!((pmc->mca_flags & MAF_GSQUERY) && !psf->sf_gsresp)) {
1512 if (pmc->mca_sfmode == MCAST_INCLUDE)
1519 return pmc->mca_sfcount[MCAST_EXCLUDE] ==
1530 if (pmc->mca_sfcount[MCAST_EXCLUDE] == 0 ||
1533 return pmc->mca_sfcount[MCAST_EXCLUDE] ==
1538 return (pmc->mca_sfmode == MCAST_INCLUDE) ^ sdeleted;
1540 if (pmc->mca_sfmode == MCAST_INCLUDE)
1548 mld_scount(struct ifmcaddr6 *pmc, int type, int gdeleted, int sdeleted)
1553 for (psf = pmc->mca_sources; psf; psf = psf->sf_next) {
1554 if (!is_in(pmc, psf, type, gdeleted, sdeleted))
1695 static int grec_size(struct ifmcaddr6 *pmc, int type, int gdel, int sdel)
1697 return sizeof(struct mld2_grec) + 16 * mld_scount(pmc,type,gdel,sdel);
1700 static struct sk_buff *add_grhead(struct sk_buff *skb, struct ifmcaddr6 *pmc,
1707 skb = mld_newpack(pmc->idev, mtu);
1715 pgr->grec_mca = pmc->mca_addr; /* structure copy */
1724 static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
1727 struct inet6_dev *idev = pmc->idev;
1735 if (pmc->mca_flags & MAF_NOREPORT)
1749 psf_list = sdeleted ? &pmc->mca_tomb : &pmc->mca_sources;
1759 AVAILABLE(skb) < grec_size(pmc, type, gdeleted, sdeleted)) {
1772 if (!is_in(pmc, psf, type, gdeleted, sdeleted) && !crsend) {
1780 if (((gdeleted && pmc->mca_sfmode == MCAST_EXCLUDE) ||
1781 (!gdeleted && pmc->mca_crcount)) &&
1803 skb = add_grhead(skb, pmc, type, &pgr, mtu);
1832 if (pmc->mca_crcount || isquery || crsend) {
1838 skb = add_grhead(skb, pmc, type, &pgr, mtu);
1845 pmc->mca_flags &= ~MAF_GSQUERY; /* clear query state */
1849 static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc)
1855 if (!pmc) {
1856 for (pmc = idev->mc_list; pmc; pmc = pmc->next) {
1857 if (pmc->mca_flags & MAF_NOREPORT)
1859 spin_lock_bh(&pmc->mca_lock);
1860 if (pmc->mca_sfcount[MCAST_EXCLUDE])
1864 skb = add_grec(skb, pmc, type, 0, 0, 0);
1865 spin_unlock_bh(&pmc->mca_lock);
1868 spin_lock_bh(&pmc->mca_lock);
1869 if (pmc->mca_sfcount[MCAST_EXCLUDE])
1873 skb = add_grec(skb, pmc, type, 0, 0, 0);
1874 spin_unlock_bh(&pmc->mca_lock);
1904 struct ifmcaddr6 *pmc, *pmc_prev, *pmc_next;
1913 for (pmc = idev->mc_tomb; pmc; pmc = pmc_next) {
1914 pmc_next = pmc->next;
1915 if (pmc->mca_sfmode == MCAST_INCLUDE) {
1918 skb = add_grec(skb, pmc, type, 1, 0, 0);
1919 skb = add_grec(skb, pmc, dtype, 1, 1, 0);
1921 if (pmc->mca_crcount) {
1922 if (pmc->mca_sfmode == MCAST_EXCLUDE) {
1924 skb = add_grec(skb, pmc, type, 1, 0, 0);
1926 pmc->mca_crcount--;
1927 if (pmc->mca_crcount == 0) {
1928 mld_clear_zeros(&pmc->mca_tomb);
1929 mld_clear_zeros(&pmc->mca_sources);
1932 if (pmc->mca_crcount == 0 && !pmc->mca_tomb &&
1933 !pmc->mca_sources) {
1938 in6_dev_put(pmc->idev);
1939 kfree(pmc);
1941 pmc_prev = pmc;
1946 for (pmc = idev->mc_list; pmc; pmc = pmc->next) {
1947 spin_lock_bh(&pmc->mca_lock);
1948 if (pmc->mca_sfcount[MCAST_EXCLUDE]) {
1955 skb = add_grec(skb, pmc, type, 0, 0, 0);
1956 skb = add_grec(skb, pmc, dtype, 0, 1, 0); /* deleted sources */
1959 if (pmc->mca_crcount) {
1960 if (pmc->mca_sfmode == MCAST_EXCLUDE)
1964 skb = add_grec(skb, pmc, type, 0, 0, 0);
1965 pmc->mca_crcount--;
1967 spin_unlock_bh(&pmc->mca_lock);
2074 struct ifmcaddr6 *pmc;
2082 for (pmc = idev->mc_list; pmc; pmc = pmc->next) {
2083 spin_lock_bh(&pmc->mca_lock);
2084 if (pmc->mca_sfcount[MCAST_EXCLUDE])
2088 skb = add_grec(skb, pmc, type, 0, 0, 1);
2089 spin_unlock_bh(&pmc->mca_lock);
2122 static int ip6_mc_del1_src(struct ifmcaddr6 *pmc, int sfmode,
2129 for (psf = pmc->mca_sources; psf; psf = psf->sf_next) {
2140 struct inet6_dev *idev = pmc->idev;
2146 pmc->mca_sources = psf->sf_next;
2147 if (psf->sf_oldin && !(pmc->mca_flags & MAF_NOREPORT) &&
2150 psf->sf_next = pmc->mca_tomb;
2151 pmc->mca_tomb = psf;
2163 struct ifmcaddr6 *pmc;
2170 for (pmc = idev->mc_list; pmc; pmc = pmc->next) {
2171 if (ipv6_addr_equal(pmca, &pmc->mca_addr))
2174 if (!pmc) {
2179 spin_lock_bh(&pmc->mca_lock);
2180 sf_markstate(pmc);
2182 if (!pmc->mca_sfcount[sfmode]) {
2183 spin_unlock_bh(&pmc->mca_lock);
2187 pmc->mca_sfcount[sfmode]--;
2191 int rv = ip6_mc_del1_src(pmc, sfmode, &psfsrc[i]);
2197 if (pmc->mca_sfmode == MCAST_EXCLUDE &&
2198 pmc->mca_sfcount[MCAST_EXCLUDE] == 0 &&
2199 pmc->mca_sfcount[MCAST_INCLUDE]) {
2203 pmc->mca_sfmode = MCAST_INCLUDE;
2204 pmc->mca_crcount = idev->mc_qrv;
2205 idev->mc_ifc_count = pmc->mca_crcount;
2206 for (psf = pmc->mca_sources; psf; psf = psf->sf_next)
2208 mld_ifc_event(pmc->idev);
2209 } else if (sf_setstate(pmc) || changerec)
2210 mld_ifc_event(pmc->idev);
2211 spin_unlock_bh(&pmc->mca_lock);
2219 static int ip6_mc_add1_src(struct ifmcaddr6 *pmc, int sfmode,
2225 for (psf = pmc->mca_sources; psf; psf = psf->sf_next) {
2239 pmc->mca_sources = psf;
2245 static void sf_markstate(struct ifmcaddr6 *pmc)
2248 int mca_xcount = pmc->mca_sfcount[MCAST_EXCLUDE];
2250 for (psf = pmc->mca_sources; psf; psf = psf->sf_next)
2251 if (pmc->mca_sfcount[MCAST_EXCLUDE]) {
2259 static int sf_setstate(struct ifmcaddr6 *pmc)
2262 int mca_xcount = pmc->mca_sfcount[MCAST_EXCLUDE];
2263 int qrv = pmc->idev->mc_qrv;
2267 for (psf = pmc->mca_sources; psf; psf = psf->sf_next) {
2268 if (pmc->mca_sfcount[MCAST_EXCLUDE]) {
2277 for (dpsf = pmc->mca_tomb; dpsf;
2288 pmc->mca_tomb = dpsf->sf_next;
2300 for (dpsf = pmc->mca_tomb; dpsf; dpsf = dpsf->sf_next)
2309 /* pmc->mca_lock held by callers */
2310 dpsf->sf_next = pmc->mca_tomb;
2311 pmc->mca_tomb = dpsf;
2327 struct ifmcaddr6 *pmc;
2334 for (pmc = idev->mc_list; pmc; pmc = pmc->next) {
2335 if (ipv6_addr_equal(pmca, &pmc->mca_addr))
2338 if (!pmc) {
2343 spin_lock_bh(&pmc->mca_lock);
2345 sf_markstate(pmc);
2346 isexclude = pmc->mca_sfmode == MCAST_EXCLUDE;
2348 pmc->mca_sfcount[sfmode]++;
2351 err = ip6_mc_add1_src(pmc, sfmode, &psfsrc[i]);
2359 pmc->mca_sfcount[sfmode]--;
2361 ip6_mc_del1_src(pmc, sfmode, &psfsrc[j]);
2362 } else if (isexclude != (pmc->mca_sfcount[MCAST_EXCLUDE] != 0)) {
2366 if (pmc->mca_sfcount[MCAST_EXCLUDE])
2367 pmc->mca_sfmode = MCAST_EXCLUDE;
2368 else if (pmc->mca_sfcount[MCAST_INCLUDE])
2369 pmc->mca_sfmode = MCAST_INCLUDE;
2372 pmc->mca_crcount = idev->mc_qrv;
2373 idev->mc_ifc_count = pmc->mca_crcount;
2374 for (psf = pmc->mca_sources; psf; psf = psf->sf_next)
2377 } else if (sf_setstate(pmc))
2379 spin_unlock_bh(&pmc->mca_lock);
2384 static void ip6_mc_clear_src(struct ifmcaddr6 *pmc)
2388 for (psf = pmc->mca_tomb; psf; psf = nextpsf) {
2392 pmc->mca_tomb = NULL;
2393 for (psf = pmc->mca_sources; psf; psf = nextpsf) {
2397 pmc->mca_sources = NULL;
2398 pmc->mca_sfmode = MCAST_EXCLUDE;
2399 pmc->mca_sfcount[MCAST_INCLUDE] = 0;
2400 pmc->mca_sfcount[MCAST_EXCLUDE] = 1;
2624 struct ifmcaddr6 *pmc;
2630 for (pmc = idev->mc_list; pmc; pmc = pmc->next)
2631 igmp6_join_group(pmc);