Lines Matching refs:inm
148 static int inm_get_source(struct in_multi *inm, const in_addr_t haddr,
199 inm_is_ifp_detached(const struct in_multi *inm) in inm_is_ifp_detached() argument
203 KASSERT(inm->inm_ifma != NULL, ("%s: no ifma", __func__)); in inm_is_ifp_detached()
204 ifp = inm->inm_ifma->ifma_ifp; in inm_is_ifp_detached()
210 KASSERT(inm->inm_ifp == ifp, ("%s: bad ifp", __func__)); in inm_is_ifp_detached()
254 inm_disconnect(struct in_multi *inm) in inm_disconnect() argument
259 ifp = inm->inm_ifp; in inm_disconnect()
261 ifma = inm->inm_ifma; in inm_disconnect()
286 inm_release_deferred(struct in_multi *inm) in inm_release_deferred() argument
291 MPASS(inm->inm_refcount > 0); in inm_release_deferred()
292 if (--inm->inm_refcount == 0) { in inm_release_deferred()
294 inm_disconnect(inm); in inm_release_deferred()
295 inm->inm_ifma->ifma_protospec = NULL; in inm_release_deferred()
296 SLIST_INSERT_HEAD(&tmp, inm, inm_nrele); in inm_release_deferred()
305 struct in_multi *inm, *tinm; in inm_release_task() local
312 SLIST_FOREACH_SAFE(inm, &inm_free_tmp, inm_nrele, tinm) { in inm_release_task()
314 MPASS(inm); in inm_release_task()
315 inm_release(inm); in inm_release_task()
362 struct in_multi *inm; in inm_lookup_locked() local
368 inm = inm_ifmultiaddr_get_inm(ifma); in inm_lookup_locked()
369 if (inm == NULL) in inm_lookup_locked()
371 if (inm->inm_addr.s_addr == ina.s_addr) in inm_lookup_locked()
372 return (inm); in inm_lookup_locked()
385 struct in_multi *inm; in inm_lookup() local
390 inm = inm_lookup_locked(ifp, ina); in inm_lookup()
393 return (inm); in inm_lookup()
407 struct in_multi *inm; in imo_match_group() local
412 inm = imf->imf_inm; in imo_match_group()
413 if (inm == NULL) in imo_match_group()
415 if ((ifp == NULL || (inm->inm_ifp == ifp)) && in imo_match_group()
416 in_hosteq(inm->inm_addr, gsin->sin_addr)) { in imo_match_group()
501 struct in_multi *inm; in in_getmulti() local
508 inm = inm_lookup(ifp, *group); in in_getmulti()
509 if (inm != NULL) { in in_getmulti()
514 KASSERT(inm->inm_refcount >= 1, in in_getmulti()
515 ("%s: bad refcount %d", __func__, inm->inm_refcount)); in in_getmulti()
516 inm_acquire_locked(inm); in in_getmulti()
517 *pinm = inm; in in_getmulti()
520 if (inm != NULL) in in_getmulti()
548 inm = (struct in_multi *)ifma->ifma_protospec; in in_getmulti()
554 KASSERT(inm != NULL, ("%s: no ifma_protospec", __func__)); in in_getmulti()
555 if (inm->inm_ifma != ifma || inm->inm_ifp != ifp || in in_getmulti()
556 !in_hosteq(inm->inm_addr, *group)) { in in_getmulti()
560 __func__, ifma, inm, inet_ntoa_r(*group, addrbuf)); in in_getmulti()
563 inm_acquire_locked(inm); in in_getmulti()
564 *pinm = inm; in in_getmulti()
577 inm = malloc(sizeof(*inm), M_IPMADDR, M_NOWAIT | M_ZERO); in in_getmulti()
578 if (inm == NULL) { in in_getmulti()
584 inm->inm_addr = *group; in in_getmulti()
585 inm->inm_ifp = ifp; in in_getmulti()
586 inm->inm_igi = ii->ii_igmp; in in_getmulti()
587 inm->inm_ifma = ifma; in in_getmulti()
588 inm->inm_refcount = 1; in in_getmulti()
589 inm->inm_state = IGMP_NOT_MEMBER; in in_getmulti()
590 mbufq_init(&inm->inm_scq, IGMP_MAX_STATE_CHANGES); in in_getmulti()
591 inm->inm_st[0].iss_fmode = MCAST_UNDEFINED; in in_getmulti()
592 inm->inm_st[1].iss_fmode = MCAST_UNDEFINED; in in_getmulti()
593 RB_INIT(&inm->inm_srcs); in in_getmulti()
595 ifma->ifma_protospec = inm; in in_getmulti()
597 *pinm = inm; in in_getmulti()
611 inm_release(struct in_multi *inm) in inm_release() argument
616 CTR2(KTR_IGMPV3, "%s: refcount is %d", __func__, inm->inm_refcount); in inm_release()
617 MPASS(inm->inm_refcount == 0); in inm_release()
618 CTR2(KTR_IGMPV3, "%s: freeing inm %p", __func__, inm); in inm_release()
620 ifma = inm->inm_ifma; in inm_release()
621 ifp = inm->inm_ifp; in inm_release()
627 inm_purge(inm); in inm_release()
628 free(inm, M_IPMADDR); in inm_release()
633 inm_purge(inm); in inm_release()
634 free(inm, M_IPMADDR); in inm_release()
645 inm_clear_recorded(struct in_multi *inm) in inm_clear_recorded() argument
651 RB_FOREACH(ims, ip_msource_tree, &inm->inm_srcs) { in inm_clear_recorded()
654 --inm->inm_st[1].iss_rec; in inm_clear_recorded()
657 KASSERT(inm->inm_st[1].iss_rec == 0, in inm_clear_recorded()
658 ("%s: iss_rec %d not 0", __func__, inm->inm_st[1].iss_rec)); in inm_clear_recorded()
684 inm_record_source(struct in_multi *inm, const in_addr_t naddr) in inm_record_source() argument
692 ims = RB_FIND(ip_msource_tree, &inm->inm_srcs, &find); in inm_record_source()
696 if (inm->inm_nsrc == in_mcast_maxgrpsrc) in inm_record_source()
703 RB_INSERT(ip_msource_tree, &inm->inm_srcs, nims); in inm_record_source()
704 ++inm->inm_nsrc; in inm_record_source()
713 ++inm->inm_st[1].iss_rec; in inm_record_source()
931 inm_get_source(struct in_multi *inm, const in_addr_t haddr, in inm_get_source() argument
938 ims = RB_FIND(ip_msource_tree, &inm->inm_srcs, &find); in inm_get_source()
940 if (inm->inm_nsrc == in_mcast_maxgrpsrc) in inm_get_source()
947 RB_INSERT(ip_msource_tree, &inm->inm_srcs, nims); in inm_get_source()
948 ++inm->inm_nsrc; in inm_get_source()
1006 inm_merge(struct in_multi *inm, /*const*/ struct in_mfilter *imf) in inm_merge() argument
1030 error = inm_get_source(inm, lims->ims_haddr, 0, &nims); in inm_merge()
1043 (void)inm_get_source(inm, lims->ims_haddr, 1, &bims); in inm_merge()
1059 --inm->inm_st[1].iss_in; in inm_merge()
1070 --inm->inm_st[1].iss_ex; in inm_merge()
1073 --inm->inm_st[1].iss_in; in inm_merge()
1078 inm->inm_st[1].iss_ex++; in inm_merge()
1081 inm->inm_st[1].iss_in++; in inm_merge()
1093 if (inm->inm_st[1].iss_ex > 0) { in inm_merge()
1095 inm->inm_st[1].iss_fmode = MCAST_EXCLUDE; in inm_merge()
1096 } else if (inm->inm_st[1].iss_in > 0) { in inm_merge()
1098 inm->inm_st[1].iss_fmode = MCAST_INCLUDE; in inm_merge()
1101 inm->inm_st[1].iss_fmode = MCAST_UNDEFINED; in inm_merge()
1109 --inm->inm_st[1].iss_asm; in inm_merge()
1116 inm->inm_st[1].iss_asm++; in inm_merge()
1119 CTR3(KTR_IGMPV3, "%s: merged imf %p to inm %p", __func__, imf, inm); in inm_merge()
1120 inm_print(inm); in inm_merge()
1125 inm_reap(inm); in inm_merge()
1135 inm_commit(struct in_multi *inm) in inm_commit() argument
1139 CTR2(KTR_IGMPV3, "%s: commit inm %p", __func__, inm); in inm_commit()
1141 inm_print(inm); in inm_commit()
1143 RB_FOREACH(ims, ip_msource_tree, &inm->inm_srcs) { in inm_commit()
1146 inm->inm_st[0] = inm->inm_st[1]; in inm_commit()
1153 inm_reap(struct in_multi *inm) in inm_reap() argument
1157 RB_FOREACH_SAFE(ims, ip_msource_tree, &inm->inm_srcs, tims) { in inm_reap()
1163 RB_REMOVE(ip_msource_tree, &inm->inm_srcs, ims); in inm_reap()
1165 inm->inm_nsrc--; in inm_reap()
1173 inm_purge(struct in_multi *inm) in inm_purge() argument
1177 RB_FOREACH_SAFE(ims, ip_msource_tree, &inm->inm_srcs, tims) { in inm_purge()
1179 RB_REMOVE(ip_msource_tree, &inm->inm_srcs, ims); in inm_purge()
1181 inm->inm_nsrc--; in inm_purge()
1183 mbufq_drain(&inm->inm_scq); in inm_purge()
1220 struct in_multi *inm; in in_joingroup_locked() local
1230 inm = NULL; in in_joingroup_locked()
1241 error = in_getmulti(ifp, gina, &inm); in in_joingroup_locked()
1248 error = inm_merge(inm, imf); in in_joingroup_locked()
1255 error = igmp_change_state(inm); in in_joingroup_locked()
1263 CTR2(KTR_IGMPV3, "%s: dropping ref on %p", __func__, inm); in in_joingroup_locked()
1265 inm_release_deferred(inm); in in_joingroup_locked()
1268 *pinm = inm; 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
1315 inm, ntohl(inm->inm_addr.s_addr), in in_leavegroup_locked()
1316 (inm_is_ifp_detached(inm) ? "null" : inm->inm_ifp->if_xname), in in_leavegroup_locked()
1337 error = inm_merge(inm, imf); in in_leavegroup_locked()
1341 CURVNET_SET(inm->inm_ifp->if_vnet); in in_leavegroup_locked()
1342 error = igmp_change_state(inm); in in_leavegroup_locked()
1343 IF_ADDR_WLOCK(inm->inm_ifp); in in_leavegroup_locked()
1344 inm_release_deferred(inm); in in_leavegroup_locked()
1345 IF_ADDR_WUNLOCK(inm->inm_ifp); in in_leavegroup_locked()
1351 CTR2(KTR_IGMPV3, "%s: dropping ref on %p", __func__, inm); in in_leavegroup_locked()
1377 struct in_multi *inm; in inp_block_unblock_source() local
1469 inm = imf->imf_inm; in inp_block_unblock_source()
1520 error = inm_merge(inm, imf); in inp_block_unblock_source()
1528 error = igmp_change_state(inm); in inp_block_unblock_source()
1586 struct in_multi *inm; in inp_freemoptions() local
1596 if ((inm = imf->imf_inm) != NULL) { in inp_freemoptions()
1597 if ((ifp = inm->inm_ifp) != NULL) { in inp_freemoptions()
1599 (void)in_leavegroup(inm, imf); in inp_freemoptions()
1602 (void)in_leavegroup(inm, imf); in inp_freemoptions()
1911 struct in_multi *inm; in inp_join_group() local
2044 inm = NULL; in inp_join_group()
2052 inm = imf->imf_inm; in inp_join_group()
2183 error = inm_merge(inm, imf); in inp_join_group()
2193 error = igmp_change_state(inm); in inp_join_group()
2240 struct in_multi *inm; in inp_leave_group() local
2356 inm = imf->imf_inm; in inp_leave_group()
2406 error = inm_merge(inm, imf); in inp_leave_group()
2417 error = igmp_change_state(inm); in inp_leave_group()
2530 struct in_multi *inm; in inp_set_source_filters() local
2573 inm = imf->imf_inm; in inp_set_source_filters()
2656 error = inm_merge(inm, imf); in inp_set_source_filters()
2664 error = igmp_change_state(inm); in inp_set_source_filters()
2849 struct in_multi *inm; in sysctl_ip_mcast_filters() local
2892 inm = inm_ifmultiaddr_get_inm(ifma); in sysctl_ip_mcast_filters()
2893 if (inm == NULL) in sysctl_ip_mcast_filters()
2895 if (!in_hosteq(inm->inm_addr, group)) in sysctl_ip_mcast_filters()
2897 fmode = inm->inm_st[1].iss_fmode; in sysctl_ip_mcast_filters()
2901 RB_FOREACH(ims, ip_msource_tree, &inm->inm_srcs) { in sysctl_ip_mcast_filters()
2907 if (fmode != ims_get_mode(inm, ims, 1)) { in sysctl_ip_mcast_filters()
2974 inm_print(const struct in_multi *inm) in inm_print() argument
2982 printf("%s: --- begin inm %p ---\n", __func__, inm); in inm_print()
2984 inet_ntoa_r(inm->inm_addr, addrbuf), in inm_print()
2985 inm->inm_ifp, in inm_print()
2986 inm->inm_ifp->if_xname, in inm_print()
2987 inm->inm_ifma); in inm_print()
2989 inm->inm_timer, in inm_print()
2990 inm_state_str(inm->inm_state), in inm_print()
2991 inm->inm_refcount, in inm_print()
2992 inm->inm_scq.mq_len); in inm_print()
2994 inm->inm_igi, in inm_print()
2995 inm->inm_nsrc, in inm_print()
2996 inm->inm_sctimer, in inm_print()
2997 inm->inm_scrv); in inm_print()
3000 inm_mode_str(inm->inm_st[t].iss_fmode), in inm_print()
3001 inm->inm_st[t].iss_asm, in inm_print()
3002 inm->inm_st[t].iss_ex, in inm_print()
3003 inm->inm_st[t].iss_in, in inm_print()
3004 inm->inm_st[t].iss_rec); in inm_print()
3006 printf("%s: --- end inm %p ---\n", __func__, inm); in inm_print()
3012 inm_print(const struct in_multi *inm) in inm_print() argument