Lines Matching refs:inm

131 static int      inm_get_source(struct in_multi *inm, const in_addr_t haddr,
177 struct in_multi inm; /* in_multi */ member
243 inm_is_ifp_detached(const struct in_multi *inm) in inm_is_ifp_detached() argument
245 VERIFY(inm->inm_ifma != NULL); in inm_is_ifp_detached()
246 VERIFY(inm->inm_ifp == inm->inm_ifma->ifma_ifp); in inm_is_ifp_detached()
248 return !ifnet_is_attached(inm->inm_ifp, 0); in inm_is_ifp_detached()
532 struct in_multi *inm; in in_getmulti() local
536 IN_LOOKUP_MULTI(group, ifp, inm); in in_getmulti()
537 if (inm != NULL) { in in_getmulti()
538 INM_LOCK(inm); in in_getmulti()
539 VERIFY(inm->inm_reqcnt >= 1); in in_getmulti()
540 inm->inm_reqcnt++; in in_getmulti()
541 VERIFY(inm->inm_reqcnt != 0); in in_getmulti()
542 *pinm = inm; in in_getmulti()
543 INM_UNLOCK(inm); in in_getmulti()
572 if ((inm = ifma->ifma_protospec) != NULL) { in in_getmulti()
575 INM_ADDREF(inm); /* for caller */ in in_getmulti()
577 INM_LOCK(inm); in in_getmulti()
578 VERIFY(inm->inm_ifma == ifma); in in_getmulti()
579 VERIFY(inm->inm_ifp == ifp); in in_getmulti()
580 VERIFY(in_hosteq(inm->inm_addr, *group)); in in_getmulti()
581 if (inm->inm_debug & IFD_ATTACHED) { in in_getmulti()
582 VERIFY(inm->inm_reqcnt >= 1); in in_getmulti()
583 inm->inm_reqcnt++; in in_getmulti()
584 VERIFY(inm->inm_reqcnt != 0); in in_getmulti()
585 *pinm = inm; in in_getmulti()
586 INM_UNLOCK(inm); in in_getmulti()
603 in_multi_attach(inm); in in_getmulti()
604 VERIFY((inm->inm_debug & in in_getmulti()
606 *pinm = inm; in in_getmulti()
607 INM_UNLOCK(inm); in in_getmulti()
621 inm = in_multi_alloc(Z_WAITOK); in in_getmulti()
623 INM_LOCK(inm); in in_getmulti()
624 inm->inm_addr = *group; in in_getmulti()
625 inm->inm_ifp = ifp; in in_getmulti()
626 inm->inm_igi = IGMP_IFINFO(ifp); in in_getmulti()
627 VERIFY(inm->inm_igi != NULL); in in_getmulti()
628 IGI_ADDREF(inm->inm_igi); in in_getmulti()
629 inm->inm_ifma = ifma; /* keep refcount from if_addmulti() */ in in_getmulti()
630 inm->inm_state = IGMP_NOT_MEMBER; in in_getmulti()
634 inm->inm_scq.ifq_maxlen = IGMP_MAX_STATE_CHANGES; in in_getmulti()
635 inm->inm_st[0].iss_fmode = MCAST_UNDEFINED; in in_getmulti()
636 inm->inm_st[1].iss_fmode = MCAST_UNDEFINED; in in_getmulti()
637 RB_INIT(&inm->inm_srcs); in in_getmulti()
638 *pinm = inm; in in_getmulti()
639 in_multi_attach(inm); in in_getmulti()
640 VERIFY((inm->inm_debug & (IFD_ATTACHED | IFD_TRASHED)) == IFD_ATTACHED); in in_getmulti()
641 INM_ADDREF_LOCKED(inm); /* for caller */ in in_getmulti()
642 INM_UNLOCK(inm); in in_getmulti()
646 ifma->ifma_protospec = inm; in in_getmulti()
659 inm_clear_recorded(struct in_multi *inm) in inm_clear_recorded() argument
663 INM_LOCK_ASSERT_HELD(inm); in inm_clear_recorded()
665 RB_FOREACH(ims, ip_msource_tree, &inm->inm_srcs) { in inm_clear_recorded()
668 --inm->inm_st[1].iss_rec; in inm_clear_recorded()
671 VERIFY(inm->inm_st[1].iss_rec == 0); in inm_clear_recorded()
693 inm_record_source(struct in_multi *inm, const in_addr_t naddr) in inm_record_source() argument
698 INM_LOCK_ASSERT_HELD(inm); in inm_record_source()
701 ims = RB_FIND(ip_msource_tree, &inm->inm_srcs, &find); in inm_record_source()
706 if (inm->inm_nsrc == in_mcast_maxgrpsrc) { in inm_record_source()
711 RB_INSERT(ip_msource_tree, &inm->inm_srcs, nims); in inm_record_source()
712 ++inm->inm_nsrc; in inm_record_source()
721 ++inm->inm_st[1].iss_rec; in inm_record_source()
951 inm_get_source(struct in_multi *inm, const in_addr_t haddr, in inm_get_source() argument
960 INM_LOCK_ASSERT_HELD(inm); in inm_get_source()
963 ims = RB_FIND(ip_msource_tree, &inm->inm_srcs, &find); in inm_get_source()
965 if (inm->inm_nsrc == in_mcast_maxgrpsrc) { in inm_get_source()
970 RB_INSERT(ip_msource_tree, &inm->inm_srcs, nims); in inm_get_source()
971 ++inm->inm_nsrc; in inm_get_source()
994 ims_get_mode(const struct in_multi *inm, const struct ip_msource *ims, in ims_get_mode() argument
997 INM_LOCK_ASSERT_HELD(__DECONST(struct in_multi *, inm)); in ims_get_mode()
1000 if (inm->inm_st[t].iss_ex > 0 && in ims_get_mode()
1001 inm->inm_st[t].iss_ex == ims->ims_st[t].ex) { in ims_get_mode()
1064 inm_merge(struct in_multi *inm, /*const*/ struct in_mfilter *imf) in inm_merge() argument
1071 INM_LOCK_ASSERT_HELD(inm); in inm_merge()
1095 error = inm_get_source(inm, lims->ims_haddr, 0, &nims); in inm_merge()
1110 (void) inm_get_source(inm, lims->ims_haddr, 1, &bims); in inm_merge()
1127 --inm->inm_st[1].iss_in; in inm_merge()
1138 --inm->inm_st[1].iss_ex; in inm_merge()
1141 --inm->inm_st[1].iss_in; in inm_merge()
1146 inm->inm_st[1].iss_ex++; in inm_merge()
1149 inm->inm_st[1].iss_in++; in inm_merge()
1161 if (inm->inm_st[1].iss_ex > 0) { in inm_merge()
1163 inm->inm_st[1].iss_fmode = MCAST_EXCLUDE; in inm_merge()
1164 } else if (inm->inm_st[1].iss_in > 0) { in inm_merge()
1166 inm->inm_st[1].iss_fmode = MCAST_INCLUDE; in inm_merge()
1169 inm->inm_st[1].iss_fmode = MCAST_UNDEFINED; in inm_merge()
1177 --inm->inm_st[1].iss_asm; in inm_merge()
1184 inm->inm_st[1].iss_asm++; in inm_merge()
1189 (uint64_t)VM_KERNEL_ADDRPERM(inm))); in inm_merge()
1190 inm_print(inm); in inm_merge()
1195 inm_reap(inm); in inm_merge()
1205 inm_commit(struct in_multi *inm) in inm_commit() argument
1209 INM_LOCK_ASSERT_HELD(inm); in inm_commit()
1212 (uint64_t)VM_KERNEL_ADDRPERM(inm))); in inm_commit()
1214 inm_print(inm); in inm_commit()
1216 RB_FOREACH(ims, ip_msource_tree, &inm->inm_srcs) { in inm_commit()
1219 inm->inm_st[0] = inm->inm_st[1]; in inm_commit()
1226 inm_reap(struct in_multi *inm) in inm_reap() argument
1230 INM_LOCK_ASSERT_HELD(inm); in inm_reap()
1232 RB_FOREACH_SAFE(ims, ip_msource_tree, &inm->inm_srcs, tims) { in inm_reap()
1240 RB_REMOVE(ip_msource_tree, &inm->inm_srcs, ims); in inm_reap()
1242 inm->inm_nsrc--; in inm_reap()
1250 inm_purge(struct in_multi *inm) in inm_purge() argument
1254 INM_LOCK_ASSERT_HELD(inm); in inm_purge()
1256 RB_FOREACH_SAFE(ims, ip_msource_tree, &inm->inm_srcs, tims) { in inm_purge()
1259 RB_REMOVE(ip_msource_tree, &inm->inm_srcs, ims); in inm_purge()
1261 inm->inm_nsrc--; in inm_purge()
1279 struct in_multi *inm = NULL; in in_joingroup() local
1298 error = in_getmulti(ifp, gina, &inm); in in_joingroup()
1306 INM_LOCK(inm); in in_joingroup()
1307 error = inm_merge(inm, imf); in in_joingroup()
1314 error = igmp_change_state(inm, &itp); in in_joingroup()
1324 (uint64_t)VM_KERNEL_ADDRPERM(inm))); in in_joingroup()
1325 INM_UNLOCK(inm); in in_joingroup()
1326 INM_REMREF(inm); in in_joingroup()
1328 INM_UNLOCK(inm); in in_joingroup()
1329 *pinm = inm; /* keep refcount from in_getmulti() */ in in_joingroup()
1348 in_leavegroup(struct in_multi *inm, /*const*/ struct in_mfilter *imf) in in_leavegroup() argument
1357 INM_LOCK_ASSERT_NOTHELD(inm); in in_leavegroup()
1360 INM_LOCK(inm); in in_leavegroup()
1362 IGMP_INET_PRINTF(inm->inm_addr, in in_leavegroup()
1364 (uint64_t)VM_KERNEL_ADDRPERM(inm), _igmp_inet_buf, in in_leavegroup()
1365 (inm_is_ifp_detached(inm) ? "null" : inm->inm_ifp->if_name), in in_leavegroup()
1366 inm->inm_ifp->if_unit, (uint64_t)VM_KERNEL_ADDRPERM(imf))); in in_leavegroup()
1386 error = inm_merge(inm, imf); in in_leavegroup()
1390 error = igmp_change_state(inm, &itp); in in_leavegroup()
1396 lastref = in_multi_detach(inm); in in_leavegroup()
1397 VERIFY(!lastref || (!(inm->inm_debug & IFD_ATTACHED) && in in_leavegroup()
1398 inm->inm_reqcnt == 0)); in in_leavegroup()
1399 INM_UNLOCK(inm); in in_leavegroup()
1403 INM_REMREF(inm); /* for in_multihead list */ in in_leavegroup()
1436 in_delmulti(struct in_multi *inm) in in_delmulti() argument
1438 (void) in_leavegroup(inm, NULL); in in_delmulti()
1459 struct in_multi *inm; in inp_block_unblock_source() local
1574 inm = imo->imo_membership[idx]; in inp_block_unblock_source()
1623 INM_LOCK(inm); in inp_block_unblock_source()
1625 error = inm_merge(inm, imf); in inp_block_unblock_source()
1628 INM_UNLOCK(inm); in inp_block_unblock_source()
1633 error = igmp_change_state(inm, &itp); in inp_block_unblock_source()
1634 INM_UNLOCK(inm); in inp_block_unblock_source()
2088 struct in_multi *inm = NULL; in inp_join_group() local
2230 inm = imo->imo_membership[idx]; in inp_join_group()
2345 VERIFY(inm == NULL); in inp_join_group()
2346 error = in_joingroup(ifp, &gsa->sin_addr, imf, &inm); in inp_join_group()
2348 VERIFY(inm != NULL || error != 0); in inp_join_group()
2352 imo->imo_membership[idx] = inm; /* from in_joingroup() */ in inp_join_group()
2355 INM_LOCK(inm); in inp_join_group()
2356 error = inm_merge(inm, imf); in inp_join_group()
2360 INM_UNLOCK(inm); in inp_join_group()
2364 error = igmp_change_state(inm, &itp); in inp_join_group()
2365 INM_UNLOCK(inm); in inp_join_group()
2387 VERIFY(inm == NULL); in inp_join_group()
2418 struct in_multi *inm = NULL; in inp_leave_group() local
2544 inm = imo->imo_membership[idx]; in inp_leave_group()
2594 (void) in_leavegroup(inm, imf); in inp_leave_group()
2597 INM_LOCK(inm); in inp_leave_group()
2598 error = inm_merge(inm, imf); in inp_leave_group()
2602 INM_UNLOCK(inm); in inp_leave_group()
2607 error = igmp_change_state(inm, &itp); in inp_leave_group()
2611 INM_UNLOCK(inm); in inp_leave_group()
2625 VERIFY(inm == imo->imo_membership[idx]); in inp_leave_group()
2628 INM_REMREF(inm); in inp_leave_group()
2751 struct in_multi *inm; in inp_set_source_filters() local
2833 inm = imo->imo_membership[idx]; in inp_set_source_filters()
2920 INM_LOCK(inm); in inp_set_source_filters()
2922 error = inm_merge(inm, imf); in inp_set_source_filters()
2925 INM_UNLOCK(inm); in inp_set_source_filters()
2930 error = igmp_change_state(inm, &itp); in inp_set_source_filters()
2931 INM_UNLOCK(inm); in inp_set_source_filters()
3175 struct in_multi *inm; variable
3220 IN_FIRST_MULTI(step, inm);
3221 while (inm != NULL) {
3222 INM_LOCK(inm);
3223 if (inm->inm_ifp != ifp) {
3227 if (!in_hosteq(inm->inm_addr, group)) {
3231 fmode = inm->inm_st[1].iss_fmode;
3234 INM_UNLOCK(inm);
3237 RB_FOREACH(ims, ip_msource_tree, &inm->inm_srcs) {
3247 if (fmode != ims_get_mode(inm, ims, 1)) {
3259 INM_UNLOCK(inm);
3260 IN_NEXT_MULTI(step, inm);
3318 struct in_multi *inm; in in_multi_alloc() local
3320 inm = zalloc_flags(inm_zone, how | Z_ZERO); in in_multi_alloc()
3321 if (inm != NULL) { in in_multi_alloc()
3322 lck_mtx_init(&inm->inm_lock, &in_multihead_lock_grp, in in_multi_alloc()
3324 inm->inm_debug |= IFD_ALLOC; in in_multi_alloc()
3326 inm->inm_debug |= IFD_DEBUG; in in_multi_alloc()
3327 inm->inm_trace = inm_trace; in in_multi_alloc()
3330 return inm; in in_multi_alloc()
3334 in_multi_free(struct in_multi *inm) in in_multi_free() argument
3336 INM_LOCK(inm); in in_multi_free()
3337 if (inm->inm_debug & IFD_ATTACHED) { in in_multi_free()
3338 panic("%s: attached inm=%p is being freed", __func__, inm); in in_multi_free()
3340 } else if (inm->inm_ifma != NULL) { in in_multi_free()
3341 panic("%s: ifma not NULL for inm=%p", __func__, inm); in in_multi_free()
3343 } else if (!(inm->inm_debug & IFD_ALLOC)) { in in_multi_free()
3344 panic("%s: inm %p cannot be freed", __func__, inm); in in_multi_free()
3346 } else if (inm->inm_refcount != 0) { in in_multi_free()
3347 panic("%s: non-zero refcount inm=%p", __func__, inm); in in_multi_free()
3349 } else if (inm->inm_reqcnt != 0) { in in_multi_free()
3350 panic("%s: non-zero reqcnt inm=%p", __func__, inm); in in_multi_free()
3355 IF_DRAIN(&inm->inm_scq); in in_multi_free()
3357 inm->inm_debug &= ~IFD_ALLOC; in in_multi_free()
3358 if ((inm->inm_debug & (IFD_DEBUG | IFD_TRASHED)) == in in_multi_free()
3361 TAILQ_REMOVE(&inm_trash_head, (struct in_multi_dbg *)inm, in in_multi_free()
3364 inm->inm_debug &= ~IFD_TRASHED; in in_multi_free()
3366 INM_UNLOCK(inm); in in_multi_free()
3368 lck_mtx_destroy(&inm->inm_lock, &in_multihead_lock_grp); in in_multi_free()
3369 zfree(inm_zone, inm); in in_multi_free()
3373 in_multi_attach(struct in_multi *inm) in in_multi_attach() argument
3376 INM_LOCK_ASSERT_HELD(inm); in in_multi_attach()
3378 if (inm->inm_debug & IFD_ATTACHED) { in in_multi_attach()
3380 __func__, inm); in in_multi_attach()
3382 } else if (inm->inm_debug & IFD_TRASHED) { in in_multi_attach()
3384 __func__, inm); in in_multi_attach()
3388 inm->inm_reqcnt++; in in_multi_attach()
3389 VERIFY(inm->inm_reqcnt == 1); in in_multi_attach()
3390 INM_ADDREF_LOCKED(inm); in in_multi_attach()
3391 inm->inm_debug |= IFD_ATTACHED; in in_multi_attach()
3396 if ((inm->inm_debug & (IFD_DEBUG | IFD_TRASHED)) == in in_multi_attach()
3399 INM_CONVERT_LOCK(inm); in in_multi_attach()
3401 TAILQ_REMOVE(&inm_trash_head, (struct in_multi_dbg *)inm, in in_multi_attach()
3404 inm->inm_debug &= ~IFD_TRASHED; in in_multi_attach()
3407 LIST_INSERT_HEAD(&in_multihead, inm, inm_link); in in_multi_attach()
3411 in_multi_detach(struct in_multi *inm) in in_multi_detach() argument
3414 INM_LOCK_ASSERT_HELD(inm); in in_multi_detach()
3416 if (inm->inm_reqcnt == 0) { in in_multi_detach()
3417 panic("%s: inm=%p negative reqcnt", __func__, inm); in in_multi_detach()
3421 --inm->inm_reqcnt; in in_multi_detach()
3422 if (inm->inm_reqcnt > 0) { in in_multi_detach()
3426 if (!(inm->inm_debug & IFD_ATTACHED)) { in in_multi_detach()
3428 __func__, inm); in in_multi_detach()
3430 } else if (inm->inm_debug & IFD_TRASHED) { in in_multi_detach()
3431 panic("%s: inm %p is already in trash list", __func__, inm); in in_multi_detach()
3438 inm->inm_debug &= ~IFD_ATTACHED; in in_multi_detach()
3439 LIST_REMOVE(inm, inm_link); in in_multi_detach()
3441 if (inm->inm_debug & IFD_DEBUG) { in in_multi_detach()
3443 INM_CONVERT_LOCK(inm); in in_multi_detach()
3446 (struct in_multi_dbg *)inm, inm_trash_link); in in_multi_detach()
3448 inm->inm_debug |= IFD_TRASHED; in in_multi_detach()
3455 inm_addref(struct in_multi *inm, int locked) in inm_addref() argument
3458 INM_LOCK_SPIN(inm); in inm_addref()
3460 INM_LOCK_ASSERT_HELD(inm); in inm_addref()
3463 if (++inm->inm_refcount == 0) { in inm_addref()
3464 panic("%s: inm=%p wraparound refcnt", __func__, inm); in inm_addref()
3466 } else if (inm->inm_trace != NULL) { in inm_addref()
3467 (*inm->inm_trace)(inm, TRUE); in inm_addref()
3470 INM_UNLOCK(inm); in inm_addref()
3475 inm_remref(struct in_multi *inm, int locked) in inm_remref() argument
3481 INM_LOCK_SPIN(inm); in inm_remref()
3483 INM_LOCK_ASSERT_HELD(inm); in inm_remref()
3486 if (inm->inm_refcount == 0 || (inm->inm_refcount == 1 && locked)) { in inm_remref()
3487 panic("%s: inm=%p negative/missing refcnt", __func__, inm); in inm_remref()
3489 } else if (inm->inm_trace != NULL) { in inm_remref()
3490 (*inm->inm_trace)(inm, FALSE); in inm_remref()
3493 --inm->inm_refcount; in inm_remref()
3494 if (inm->inm_refcount > 0) { in inm_remref()
3496 INM_UNLOCK(inm); in inm_remref()
3512 ++inm->inm_refcount; in inm_remref()
3513 INM_UNLOCK(inm); in inm_remref()
3515 INM_LOCK_SPIN(inm); in inm_remref()
3516 --inm->inm_refcount; in inm_remref()
3517 if (inm->inm_refcount > 0) { in inm_remref()
3519 INM_UNLOCK(inm); in inm_remref()
3523 INM_LOCK(inm); in inm_remref()
3527 inm_purge(inm); in inm_remref()
3528 ifma = inm->inm_ifma; in inm_remref()
3529 inm->inm_ifma = NULL; in inm_remref()
3530 inm->inm_ifp = NULL; in inm_remref()
3531 igi = inm->inm_igi; in inm_remref()
3532 inm->inm_igi = NULL; in inm_remref()
3533 INM_UNLOCK(inm); in inm_remref()
3539 in_multi_free(inm); in inm_remref()
3550 inm_trace(struct in_multi *inm, int refhold) in inm_trace() argument
3552 struct in_multi_dbg *inm_dbg = (struct in_multi_dbg *)inm; in inm_trace()
3557 if (!(inm->inm_debug & IFD_DEBUG)) { in inm_trace()
3558 panic("%s: inm %p has no debug structure", __func__, inm); in inm_trace()
3663 inm_print(const struct in_multi *inm) in inm_print() argument
3668 INM_LOCK_ASSERT_HELD(__DECONST(struct in_multi *, inm)); in inm_print()
3674 inet_ntop(AF_INET, &inm->inm_addr, buf, sizeof(buf)); in inm_print()
3676 (uint64_t)VM_KERNEL_ADDRPERM(inm)); in inm_print()
3679 (uint64_t)VM_KERNEL_ADDRPERM(inm->inm_ifp), in inm_print()
3680 if_name(inm->inm_ifp), in inm_print()
3681 (uint64_t)VM_KERNEL_ADDRPERM(inm->inm_ifma)); in inm_print()
3683 inm->inm_timer, in inm_print()
3684 inm_state_str(inm->inm_state), in inm_print()
3685 inm->inm_refcount, in inm_print()
3686 inm->inm_scq.ifq_len); in inm_print()
3688 (uint64_t)VM_KERNEL_ADDRPERM(inm->inm_igi), in inm_print()
3689 inm->inm_nsrc, in inm_print()
3690 inm->inm_sctimer, in inm_print()
3691 inm->inm_scrv); in inm_print()
3694 inm_mode_str(inm->inm_st[t].iss_fmode), in inm_print()
3695 inm->inm_st[t].iss_asm, in inm_print()
3696 inm->inm_st[t].iss_ex, in inm_print()
3697 inm->inm_st[t].iss_in, in inm_print()
3698 inm->inm_st[t].iss_rec); in inm_print()
3701 (uint64_t)VM_KERNEL_ADDRPERM(inm)); in inm_print()
3707 inm_print(__unused const struct in_multi *inm) in inm_print() argument