Lines Matching defs:imf

120 static int	imf_get_source(struct in_mfilter *imf,
277 imf_init(struct in_mfilter *imf, const int st0, const int st1)
279 memset(imf, 0, sizeof(struct in_mfilter));
280 RB_INIT(&imf->imf_sources);
281 imf->imf_st[0] = st0;
282 imf->imf_st[1] = st1;
387 struct in_mfilter *imf;
399 imf = &imo->imo_mfilters[gidx];
404 ims = RB_FIND(ip_msource_tree, &imf->imf_sources, &find);
480 struct in_mfilter *imf;
482 imf = to->imo_mfilters ? &to->imo_mfilters[i] : NULL;
483 if (imf != NULL)
484 imf_leave(imf);
486 (void) in_leavegroup(to->imo_membership[i], imf);
488 if (imf != NULL)
489 imf_purge(imf);
747 * imf is the filter set being modified.
753 imf_get_source(struct in_mfilter *imf, const struct sockaddr_in *psin,
767 ims = RB_FIND(ip_msource_tree, &imf->imf_sources, &find);
770 if (imf->imf_nsrc == in_mcast_maxsocksrc)
777 RB_INSERT(ip_msource_tree, &imf->imf_sources,
779 ++imf->imf_nsrc;
798 imf_graft(struct in_mfilter *imf, const uint8_t st1,
809 RB_INSERT(ip_msource_tree, &imf->imf_sources,
811 ++imf->imf_nsrc;
827 imf_prune(struct in_mfilter *imf, const struct sockaddr_in *psin)
835 ims = RB_FIND(ip_msource_tree, &imf->imf_sources, &find);
849 imf_rollback(struct in_mfilter *imf)
854 RB_FOREACH_SAFE(ims, ip_msource_tree, &imf->imf_sources, tims) {
865 RB_REMOVE(ip_msource_tree, &imf->imf_sources, ims);
867 imf->imf_nsrc--;
870 imf->imf_st[1] = imf->imf_st[0];
879 imf_leave(struct in_mfilter *imf)
884 RB_FOREACH(ims, ip_msource_tree, &imf->imf_sources) {
888 imf->imf_st[1] = MCAST_INCLUDE;
897 imf_commit(struct in_mfilter *imf)
902 RB_FOREACH(ims, ip_msource_tree, &imf->imf_sources) {
906 imf->imf_st[0] = imf->imf_st[1];
915 imf_reap(struct in_mfilter *imf)
920 RB_FOREACH_SAFE(ims, ip_msource_tree, &imf->imf_sources, tims) {
925 RB_REMOVE(ip_msource_tree, &imf->imf_sources, ims);
927 imf->imf_nsrc--;
938 imf_purge(struct in_mfilter *imf)
943 RB_FOREACH_SAFE(ims, ip_msource_tree, &imf->imf_sources, tims) {
946 RB_REMOVE(ip_msource_tree, &imf->imf_sources, ims);
948 imf->imf_nsrc--;
950 imf->imf_st[0] = imf->imf_st[1] = MCAST_UNDEFINED;
951 VERIFY(RB_EMPTY(&imf->imf_sources));
1061 * imf is the per-inpcb-membership group filter pointer.
1062 * A fake imf may be passed for in-kernel consumers.
1072 inm_merge(struct in_multi *inm, /*const*/ struct in_mfilter *imf)
1092 RB_FOREACH(ims, ip_msource_tree, &imf->imf_sources) {
1094 if (lims->imsl_st[0] == imf->imf_st[0]) nsrc0++;
1095 if (lims->imsl_st[1] == imf->imf_st[1]) nsrc1++;
1118 IGMP_PRINTF(("%s: imf filters in-mode: %d at t0, %d at t1\n",
1122 if (imf->imf_st[0] == imf->imf_st[1] &&
1123 imf->imf_st[1] == MCAST_INCLUDE) {
1131 if (imf->imf_st[0] != imf->imf_st[1]) {
1132 IGMP_PRINTF(("%s: imf transition %d to %d\n",
1133 __func__, imf->imf_st[0], imf->imf_st[1]));
1135 if (imf->imf_st[0] == MCAST_EXCLUDE) {
1138 } else if (imf->imf_st[0] == MCAST_INCLUDE) {
1143 if (imf->imf_st[1] == MCAST_EXCLUDE) {
1146 } else if (imf->imf_st[1] == MCAST_INCLUDE && nsrc1 > 0) {
1172 if (imf->imf_st[0] == MCAST_EXCLUDE && nsrc0 == 0) {
1173 if ((imf->imf_st[1] != MCAST_EXCLUDE) ||
1174 (imf->imf_st[1] == MCAST_EXCLUDE && nsrc1 > 0)) {
1181 if (imf->imf_st[1] == MCAST_EXCLUDE && nsrc1 == 0) {
1186 IGMP_PRINTF(("%s: merged imf %p to inm %p\n", __func__, imf, inm));
1262 * NOTE: imf argument cannot be const due to sys/tree.h limitations.
1269 /*const*/ struct in_mfilter *imf, struct in_multi **pinm)
1281 * If no imf was specified (i.e. kernel consumer),
1284 if (imf == NULL) {
1286 imf = &timf;
1298 error = inm_merge(inm, imf);
1334 in_leavegroup(struct in_multi *inm, /*const*/ struct in_mfilter *imf)
1346 IGMP_PRINTF(("%s: leave inm %p, %s/%s%d, imf %p\n", __func__,
1349 inm->inm_ifp->if_unit, imf));
1352 * If no imf was specified (i.e. kernel consumer),
1355 if (imf == NULL) {
1357 imf = &timf;
1369 error = inm_merge(inm, imf);
1436 struct in_mfilter *imf;
1541 imf = &imo->imo_mfilters[idx];
1548 fmode = imf->imf_st[0];
1573 ims = imf_graft(imf, fmode, &ssa->sin);
1578 error = imf_prune(imf, &ssa->sin);
1582 IGMP_PRINTF(("%s: merge imf state failed\n", __func__));
1591 error = inm_merge(inm, imf);
1608 imf_rollback(imf);
1610 imf_commit(imf);
1612 imf_reap(imf);
1688 struct in_mfilter *imf;
1748 imf = &imo->imo_mfilters[idx];
1753 if (imf->imf_st[1] == MCAST_UNDEFINED) {
1757 msfr.msfr_fmode = imf->imf_st[1];
1790 RB_FOREACH(ims, ip_msource_tree, &imf->imf_sources) {
1793 lims->imsl_st[0] != imf->imf_st[0])
2050 struct in_mfilter *imf;
2058 imf = NULL;
2179 imf = &imo->imo_mfilters[idx];
2186 if (imf->imf_st[1] != MCAST_INCLUDE) {
2194 * even if entries exist for *ssa in this imf,
2223 * XXX We don't reject this for imf in UNDEFINED
2229 if (imf->imf_st[1] == MCAST_EXCLUDE)
2254 imf = &imo->imo_mfilters[idx];
2255 VERIFY(RB_EMPTY(&imf->imf_sources));
2268 imf_init(imf, MCAST_UNDEFINED, MCAST_INCLUDE);
2272 lims = imf_graft(imf, MCAST_INCLUDE, &ssa->sin);
2274 IGMP_PRINTF(("%s: merge imf state failed\n",
2283 imf_init(imf, MCAST_UNDEFINED, MCAST_EXCLUDE);
2293 error = in_joingroup(ifp, &gsa->sin.sin_addr, imf, &inm);
2301 error = inm_merge(inm, imf);
2320 imf_rollback(imf);
2322 imf_purge(imf);
2324 imf_reap(imf);
2326 imf_commit(imf);
2355 struct in_mfilter *imf;
2478 imf = &imo->imo_mfilters[idx];
2495 imf_leave(imf);
2497 if (imf->imf_st[0] == MCAST_EXCLUDE) {
2509 error = imf_prune(imf, &ssa->sin);
2511 IGMP_PRINTF(("%s: merge imf state failed\n",
2527 (void) in_leavegroup(inm, imf);
2531 error = inm_merge(inm, imf);
2549 imf_rollback(imf);
2551 imf_commit(imf);
2553 imf_reap(imf);
2672 struct in_mfilter *imf;
2743 imf = &imo->imo_mfilters[idx];
2749 imf->imf_st[1] = msfr.msfr_fmode;
2788 imf_leave(imf);
2789 imf->imf_st[1] = msfr.msfr_fmode;
2813 error = imf_get_source(imf, psin, &lims);
2816 lims->imsl_st[1] = imf->imf_st[1];
2829 error = inm_merge(inm, imf);
2846 imf_rollback(imf);
2848 imf_commit(imf);
2850 imf_reap(imf);