Lines Matching refs:imf

111 static int	im6f_get_source(struct in6_mfilter *imf,
281 im6f_init(struct in6_mfilter *imf, const int st0, const int st1)
283 memset(imf, 0, sizeof(struct in6_mfilter));
284 RB_INIT(&imf->im6f_sources);
285 imf->im6f_st[0] = st0;
286 imf->im6f_st[1] = st1;
396 struct in6_mfilter *imf;
408 imf = &imo->im6o_mfilters[gidx];
413 ims = RB_FIND(ip6_msource_tree, &imf->im6f_sources, &find);
683 * imf is the filter set being modified.
689 im6f_get_source(struct in6_mfilter *imf, const struct sockaddr_in6 *psin,
702 ims = RB_FIND(ip6_msource_tree, &imf->im6f_sources, &find);
705 if (imf->im6f_nsrc == in6_mcast_maxsocksrc)
712 RB_INSERT(ip6_msource_tree, &imf->im6f_sources,
714 ++imf->im6f_nsrc;
733 im6f_graft(struct in6_mfilter *imf, const uint8_t st1,
744 RB_INSERT(ip6_msource_tree, &imf->im6f_sources,
746 ++imf->im6f_nsrc;
762 im6f_prune(struct in6_mfilter *imf, const struct sockaddr_in6 *psin)
769 ims = RB_FIND(ip6_msource_tree, &imf->im6f_sources, &find);
783 im6f_rollback(struct in6_mfilter *imf)
788 RB_FOREACH_SAFE(ims, ip6_msource_tree, &imf->im6f_sources, tims) {
799 RB_REMOVE(ip6_msource_tree, &imf->im6f_sources, ims);
801 imf->im6f_nsrc--;
804 imf->im6f_st[1] = imf->im6f_st[0];
813 im6f_leave(struct in6_mfilter *imf)
818 RB_FOREACH(ims, ip6_msource_tree, &imf->im6f_sources) {
822 imf->im6f_st[1] = MCAST_INCLUDE;
831 im6f_commit(struct in6_mfilter *imf)
836 RB_FOREACH(ims, ip6_msource_tree, &imf->im6f_sources) {
840 imf->im6f_st[0] = imf->im6f_st[1];
849 im6f_reap(struct in6_mfilter *imf)
854 RB_FOREACH_SAFE(ims, ip6_msource_tree, &imf->im6f_sources, tims) {
859 RB_REMOVE(ip6_msource_tree, &imf->im6f_sources, ims);
861 imf->im6f_nsrc--;
872 im6f_purge(struct in6_mfilter *imf)
877 RB_FOREACH_SAFE(ims, ip6_msource_tree, &imf->im6f_sources, tims) {
880 RB_REMOVE(ip6_msource_tree, &imf->im6f_sources, ims);
882 imf->im6f_nsrc--;
884 imf->im6f_st[0] = imf->im6f_st[1] = MCAST_UNDEFINED;
885 VERIFY(RB_EMPTY(&imf->im6f_sources));
985 * imf is the per-inpcb-membership group filter pointer.
986 * A fake imf may be passed for in-kernel consumers.
996 in6m_merge(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf)
1016 RB_FOREACH(ims, ip6_msource_tree, &imf->im6f_sources) {
1018 if (lims->im6sl_st[0] == imf->im6f_st[0]) nsrc0++;
1019 if (lims->im6sl_st[1] == imf->im6f_st[1]) nsrc1++;
1042 MLD_PRINTF(("%s: imf filters in-mode: %d at t0, %d at t1\n",
1046 if (imf->im6f_st[0] == imf->im6f_st[1] &&
1047 imf->im6f_st[1] == MCAST_INCLUDE) {
1055 if (imf->im6f_st[0] != imf->im6f_st[1]) {
1056 MLD_PRINTF(("%s: imf transition %d to %d\n",
1057 __func__, imf->im6f_st[0], imf->im6f_st[1]));
1059 if (imf->im6f_st[0] == MCAST_EXCLUDE) {
1062 } else if (imf->im6f_st[0] == MCAST_INCLUDE) {
1067 if (imf->im6f_st[1] == MCAST_EXCLUDE) {
1070 } else if (imf->im6f_st[1] == MCAST_INCLUDE && nsrc1 > 0) {
1096 if (imf->im6f_st[0] == MCAST_EXCLUDE && nsrc0 == 0) {
1097 if ((imf->im6f_st[1] != MCAST_EXCLUDE) ||
1098 (imf->im6f_st[1] == MCAST_EXCLUDE && nsrc1 > 0)) {
1105 if (imf->im6f_st[1] == MCAST_EXCLUDE && nsrc1 == 0) {
1110 MLD_PRINTF(("%s: merged imf %p to inm %p\n", __func__, imf, inm));
1234 * NOTE: imf argument cannot be const due to sys/tree.h limitations.
1241 /*const*/ struct in6_mfilter *imf, struct in6_multi **pinm,
1264 * If no imf was specified (i.e. kernel consumer),
1267 if (imf == NULL) {
1269 imf = &timf;
1281 error = in6m_merge(inm, imf);
1313 * Holding the write lock for the INP which contains imf
1314 * is highly advisable. We can't assert for it as imf does not
1321 in6_mc_leave(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf)
1333 MLD_PRINTF(("%s: leave inm %p, %s/%s%d, imf %p\n", __func__,
1336 inm->in6m_ifp->if_unit, imf));
1339 * If no imf was specified (i.e. kernel consumer),
1342 if (imf == NULL) {
1344 imf = &timf;
1356 error = in6m_merge(inm, imf);
1392 struct in6_mfilter *imf;
1469 imf = &imo->im6o_mfilters[idx];
1476 fmode = imf->im6f_st[0];
1502 ims = im6f_graft(imf, fmode, &ssa->sin6);
1507 error = im6f_prune(imf, &ssa->sin6);
1511 MLD_PRINTF(("%s: merge imf state failed\n", __func__));
1520 error = in6m_merge(inm, imf);
1537 im6f_rollback(imf);
1539 im6f_commit(imf);
1541 im6f_reap(imf);
1616 struct in6_mfilter *imf;
1684 imf = &imo->im6o_mfilters[idx];
1689 if (imf->im6f_st[1] == MCAST_UNDEFINED) {
1693 msfr.msfr_fmode = imf->im6f_st[1];
1726 RB_FOREACH(ims, ip6_msource_tree, &imf->im6f_sources) {
1729 lims->im6sl_st[0] != imf->im6f_st[0])
1937 struct in6_mfilter *imf;
1946 imf = NULL;
2104 imf = &imo->im6o_mfilters[idx];
2111 if (imf->im6f_st[1] != MCAST_INCLUDE) {
2119 * even if entries exist for *ssa in this imf,
2148 * XXX We don't reject this for imf in UNDEFINED
2154 if (imf->im6f_st[1] == MCAST_EXCLUDE)
2179 imf = &imo->im6o_mfilters[idx];
2180 VERIFY(RB_EMPTY(&imf->im6f_sources));
2198 im6f_init(imf, MCAST_UNDEFINED, MCAST_INCLUDE));
2202 lims = im6f_graft(imf, MCAST_INCLUDE, &ssa->sin6);
2204 MLD_PRINTF(("%s: merge imf state failed\n",
2213 im6f_init(imf, MCAST_UNDEFINED, MCAST_EXCLUDE);
2223 error = in6_mc_join(ifp, &gsa->sin6.sin6_addr, imf, &inm, 0);
2231 error = in6m_merge(inm, imf);
2250 im6f_rollback(imf);
2252 im6f_purge(imf);
2254 im6f_reap(imf);
2256 im6f_commit(imf);
2282 struct in6_mfilter *imf;
2459 imf = &imo->im6o_mfilters[idx];
2473 im6f_leave(imf);
2475 if (imf->im6f_st[0] == MCAST_EXCLUDE) {
2488 error = im6f_prune(imf, &ssa->sin6);
2490 MLD_PRINTF(("%s: merge imf state failed\n",
2506 (void) in6_mc_leave(inm, imf);
2510 error = in6m_merge(inm, imf);
2528 im6f_rollback(imf);
2530 im6f_commit(imf);
2532 im6f_reap(imf);
2609 struct in6_mfilter *imf;
2682 imf = &imo->im6o_mfilters[idx];
2688 imf->im6f_st[1] = msfr.msfr_fmode;
2728 im6f_leave(imf);
2729 imf->im6f_st[1] = msfr.msfr_fmode;
2762 error = im6f_get_source(imf, psin, &lims);
2765 lims->im6sl_st[1] = imf->im6f_st[1];
2778 error = in6m_merge(inm, imf);
2795 im6f_rollback(imf);
2797 im6f_commit(imf);
2799 im6f_reap(imf);