Lines Matching refs:inm

146 static int	in6m_get_source(struct in6_multi *inm,
200 in6m_is_ifp_detached(const struct in6_multi *inm) in in6m_is_ifp_detached() argument
204 KASSERT(inm->in6m_ifma != NULL, ("%s: no ifma", __func__)); in in6m_is_ifp_detached()
205 ifp = inm->in6m_ifma->ifma_ifp; in in6m_is_ifp_detached()
211 KASSERT(inm->in6m_ifp == ifp, ("%s: bad ifp", __func__)); in in6m_is_ifp_detached()
263 struct in6_multi *inm; in im6o_match_group() local
268 inm = imf->im6f_in6m; in im6o_match_group()
269 if (inm == NULL) in im6o_match_group()
271 if ((ifp == NULL || (inm->in6m_ifp == ifp)) && in im6o_match_group()
272 IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, in im6o_match_group()
358 struct in6_multi *inm; in in6m_lookup_locked() local
363 inm = in6m_ifmultiaddr_get_inm(ifma); in in6m_lookup_locked()
364 if (inm == NULL) in in6m_lookup_locked()
366 if (IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, mcaddr)) in in6m_lookup_locked()
367 return (inm); in in6m_lookup_locked()
387 struct in6_multi *inm; in in6_getmulti() local
407 inm = in6m_lookup_locked(ifp, group); in in6_getmulti()
413 if (inm != NULL) { in in6_getmulti()
418 KASSERT(inm->in6m_refcount >= 1, in in6_getmulti()
419 ("%s: bad refcount %d", __func__, inm->in6m_refcount)); in in6_getmulti()
420 in6m_acquire_locked(inm); in in6_getmulti()
421 *pinm = inm; in in6_getmulti()
450 inm = (struct in6_multi *)ifma->ifma_protospec; in in6_getmulti()
456 KASSERT(inm != NULL, ("%s: no ifma_protospec", __func__)); in in6_getmulti()
457 if (inm->in6m_ifma != ifma || inm->in6m_ifp != ifp || in in6_getmulti()
458 !IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, group)) in in6_getmulti()
460 __func__, ifma, inm, group); in in6_getmulti()
462 in6m_acquire_locked(inm); in in6_getmulti()
463 *pinm = inm; in in6_getmulti()
477 inm = malloc(sizeof(*inm), M_IP6MADDR, M_NOWAIT | M_ZERO); in in6_getmulti()
478 if (inm == NULL) { in in6_getmulti()
484 inm->in6m_addr = *group; in in6_getmulti()
485 inm->in6m_ifp = ifp; in in6_getmulti()
486 inm->in6m_mli = MLD_IFINFO(ifp); in in6_getmulti()
487 inm->in6m_ifma = ifma; in in6_getmulti()
488 inm->in6m_refcount = 1; in in6_getmulti()
489 inm->in6m_state = MLD_NOT_MEMBER; in in6_getmulti()
490 mbufq_init(&inm->in6m_scq, MLD_MAX_STATE_CHANGES); in in6_getmulti()
492 inm->in6m_st[0].iss_fmode = MCAST_UNDEFINED; in in6_getmulti()
493 inm->in6m_st[1].iss_fmode = MCAST_UNDEFINED; in in6_getmulti()
494 RB_INIT(&inm->in6m_srcs); in in6_getmulti()
496 ifma->ifma_protospec = inm; in in6_getmulti()
497 *pinm = inm; in in6_getmulti()
512 in6m_release(struct in6_multi *inm) in in6m_release() argument
517 CTR2(KTR_MLD, "%s: refcount is %d", __func__, inm->in6m_refcount); in in6m_release()
519 MPASS(inm->in6m_refcount == 0); in in6m_release()
520 CTR2(KTR_MLD, "%s: freeing inm %p", __func__, inm); in in6m_release()
522 ifma = inm->in6m_ifma; in in6m_release()
523 ifp = inm->in6m_ifp; in in6m_release()
535 in6m_purge(inm); in in6m_release()
536 free(inm, M_IP6MADDR); in in6m_release()
541 in6m_purge(inm); in in6m_release()
542 free(inm, M_IP6MADDR); in in6m_release()
583 in6m_disconnect_locked(struct in6_multi_head *inmh, struct in6_multi *inm) in in6m_disconnect_locked() argument
593 ifp = inm->in6m_ifp; in in6m_disconnect_locked()
597 inm->in6m_ifp = NULL; in in6m_disconnect_locked()
599 ifma = inm->in6m_ifma; in in6m_disconnect_locked()
629 if (inm == imm->i6mm_maddr) { in in6m_disconnect_locked()
632 in6m_rele_locked(inmh, inm); in in6m_disconnect_locked()
642 struct in6_multi *inm, *tinm; in in6m_release_task() local
649 SLIST_FOREACH_SAFE(inm, &in6m_free_tmp, in6m_nrele, tinm) { in in6m_release_task()
651 in6m_release(inm); in in6m_release_task()
662 in6m_clear_recorded(struct in6_multi *inm) in in6m_clear_recorded() argument
668 RB_FOREACH(ims, ip6_msource_tree, &inm->in6m_srcs) { in in6m_clear_recorded()
671 --inm->in6m_st[1].iss_rec; in in6m_clear_recorded()
674 KASSERT(inm->in6m_st[1].iss_rec == 0, in in6m_clear_recorded()
675 ("%s: iss_rec %d not 0", __func__, inm->in6m_st[1].iss_rec)); in in6m_clear_recorded()
701 in6m_record_source(struct in6_multi *inm, const struct in6_addr *addr) in in6m_record_source() argument
709 ims = RB_FIND(ip6_msource_tree, &inm->in6m_srcs, &find); in in6m_record_source()
713 if (inm->in6m_nsrc == in6_mcast_maxgrpsrc) in in6m_record_source()
720 RB_INSERT(ip6_msource_tree, &inm->in6m_srcs, nims); in in6m_record_source()
721 ++inm->in6m_nsrc; in in6m_record_source()
730 ++inm->in6m_st[1].iss_rec; in in6m_record_source()
946 in6m_get_source(struct in6_multi *inm, const struct in6_addr *addr, in in6m_get_source() argument
956 ims = RB_FIND(ip6_msource_tree, &inm->in6m_srcs, &find); in in6m_get_source()
958 if (inm->in6m_nsrc == in6_mcast_maxgrpsrc) in in6m_get_source()
965 RB_INSERT(ip6_msource_tree, &inm->in6m_srcs, nims); in in6m_get_source()
966 ++inm->in6m_nsrc; in in6m_get_source()
1023 in6m_merge(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf) in in6m_merge() argument
1047 error = in6m_get_source(inm, &lims->im6s_addr, 0, &nims); in in6m_merge()
1060 (void)in6m_get_source(inm, &lims->im6s_addr, 1, &bims); in in6m_merge()
1076 --inm->in6m_st[1].iss_in; in in6m_merge()
1087 --inm->in6m_st[1].iss_ex; in in6m_merge()
1090 --inm->in6m_st[1].iss_in; in in6m_merge()
1095 inm->in6m_st[1].iss_ex++; in in6m_merge()
1098 inm->in6m_st[1].iss_in++; in in6m_merge()
1110 if (inm->in6m_st[1].iss_ex > 0) { in in6m_merge()
1112 inm->in6m_st[1].iss_fmode = MCAST_EXCLUDE; in in6m_merge()
1113 } else if (inm->in6m_st[1].iss_in > 0) { in in6m_merge()
1115 inm->in6m_st[1].iss_fmode = MCAST_INCLUDE; in in6m_merge()
1118 inm->in6m_st[1].iss_fmode = MCAST_UNDEFINED; in in6m_merge()
1126 --inm->in6m_st[1].iss_asm; in in6m_merge()
1133 inm->in6m_st[1].iss_asm++; in in6m_merge()
1136 CTR3(KTR_MLD, "%s: merged imf %p to inm %p", __func__, imf, inm); in in6m_merge()
1137 in6m_print(inm); in in6m_merge()
1142 in6m_reap(inm); in in6m_merge()
1152 in6m_commit(struct in6_multi *inm) in in6m_commit() argument
1156 CTR2(KTR_MLD, "%s: commit inm %p", __func__, inm); in in6m_commit()
1158 in6m_print(inm); in in6m_commit()
1160 RB_FOREACH(ims, ip6_msource_tree, &inm->in6m_srcs) { in in6m_commit()
1163 inm->in6m_st[0] = inm->in6m_st[1]; in in6m_commit()
1170 in6m_reap(struct in6_multi *inm) in in6m_reap() argument
1174 RB_FOREACH_SAFE(ims, ip6_msource_tree, &inm->in6m_srcs, tims) { in in6m_reap()
1180 RB_REMOVE(ip6_msource_tree, &inm->in6m_srcs, ims); in in6m_reap()
1182 inm->in6m_nsrc--; in in6m_reap()
1190 in6m_purge(struct in6_multi *inm) in in6m_purge() argument
1194 RB_FOREACH_SAFE(ims, ip6_msource_tree, &inm->in6m_srcs, tims) { in in6m_purge()
1196 RB_REMOVE(ip6_msource_tree, &inm->in6m_srcs, ims); in in6m_purge()
1198 inm->in6m_nsrc--; in in6m_purge()
1201 mbufq_drain(&inm->in6m_scq); in in6m_purge()
1239 struct in6_multi *inm; in in6_joingroup_locked() local
1265 inm = NULL; in in6_joingroup_locked()
1275 error = in6_getmulti(ifp, mcaddr, &inm); in in6_joingroup_locked()
1283 error = in6m_merge(inm, imf); in in6_joingroup_locked()
1290 error = mld_change_state(inm, delay); in in6_joingroup_locked()
1301 CTR2(KTR_MLD, "%s: dropping ref on %p", __func__, inm); in in6_joingroup_locked()
1305 if (ifma->ifma_protospec == inm) { in in6_joingroup_locked()
1310 in6m_disconnect_locked(&inmh, inm); in in6_joingroup_locked()
1311 in6m_rele_locked(&inmh, inm); in in6_joingroup_locked()
1315 *pinm = inm; in in6_joingroup_locked()
1326 in6_leavegroup(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf) in in6_leavegroup() argument
1331 error = in6_leavegroup_locked(inm, imf); in in6_leavegroup()
1350 in6_leavegroup_locked(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf) in in6_leavegroup_locked() argument
1365 inm, ip6_sprintf(ip6tbuf, &inm->in6m_addr), in in6_leavegroup_locked()
1366 (in6m_is_ifp_detached(inm) ? "null" : if_name(inm->in6m_ifp)), in in6_leavegroup_locked()
1386 ifp = inm->in6m_ifp; in in6_leavegroup_locked()
1389 error = in6m_merge(inm, imf); in in6_leavegroup_locked()
1395 error = mld_change_state(inm, 0); in in6_leavegroup_locked()
1399 CTR2(KTR_MLD, "%s: dropping ref on %p", __func__, inm); in in6_leavegroup_locked()
1404 if (inm->in6m_refcount == 1) in in6_leavegroup_locked()
1405 in6m_disconnect_locked(&inmh, inm); in in6_leavegroup_locked()
1406 in6m_rele_locked(&inmh, inm); in in6_leavegroup_locked()
1433 struct in6_multi *inm; in in6p_block_unblock_source() local
1501 inm = imf->im6f_in6m; in in6p_block_unblock_source()
1553 error = in6m_merge(inm, imf); in in6p_block_unblock_source()
1558 error = mld_change_state(inm, 0); in in6p_block_unblock_source()
1624 struct in6_multi *inm; in inp_gcmoptions() local
1631 if ((inm = imf->im6f_in6m) != NULL) { in inp_gcmoptions()
1632 if ((ifp = inm->in6m_ifp) != NULL) { in inp_gcmoptions()
1634 (void)in6_leavegroup(inm, imf); in inp_gcmoptions()
1637 (void)in6_leavegroup(inm, imf); in inp_gcmoptions()
1904 struct in6_multi *inm; in in6p_join_group() local
2024 inm = NULL; in in6p_join_group()
2032 inm = imf->im6f_in6m; in in6p_join_group()
2156 error = in6m_merge(inm, imf); in in6p_join_group()
2166 error = mld_change_state(inm, 0); in in6p_join_group()
2213 struct in6_multi *inm; in in6p_leave_group() local
2355 inm = imf->im6f_in6m; in in6p_leave_group()
2377 (void)in6_leavegroup_locked(inm, imf); in in6p_leave_group()
2406 error = in6m_merge(inm, imf); in in6p_leave_group()
2417 error = mld_change_state(inm, 0); in in6p_leave_group()
2496 struct in6_multi *inm; in in6p_set_source_filters() local
2538 inm = imf->im6f_in6m; in in6p_set_source_filters()
2631 error = in6m_merge(inm, imf); in in6p_set_source_filters()
2636 error = mld_change_state(inm, 0); in in6p_set_source_filters()
2778 struct in6_multi *inm; in sysctl_ip6_mcast_filters() local
2829 inm = in6m_ifmultiaddr_get_inm(ifma); in sysctl_ip6_mcast_filters()
2830 if (inm == NULL) in sysctl_ip6_mcast_filters()
2832 if (!IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, &mcaddr)) in sysctl_ip6_mcast_filters()
2834 fmode = inm->in6m_st[1].iss_fmode; in sysctl_ip6_mcast_filters()
2838 RB_FOREACH(ims, ip6_msource_tree, &inm->in6m_srcs) { in sysctl_ip6_mcast_filters()
2843 if (fmode != im6s_get_mode(inm, ims, 1)) { in sysctl_ip6_mcast_filters()
2903 in6m_print(const struct in6_multi *inm) in in6m_print() argument
2911 printf("%s: --- begin in6m %p ---\n", __func__, inm); in in6m_print()
2913 ip6_sprintf(ip6tbuf, &inm->in6m_addr), in in6m_print()
2914 inm->in6m_ifp, in in6m_print()
2915 if_name(inm->in6m_ifp), in in6m_print()
2916 inm->in6m_ifma); in in6m_print()
2918 inm->in6m_timer, in in6m_print()
2919 in6m_state_str(inm->in6m_state), in in6m_print()
2920 inm->in6m_refcount, in in6m_print()
2921 mbufq_len(&inm->in6m_scq)); in in6m_print()
2923 inm->in6m_mli, in in6m_print()
2924 inm->in6m_nsrc, in in6m_print()
2925 inm->in6m_sctimer, in in6m_print()
2926 inm->in6m_scrv); in in6m_print()
2929 in6m_mode_str(inm->in6m_st[t].iss_fmode), in in6m_print()
2930 inm->in6m_st[t].iss_asm, in in6m_print()
2931 inm->in6m_st[t].iss_ex, in in6m_print()
2932 inm->in6m_st[t].iss_in, in in6m_print()
2933 inm->in6m_st[t].iss_rec); in in6m_print()
2935 printf("%s: --- end in6m %p ---\n", __func__, inm); in in6m_print()
2941 in6m_print(const struct in6_multi *inm) in in6m_print() argument