Lines Matching refs:imf
110 static int imf_get_source(struct in_mfilter *imf,
256 imf_init(struct in_mfilter *imf, const uint8_t st0, const uint8_t st1) in imf_init() argument
258 memset(imf, 0, sizeof(struct in_mfilter)); in imf_init()
259 RB_INIT(&imf->imf_sources); in imf_init()
260 imf->imf_st[0] = st0; in imf_init()
261 imf->imf_st[1] = st1; in imf_init()
370 struct in_mfilter *imf; in imo_match_source() local
382 imf = &imo->imo_mfilters[gidx]; in imo_match_source()
386 ims = RB_FIND(ip_msource_tree, &imf->imf_sources, &find); in imo_match_source()
464 struct in_mfilter *imf; in imo_clone() local
466 imf = to->imo_mfilters ? &to->imo_mfilters[i] : NULL; in imo_clone()
467 if (imf != NULL) { in imo_clone()
468 imf_leave(imf); in imo_clone()
471 (void) in_leavegroup(to->imo_membership[i], imf); in imo_clone()
473 if (imf != NULL) { in imo_clone()
474 imf_purge(imf); in imo_clone()
738 imf_get_source(struct in_mfilter *imf, const struct sockaddr_in *psin, in imf_get_source() argument
752 ims = RB_FIND(ip_msource_tree, &imf->imf_sources, &find); in imf_get_source()
755 if (imf->imf_nsrc == in_mcast_maxsocksrc) { in imf_get_source()
761 RB_INSERT(ip_msource_tree, &imf->imf_sources, in imf_get_source()
763 ++imf->imf_nsrc; in imf_get_source()
782 imf_graft(struct in_mfilter *imf, const uint8_t st1, in imf_graft() argument
791 RB_INSERT(ip_msource_tree, &imf->imf_sources, in imf_graft()
793 ++imf->imf_nsrc; in imf_graft()
809 imf_prune(struct in_mfilter *imf, const struct sockaddr_in *psin) in imf_prune() argument
817 ims = RB_FIND(ip_msource_tree, &imf->imf_sources, &find); in imf_prune()
832 imf_rollback(struct in_mfilter *imf) in imf_rollback() argument
837 RB_FOREACH_SAFE(ims, ip_msource_tree, &imf->imf_sources, tims) { in imf_rollback()
849 RB_REMOVE(ip_msource_tree, &imf->imf_sources, ims); in imf_rollback()
851 imf->imf_nsrc--; in imf_rollback()
854 imf->imf_st[1] = imf->imf_st[0]; in imf_rollback()
863 imf_leave(struct in_mfilter *imf) in imf_leave() argument
868 RB_FOREACH(ims, ip_msource_tree, &imf->imf_sources) { in imf_leave()
872 imf->imf_st[1] = MCAST_INCLUDE; in imf_leave()
881 imf_commit(struct in_mfilter *imf) in imf_commit() argument
886 RB_FOREACH(ims, ip_msource_tree, &imf->imf_sources) { in imf_commit()
890 imf->imf_st[0] = imf->imf_st[1]; in imf_commit()
899 imf_reap(struct in_mfilter *imf) in imf_reap() argument
904 RB_FOREACH_SAFE(ims, ip_msource_tree, &imf->imf_sources, tims) { in imf_reap()
910 RB_REMOVE(ip_msource_tree, &imf->imf_sources, ims); in imf_reap()
912 imf->imf_nsrc--; in imf_reap()
923 imf_purge(struct in_mfilter *imf) in imf_purge() argument
928 RB_FOREACH_SAFE(ims, ip_msource_tree, &imf->imf_sources, tims) { in imf_purge()
932 RB_REMOVE(ip_msource_tree, &imf->imf_sources, ims); in imf_purge()
934 imf->imf_nsrc--; in imf_purge()
936 imf->imf_st[0] = imf->imf_st[1] = MCAST_UNDEFINED; in imf_purge()
937 VERIFY(RB_EMPTY(&imf->imf_sources)); in imf_purge()
1064 inm_merge(struct in_multi *inm, /*const*/ struct in_mfilter *imf) in inm_merge() argument
1084 RB_FOREACH(ims, ip_msource_tree, &imf->imf_sources) { in inm_merge()
1086 if (lims->imsl_st[0] == imf->imf_st[0]) { in inm_merge()
1089 if (lims->imsl_st[1] == imf->imf_st[1]) { in inm_merge()
1123 if (imf->imf_st[0] == imf->imf_st[1] && in inm_merge()
1124 imf->imf_st[1] == MCAST_INCLUDE) { in inm_merge()
1132 if (imf->imf_st[0] != imf->imf_st[1]) { in inm_merge()
1134 __func__, imf->imf_st[0], imf->imf_st[1])); in inm_merge()
1136 if (imf->imf_st[0] == MCAST_EXCLUDE) { in inm_merge()
1139 } else if (imf->imf_st[0] == MCAST_INCLUDE) { in inm_merge()
1144 if (imf->imf_st[1] == MCAST_EXCLUDE) { in inm_merge()
1147 } else if (imf->imf_st[1] == MCAST_INCLUDE && nsrc1 > 0) { in inm_merge()
1173 if (imf->imf_st[0] == MCAST_EXCLUDE && nsrc0 == 0) { in inm_merge()
1174 if ((imf->imf_st[1] != MCAST_EXCLUDE) || in inm_merge()
1175 (imf->imf_st[1] == MCAST_EXCLUDE && nsrc1 > 0)) { in inm_merge()
1182 if (imf->imf_st[1] == MCAST_EXCLUDE && nsrc1 == 0) { in inm_merge()
1188 (uint64_t)VM_KERNEL_ADDRPERM(imf), in inm_merge()
1276 /*const*/ struct in_mfilter *imf, struct in_multi **pinm) in in_joingroup() argument
1293 if (imf == NULL) { in in_joingroup()
1295 imf = &timf; in in_joingroup()
1307 error = inm_merge(inm, imf); in in_joingroup()
1317 imf_rollback(imf); in in_joingroup()
1348 in_leavegroup(struct in_multi *inm, /*const*/ struct in_mfilter *imf) in in_leavegroup() argument
1366 inm->inm_ifp->if_unit, (uint64_t)VM_KERNEL_ADDRPERM(imf))); in in_leavegroup()
1372 if (imf == NULL) { in in_leavegroup()
1374 imf = &timf; in in_leavegroup()
1386 error = inm_merge(inm, imf); in in_leavegroup()
1456 struct in_mfilter *imf; in inp_block_unblock_source() local
1573 imf = &imo->imo_mfilters[idx]; in inp_block_unblock_source()
1580 fmode = imf->imf_st[0]; in inp_block_unblock_source()
1606 ims = imf_graft(imf, fmode, ssa); in inp_block_unblock_source()
1612 error = imf_prune(imf, ssa); in inp_block_unblock_source()
1625 error = inm_merge(inm, imf); in inp_block_unblock_source()
1643 imf_rollback(imf); in inp_block_unblock_source()
1645 imf_commit(imf); in inp_block_unblock_source()
1648 imf_reap(imf); in inp_block_unblock_source()
1720 struct in_mfilter *imf; in inp_get_source_filters() local
1789 imf = &imo->imo_mfilters[idx]; in inp_get_source_filters()
1794 if (imf->imf_st[1] == MCAST_UNDEFINED) { in inp_get_source_filters()
1798 msfr.msfr_fmode = imf->imf_st[1]; in inp_get_source_filters()
1831 RB_FOREACH(ims, ip_msource_tree, &imf->imf_sources) { in inp_get_source_filters()
1834 lims->imsl_st[0] != imf->imf_st[0]) { in inp_get_source_filters()
2086 struct in_mfilter *imf; in inp_join_group() local
2096 imf = NULL; in inp_join_group()
2231 imf = &imo->imo_mfilters[idx]; in inp_join_group()
2238 if (imf->imf_st[1] != MCAST_INCLUDE) { in inp_join_group()
2281 if (imf->imf_st[1] == MCAST_EXCLUDE) { in inp_join_group()
2308 imf = &imo->imo_mfilters[idx]; in inp_join_group()
2309 VERIFY(RB_EMPTY(&imf->imf_sources)); in inp_join_group()
2322 imf_init(imf, MCAST_UNDEFINED, MCAST_INCLUDE); in inp_join_group()
2326 lims = imf_graft(imf, MCAST_INCLUDE, ssa); in inp_join_group()
2337 imf_init(imf, MCAST_UNDEFINED, MCAST_EXCLUDE); in inp_join_group()
2346 error = in_joingroup(ifp, &gsa->sin_addr, imf, &inm); in inp_join_group()
2356 error = inm_merge(inm, imf); in inp_join_group()
2375 imf_rollback(imf); in inp_join_group()
2377 imf_purge(imf); in inp_join_group()
2379 imf_reap(imf); in inp_join_group()
2382 imf_commit(imf); in inp_join_group()
2415 struct in_mfilter *imf; in inp_leave_group() local
2545 imf = &imo->imo_mfilters[idx]; in inp_leave_group()
2562 imf_leave(imf); in inp_leave_group()
2564 if (imf->imf_st[0] == MCAST_EXCLUDE) { in inp_leave_group()
2577 error = imf_prune(imf, ssa); in inp_leave_group()
2594 (void) in_leavegroup(inm, imf); in inp_leave_group()
2598 error = inm_merge(inm, imf); in inp_leave_group()
2616 imf_rollback(imf); in inp_leave_group()
2618 imf_commit(imf); in inp_leave_group()
2621 imf_reap(imf); in inp_leave_group()
2749 struct in_mfilter *imf; in inp_set_source_filters() local
2834 imf = &imo->imo_mfilters[idx]; in inp_set_source_filters()
2840 imf->imf_st[1] = (uint8_t)msfr.msfr_fmode; in inp_set_source_filters()
2879 imf_leave(imf); in inp_set_source_filters()
2880 imf->imf_st[1] = (uint8_t)msfr.msfr_fmode; in inp_set_source_filters()
2904 error = imf_get_source(imf, psin, &lims); in inp_set_source_filters()
2908 lims->imsl_st[1] = imf->imf_st[1]; in inp_set_source_filters()
2922 error = inm_merge(inm, imf); in inp_set_source_filters()
2940 imf_rollback(imf); in inp_set_source_filters()
2942 imf_commit(imf); in inp_set_source_filters()
2945 imf_reap(imf); in inp_set_source_filters()