Lines Matching refs:imf

111 static int	im6f_get_source(struct in6_mfilter *imf,
278 im6f_init(struct in6_mfilter *imf, const int st0, const int st1)
280 memset(imf, 0, sizeof(struct in6_mfilter));
281 RB_INIT(&imf->im6f_sources);
282 imf->im6f_st[0] = st0;
283 imf->im6f_st[1] = st1;
393 struct in6_mfilter *imf;
405 imf = &imo->im6o_mfilters[gidx];
410 ims = RB_FIND(ip6_msource_tree, &imf->im6f_sources, &find);
680 * imf is the filter set being modified.
686 im6f_get_source(struct in6_mfilter *imf, const struct sockaddr_in6 *psin,
699 ims = RB_FIND(ip6_msource_tree, &imf->im6f_sources, &find);
702 if (imf->im6f_nsrc == in6_mcast_maxsocksrc)
709 RB_INSERT(ip6_msource_tree, &imf->im6f_sources,
711 ++imf->im6f_nsrc;
730 im6f_graft(struct in6_mfilter *imf, const uint8_t st1,
741 RB_INSERT(ip6_msource_tree, &imf->im6f_sources,
743 ++imf->im6f_nsrc;
759 im6f_prune(struct in6_mfilter *imf, const struct sockaddr_in6 *psin)
766 ims = RB_FIND(ip6_msource_tree, &imf->im6f_sources, &find);
780 im6f_rollback(struct in6_mfilter *imf)
785 RB_FOREACH_SAFE(ims, ip6_msource_tree, &imf->im6f_sources, tims) {
797 RB_REMOVE(ip6_msource_tree, &imf->im6f_sources, ims);
799 imf->im6f_nsrc--;
802 imf->im6f_st[1] = imf->im6f_st[0];
811 im6f_leave(struct in6_mfilter *imf)
816 RB_FOREACH(ims, ip6_msource_tree, &imf->im6f_sources) {
820 imf->im6f_st[1] = MCAST_INCLUDE;
829 im6f_commit(struct in6_mfilter *imf)
834 RB_FOREACH(ims, ip6_msource_tree, &imf->im6f_sources) {
838 imf->im6f_st[0] = imf->im6f_st[1];
847 im6f_reap(struct in6_mfilter *imf)
852 RB_FOREACH_SAFE(ims, ip6_msource_tree, &imf->im6f_sources, tims) {
858 RB_REMOVE(ip6_msource_tree, &imf->im6f_sources, ims);
860 imf->im6f_nsrc--;
871 im6f_purge(struct in6_mfilter *imf)
876 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 0x%llx to inm 0x%llx\n", __func__,
1111 (uint64_t)VM_KERNEL_ADDRPERM(imf),
1237 * NOTE: imf argument cannot be const due to sys/tree.h limitations.
1244 /*const*/ struct in6_mfilter *imf, struct in6_multi **pinm,
1270 * If no imf was specified (i.e. kernel consumer),
1273 if (imf == NULL) {
1275 imf = &timf;
1287 error = in6m_merge(inm, imf);
1297 im6f_rollback(imf);
1324 * Holding the write lock for the INP which contains imf
1325 * is highly advisable. We can't assert for it as imf does not
1332 in6_mc_leave(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf)
1346 MLD_PRINTF(("%s: leave inm 0x%llx, %s/%s%d, imf 0x%llx\n", __func__,
1349 inm->in6m_ifp->if_unit, (uint64_t)VM_KERNEL_ADDRPERM(imf)));
1352 * If no imf was specified (i.e. kernel consumer),
1355 if (imf == NULL) {
1357 imf = &timf;
1369 error = in6m_merge(inm, imf);
1408 struct in6_mfilter *imf;
1487 imf = &imo->im6o_mfilters[idx];
1494 fmode = imf->im6f_st[0];
1520 ims = im6f_graft(imf, fmode, &ssa->sin6);
1525 error = im6f_prune(imf, &ssa->sin6);
1529 MLD_PRINTF(("%s: merge imf state failed\n", __func__));
1538 error = in6m_merge(inm, imf);
1555 im6f_rollback(imf);
1557 im6f_commit(imf);
1559 im6f_reap(imf);
1638 struct in6_mfilter *imf;
1706 imf = &imo->im6o_mfilters[idx];
1711 if (imf->im6f_st[1] == MCAST_UNDEFINED) {
1715 msfr.msfr_fmode = imf->im6f_st[1];
1748 RB_FOREACH(ims, ip6_msource_tree, &imf->im6f_sources) {
1751 lims->im6sl_st[0] != imf->im6f_st[0])
1959 struct in6_mfilter *imf;
1970 imf = NULL;
2129 imf = &imo->im6o_mfilters[idx];
2136 if (imf->im6f_st[1] != MCAST_INCLUDE) {
2144 * even if entries exist for *ssa in this imf,
2173 * XXX We don't reject this for imf in UNDEFINED
2179 if (imf->im6f_st[1] == MCAST_EXCLUDE)
2204 imf = &imo->im6o_mfilters[idx];
2205 VERIFY(RB_EMPTY(&imf->im6f_sources));
2223 im6f_init(imf, MCAST_UNDEFINED, MCAST_INCLUDE));
2227 lims = im6f_graft(imf, MCAST_INCLUDE, &ssa->sin6);
2229 MLD_PRINTF(("%s: merge imf state failed\n",
2238 im6f_init(imf, MCAST_UNDEFINED, MCAST_EXCLUDE);
2248 error = in6_mc_join(ifp, &gsa->sin6.sin6_addr, imf, &inm, 0);
2256 error = in6m_merge(inm, imf);
2275 im6f_rollback(imf);
2277 im6f_purge(imf);
2279 im6f_reap(imf);
2281 im6f_commit(imf);
2311 struct in6_mfilter *imf;
2491 imf = &imo->im6o_mfilters[idx];
2505 im6f_leave(imf);
2507 if (imf->im6f_st[0] == MCAST_EXCLUDE) {
2520 error = im6f_prune(imf, &ssa->sin6);
2522 MLD_PRINTF(("%s: merge imf state failed\n",
2538 (void) in6_mc_leave(inm, imf);
2542 error = in6m_merge(inm, imf);
2560 im6f_rollback(imf);
2562 im6f_commit(imf);
2564 im6f_reap(imf);
2645 struct in6_mfilter *imf;
2721 imf = &imo->im6o_mfilters[idx];
2727 imf->im6f_st[1] = msfr.msfr_fmode;
2767 im6f_leave(imf);
2768 imf->im6f_st[1] = msfr.msfr_fmode;
2801 error = im6f_get_source(imf, psin, &lims);
2804 lims->im6sl_st[1] = imf->im6f_st[1];
2817 error = in6m_merge(inm, imf);
2834 im6f_rollback(imf);
2836 im6f_commit(imf);
2838 im6f_reap(imf);