Lines Matching refs:imf
128 static int imf_get_source(struct in_mfilter *imf,
325 imf_init(struct in_mfilter *imf, const int st0, const int st1) in imf_init() argument
327 memset(imf, 0, sizeof(struct in_mfilter)); in imf_init()
328 RB_INIT(&imf->imf_sources); in imf_init()
329 imf->imf_st[0] = st0; in imf_init()
330 imf->imf_st[1] = st1; in imf_init()
336 struct in_mfilter *imf; in ip_mfilter_alloc() local
338 imf = malloc(sizeof(*imf), M_INMFILTER, mflags); in ip_mfilter_alloc()
339 if (imf != NULL) in ip_mfilter_alloc()
340 imf_init(imf, st0, st1); in ip_mfilter_alloc()
342 return (imf); in ip_mfilter_alloc()
346 ip_mfilter_free(struct in_mfilter *imf) in ip_mfilter_free() argument
349 imf_purge(imf); in ip_mfilter_free()
350 free(imf, M_INMFILTER); in ip_mfilter_free()
406 struct in_mfilter *imf; in imo_match_group() local
411 IP_MFILTER_FOREACH(imf, &imo->imo_head) { in imo_match_group()
412 inm = imf->imf_inm; in imo_match_group()
420 return (imf); in imo_match_group()
431 imo_match_source(struct in_mfilter *imf, const struct sockaddr *src) in imo_match_source() argument
442 ims = RB_FIND(ip_msource_tree, &imf->imf_sources, &find); in imo_match_source()
457 struct in_mfilter *imf; in imo_multi_filter() local
463 imf = imo_match_group(imo, ifp, group); in imo_multi_filter()
464 if (imf == NULL) in imo_multi_filter()
476 mode = imf->imf_st[1]; in imo_multi_filter()
477 ims = imo_match_source(imf, src); in imo_multi_filter()
730 imf_get_source(struct in_mfilter *imf, const struct sockaddr_in *psin, in imf_get_source() argument
744 ims = RB_FIND(ip_msource_tree, &imf->imf_sources, &find); in imf_get_source()
747 if (imf->imf_nsrc == in_mcast_maxsocksrc) in imf_get_source()
756 RB_INSERT(ip_msource_tree, &imf->imf_sources, nims); in imf_get_source()
757 ++imf->imf_nsrc; in imf_get_source()
774 imf_graft(struct in_mfilter *imf, const uint8_t st1, in imf_graft() argument
788 RB_INSERT(ip_msource_tree, &imf->imf_sources, nims); in imf_graft()
789 ++imf->imf_nsrc; in imf_graft()
803 imf_prune(struct in_mfilter *imf, const struct sockaddr_in *psin) in imf_prune() argument
811 ims = RB_FIND(ip_msource_tree, &imf->imf_sources, &find); in imf_prune()
823 imf_rollback(struct in_mfilter *imf) in imf_rollback() argument
828 RB_FOREACH_SAFE(ims, ip_msource_tree, &imf->imf_sources, tims) { in imf_rollback()
839 RB_REMOVE(ip_msource_tree, &imf->imf_sources, ims); in imf_rollback()
841 imf->imf_nsrc--; in imf_rollback()
844 imf->imf_st[1] = imf->imf_st[0]; in imf_rollback()
851 imf_leave(struct in_mfilter *imf) in imf_leave() argument
856 RB_FOREACH(ims, ip_msource_tree, &imf->imf_sources) { in imf_leave()
860 imf->imf_st[1] = MCAST_INCLUDE; in imf_leave()
867 imf_commit(struct in_mfilter *imf) in imf_commit() argument
872 RB_FOREACH(ims, ip_msource_tree, &imf->imf_sources) { in imf_commit()
876 imf->imf_st[0] = imf->imf_st[1]; in imf_commit()
883 imf_reap(struct in_mfilter *imf) in imf_reap() argument
888 RB_FOREACH_SAFE(ims, ip_msource_tree, &imf->imf_sources, tims) { in imf_reap()
893 RB_REMOVE(ip_msource_tree, &imf->imf_sources, ims); in imf_reap()
895 imf->imf_nsrc--; in imf_reap()
904 imf_purge(struct in_mfilter *imf) in imf_purge() argument
908 RB_FOREACH_SAFE(ims, ip_msource_tree, &imf->imf_sources, tims) { in imf_purge()
910 RB_REMOVE(ip_msource_tree, &imf->imf_sources, ims); in imf_purge()
912 imf->imf_nsrc--; in imf_purge()
914 imf->imf_st[0] = imf->imf_st[1] = MCAST_UNDEFINED; in imf_purge()
915 KASSERT(RB_EMPTY(&imf->imf_sources), in imf_purge()
1006 inm_merge(struct in_multi *inm, /*const*/ struct in_mfilter *imf) in inm_merge() argument
1025 RB_FOREACH(ims, ip_msource_tree, &imf->imf_sources) { in inm_merge()
1027 if (lims->imsl_st[0] == imf->imf_st[0]) nsrc0++; in inm_merge()
1028 if (lims->imsl_st[1] == imf->imf_st[1]) nsrc1++; in inm_merge()
1055 if (imf->imf_st[0] == imf->imf_st[1] && in inm_merge()
1056 imf->imf_st[1] == MCAST_INCLUDE) { in inm_merge()
1064 if (imf->imf_st[0] != imf->imf_st[1]) { in inm_merge()
1066 __func__, imf->imf_st[0], imf->imf_st[1]); in inm_merge()
1068 if (imf->imf_st[0] == MCAST_EXCLUDE) { in inm_merge()
1071 } else if (imf->imf_st[0] == MCAST_INCLUDE) { in inm_merge()
1076 if (imf->imf_st[1] == MCAST_EXCLUDE) { in inm_merge()
1079 } else if (imf->imf_st[1] == MCAST_INCLUDE && nsrc1 > 0) { in inm_merge()
1105 if (imf->imf_st[0] == MCAST_EXCLUDE && nsrc0 == 0) { in inm_merge()
1106 if ((imf->imf_st[1] != MCAST_EXCLUDE) || in inm_merge()
1107 (imf->imf_st[1] == MCAST_EXCLUDE && nsrc1 > 0)) { in inm_merge()
1114 if (imf->imf_st[1] == MCAST_EXCLUDE && nsrc1 == 0) { in inm_merge()
1119 CTR3(KTR_IGMPV3, "%s: merged imf %p to inm %p", __func__, imf, inm); in inm_merge()
1195 /*const*/ struct in_mfilter *imf, struct in_multi **pinm) in in_joingroup() argument
1200 error = in_joingroup_locked(ifp, gina, imf, pinm); in in_joingroup()
1217 /*const*/ struct in_mfilter *imf, struct in_multi **pinm) in in_joingroup_locked() argument
1236 if (imf == NULL) { in in_joingroup_locked()
1238 imf = &timf; in in_joingroup_locked()
1248 error = inm_merge(inm, imf); in in_joingroup_locked()
1279 in_leavegroup(struct in_multi *inm, /*const*/ struct in_mfilter *imf) in in_leavegroup() argument
1284 error = in_leavegroup_locked(inm, imf); in in_leavegroup()
1304 in_leavegroup_locked(struct in_multi *inm, /*const*/ struct in_mfilter *imf) in in_leavegroup_locked() argument
1317 imf); in in_leavegroup_locked()
1323 if (imf == NULL) { in in_leavegroup_locked()
1325 imf = &timf; in in_leavegroup_locked()
1337 error = inm_merge(inm, imf); in in_leavegroup_locked()
1374 struct in_mfilter *imf; in inp_block_unblock_source() local
1464 imf = imo_match_group(imo, ifp, &gsa->sa); in inp_block_unblock_source()
1465 if (imf == NULL) { in inp_block_unblock_source()
1469 inm = imf->imf_inm; in inp_block_unblock_source()
1475 fmode = imf->imf_st[0]; in inp_block_unblock_source()
1487 ims = imo_match_source(imf, &ssa->sa); in inp_block_unblock_source()
1502 ims = imf_graft(imf, fmode, &ssa->sin); in inp_block_unblock_source()
1507 error = imf_prune(imf, &ssa->sin); in inp_block_unblock_source()
1520 error = inm_merge(inm, imf); in inp_block_unblock_source()
1535 imf_rollback(imf); in inp_block_unblock_source()
1537 imf_commit(imf); in inp_block_unblock_source()
1539 imf_reap(imf); in inp_block_unblock_source()
1585 struct in_mfilter *imf; in inp_freemoptions() local
1592 while ((imf = ip_mfilter_first(&imo->imo_head)) != NULL) { in inp_freemoptions()
1593 ip_mfilter_remove(&imo->imo_head, imf); in inp_freemoptions()
1595 imf_leave(imf); in inp_freemoptions()
1596 if ((inm = imf->imf_inm) != NULL) { in inp_freemoptions()
1599 (void)in_leavegroup(inm, imf); in inp_freemoptions()
1602 (void)in_leavegroup(inm, imf); in inp_freemoptions()
1605 ip_mfilter_free(imf); in inp_freemoptions()
1622 struct in_mfilter *imf; in inp_get_source_filters() local
1655 imf = imo_match_group(imo, ifp, &gsa->sa); in inp_get_source_filters()
1656 if (imf == NULL) { in inp_get_source_filters()
1664 if (imf->imf_st[1] == MCAST_UNDEFINED) { in inp_get_source_filters()
1668 msfr.msfr_fmode = imf->imf_st[1]; in inp_get_source_filters()
1696 RB_FOREACH(ims, ip_msource_tree, &imf->imf_sources) { in inp_get_source_filters()
1699 lims->imsl_st[0] != imf->imf_st[0]) in inp_get_source_filters()
1909 struct in_mfilter *imf; in inp_join_group() local
2041 imf = imo_match_group(imo, ifp, &gsa->sa); in inp_join_group()
2042 if (imf == NULL) { in inp_join_group()
2052 inm = imf->imf_inm; in inp_join_group()
2060 if (imf->imf_st[1] != MCAST_INCLUDE) { in inp_join_group()
2080 lims = imo_match_source(imf, &ssa->sa); in inp_join_group()
2102 if (imf->imf_st[1] == MCAST_EXCLUDE) in inp_join_group()
2128 imf = ip_mfilter_alloc(M_NOWAIT, MCAST_UNDEFINED, MCAST_INCLUDE); in inp_join_group()
2129 if (imf == NULL) { in inp_join_group()
2136 lims = imf_graft(imf, MCAST_INCLUDE, &ssa->sin); in inp_join_group()
2147 imf = ip_mfilter_alloc(M_NOWAIT, MCAST_UNDEFINED, MCAST_EXCLUDE); in inp_join_group()
2148 if (imf == NULL) { in inp_join_group()
2162 error = in_joingroup_locked(ifp, &gsa->sin.sin_addr, imf, in inp_join_group()
2163 &imf->imf_inm); in inp_join_group()
2179 ip_mfilter_insert(&imo->imo_head, imf); in inp_join_group()
2183 error = inm_merge(inm, imf); in inp_join_group()
2188 imf_rollback(imf); in inp_join_group()
2189 imf_reap(imf); in inp_join_group()
2198 imf_rollback(imf); in inp_join_group()
2199 imf_reap(imf); in inp_join_group()
2204 imf_commit(imf); in inp_join_group()
2205 imf = NULL; in inp_join_group()
2212 if (is_new && imf) { in inp_join_group()
2213 if (imf->imf_inm != NULL) { in inp_join_group()
2216 inm_release_deferred(imf->imf_inm); in inp_join_group()
2220 ip_mfilter_free(imf); in inp_join_group()
2237 struct in_mfilter *imf; in inp_leave_group() local
2351 imf = imo_match_group(imo, ifp, &gsa->sa); in inp_leave_group()
2352 if (imf == NULL) { in inp_leave_group()
2356 inm = imf->imf_inm; in inp_leave_group()
2371 ip_mfilter_remove(&imo->imo_head, imf); in inp_leave_group()
2372 imf_leave(imf); in inp_leave_group()
2378 (void) in_leavegroup_locked(imf->imf_inm, imf); in inp_leave_group()
2380 if (imf->imf_st[0] == MCAST_EXCLUDE) { in inp_leave_group()
2384 ims = imo_match_source(imf, &ssa->sa); in inp_leave_group()
2392 error = imf_prune(imf, &ssa->sin); in inp_leave_group()
2406 error = inm_merge(inm, imf); in inp_leave_group()
2411 imf_rollback(imf); in inp_leave_group()
2412 imf_reap(imf); in inp_leave_group()
2422 imf_rollback(imf); in inp_leave_group()
2423 imf_reap(imf); in inp_leave_group()
2427 imf_commit(imf); in inp_leave_group()
2428 imf_reap(imf); in inp_leave_group()
2433 if (is_final && imf) in inp_leave_group()
2434 ip_mfilter_free(imf); in inp_leave_group()
2528 struct in_mfilter *imf; in inp_set_source_filters() local
2568 imf = imo_match_group(imo, ifp, &gsa->sa); in inp_set_source_filters()
2569 if (imf == NULL) { in inp_set_source_filters()
2573 inm = imf->imf_inm; in inp_set_source_filters()
2580 imf->imf_st[1] = msfr.msfr_fmode; in inp_set_source_filters()
2614 imf_leave(imf); in inp_set_source_filters()
2615 imf->imf_st[1] = msfr.msfr_fmode; in inp_set_source_filters()
2638 error = imf_get_source(imf, psin, &lims); in inp_set_source_filters()
2641 lims->imsl_st[1] = imf->imf_st[1]; in inp_set_source_filters()
2656 error = inm_merge(inm, imf); in inp_set_source_filters()
2671 imf_rollback(imf); in inp_set_source_filters()
2673 imf_commit(imf); in inp_set_source_filters()
2675 imf_reap(imf); in inp_set_source_filters()