Lines Matching refs:mli
385 struct mld_ifinfo *mli; variable
417 LIST_FOREACH(mli, &mli_head, mli_link) {
418 MLI_LOCK(mli);
419 if (ifp != mli->mli_ifp) {
420 MLI_UNLOCK(mli);
424 mli_u.mli_ifindex = mli->mli_ifp->if_index;
425 mli_u.mli_version = mli->mli_version;
426 mli_u.mli_v1_timer = mli->mli_v1_timer;
427 mli_u.mli_v2_timer = mli->mli_v2_timer;
428 mli_u.mli_flags = mli->mli_flags;
429 mli_u.mli_rv = mli->mli_rv;
430 mli_u.mli_qi = mli->mli_qi;
431 mli_u.mli_qri = mli->mli_qri;
432 mli_u.mli_uri = mli->mli_uri;
433 MLI_UNLOCK(mli);
450 struct mld_ifinfo *mli; variable
477 LIST_FOREACH(mli, &mli_head, mli_link) {
478 MLI_LOCK(mli);
479 if (mld_set_version(mli, MLD_VERSION_1) > 0) {
482 MLI_UNLOCK(mli);
505 mld_dispatch_queue_locked(struct mld_ifinfo *mli, struct ifqueue *ifq, int limit) in mld_dispatch_queue_locked() argument
511 if (mli != NULL) { in mld_dispatch_queue_locked()
512 MLI_LOCK_ASSERT_HELD(mli); in mld_dispatch_queue_locked()
524 if (mli != NULL) { in mld_dispatch_queue_locked()
525 MLI_UNLOCK(mli); in mld_dispatch_queue_locked()
532 if (mli != NULL) { in mld_dispatch_queue_locked()
533 MLI_LOCK(mli); in mld_dispatch_queue_locked()
541 if (mli != NULL) { in mld_dispatch_queue_locked()
542 MLI_LOCK_ASSERT_HELD(mli); in mld_dispatch_queue_locked()
584 struct mld_ifinfo *mli; in mld_domifattach() local
589 mli = mli_alloc(how); in mld_domifattach()
590 if (mli == NULL) { in mld_domifattach()
596 MLI_LOCK(mli); in mld_domifattach()
597 mli_initvar(mli, ifp, 0); in mld_domifattach()
598 mli->mli_debug |= IFD_ATTACHED; in mld_domifattach()
599 MLI_ADDREF_LOCKED(mli); /* hold a reference for mli_head */ in mld_domifattach()
600 MLI_ADDREF_LOCKED(mli); /* hold a reference for caller */ in mld_domifattach()
601 MLI_UNLOCK(mli); in mld_domifattach()
603 mld6_initsilent(ifp, mli); in mld_domifattach()
606 LIST_INSERT_HEAD(&mli_head, mli, mli_link); in mld_domifattach()
614 return mli; in mld_domifattach()
622 mld_domifreattach(struct mld_ifinfo *mli) in mld_domifreattach() argument
628 MLI_LOCK(mli); in mld_domifreattach()
629 VERIFY(!(mli->mli_debug & IFD_ATTACHED)); in mld_domifreattach()
630 ifp = mli->mli_ifp; in mld_domifreattach()
632 mli_initvar(mli, ifp, 1); in mld_domifreattach()
633 mli->mli_debug |= IFD_ATTACHED; in mld_domifreattach()
634 MLI_ADDREF_LOCKED(mli); /* hold a reference for mli_head */ in mld_domifreattach()
635 MLI_UNLOCK(mli); in mld_domifreattach()
637 mld6_initsilent(ifp, mli); in mld_domifreattach()
640 LIST_INSERT_HEAD(&mli_head, mli, mli_link); in mld_domifreattach()
679 struct mld_ifinfo *mli, *tmli; in mli_delete() local
683 LIST_FOREACH_SAFE(mli, &mli_head, mli_link, tmli) { in mli_delete()
684 MLI_LOCK(mli); in mli_delete()
685 if (mli->mli_ifp == ifp) { in mli_delete()
689 IF_DRAIN(&mli->mli_gq); in mli_delete()
690 IF_DRAIN(&mli->mli_v1q); in mli_delete()
691 mld_flush_relq(mli, in6m_dthead); in mli_delete()
692 VERIFY(SLIST_EMPTY(&mli->mli_relinmhead)); in mli_delete()
693 mli->mli_debug &= ~IFD_ATTACHED; in mli_delete()
694 MLI_UNLOCK(mli); in mli_delete()
696 LIST_REMOVE(mli, mli_link); in mli_delete()
697 MLI_REMREF(mli); /* release mli_head reference */ in mli_delete()
701 MLI_UNLOCK(mli); in mli_delete()
708 mld6_initsilent(struct ifnet *ifp, struct mld_ifinfo *mli) in mld6_initsilent() argument
712 MLI_LOCK_ASSERT_NOTHELD(mli); in mld6_initsilent()
713 MLI_LOCK(mli); in mld6_initsilent()
716 mli->mli_flags |= MLIF_SILENT; in mld6_initsilent()
718 mli->mli_flags &= ~MLIF_SILENT; in mld6_initsilent()
720 MLI_UNLOCK(mli); in mld6_initsilent()
724 mli_initvar(struct mld_ifinfo *mli, struct ifnet *ifp, int reattach) in mli_initvar() argument
726 MLI_LOCK_ASSERT_HELD(mli); in mli_initvar()
728 mli->mli_ifp = ifp; in mli_initvar()
730 mli->mli_version = MLD_VERSION_2; in mli_initvar()
732 mli->mli_version = MLD_VERSION_1; in mli_initvar()
734 mli->mli_flags = 0; in mli_initvar()
735 mli->mli_rv = MLD_RV_INIT; in mli_initvar()
736 mli->mli_qi = MLD_QI_INIT; in mli_initvar()
737 mli->mli_qri = MLD_QRI_INIT; in mli_initvar()
738 mli->mli_uri = MLD_URI_INIT; in mli_initvar()
741 mli->mli_flags |= MLIF_USEALLOW; in mli_initvar()
744 SLIST_INIT(&mli->mli_relinmhead); in mli_initvar()
750 mli->mli_gq.ifq_maxlen = MLD_MAX_RESPONSE_PACKETS; in mli_initvar()
751 mli->mli_v1q.ifq_maxlen = MLD_MAX_RESPONSE_PACKETS; in mli_initvar()
757 struct mld_ifinfo *mli = zalloc_flags(mli_zone, how | Z_ZERO); in mli_alloc() local
758 if (mli != NULL) { in mli_alloc()
759 lck_mtx_init(&mli->mli_lock, &mld_mtx_grp, &mld_mtx_attr); in mli_alloc()
760 mli->mli_debug |= IFD_ALLOC; in mli_alloc()
762 return mli; in mli_alloc()
766 mli_free(struct mld_ifinfo *mli) in mli_free() argument
768 MLI_LOCK(mli); in mli_free()
769 if (mli->mli_debug & IFD_ATTACHED) { in mli_free()
770 panic("%s: attached mli=%p is being freed", __func__, mli); in mli_free()
772 } else if (mli->mli_ifp != NULL) { in mli_free()
773 panic("%s: ifp not NULL for mli=%p", __func__, mli); in mli_free()
775 } else if (!(mli->mli_debug & IFD_ALLOC)) { in mli_free()
776 panic("%s: mli %p cannot be freed", __func__, mli); in mli_free()
778 } else if (mli->mli_refcnt != 0) { in mli_free()
779 panic("%s: non-zero refcnt mli=%p", __func__, mli); in mli_free()
782 mli->mli_debug &= ~IFD_ALLOC; in mli_free()
783 MLI_UNLOCK(mli); in mli_free()
785 lck_mtx_destroy(&mli->mli_lock, &mld_mtx_grp); in mli_free()
786 zfree(mli_zone, mli); in mli_free()
790 mli_addref(struct mld_ifinfo *mli, int locked) in mli_addref() argument
793 MLI_LOCK_SPIN(mli); in mli_addref()
795 MLI_LOCK_ASSERT_HELD(mli); in mli_addref()
798 if (++mli->mli_refcnt == 0) { in mli_addref()
799 panic("%s: mli=%p wraparound refcnt", __func__, mli); in mli_addref()
803 MLI_UNLOCK(mli); in mli_addref()
808 mli_remref(struct mld_ifinfo *mli) in mli_remref() argument
813 MLI_LOCK_SPIN(mli); in mli_remref()
815 if (mli->mli_refcnt == 0) { in mli_remref()
816 panic("%s: mli=%p negative refcnt", __func__, mli); in mli_remref()
820 --mli->mli_refcnt; in mli_remref()
821 if (mli->mli_refcnt > 0) { in mli_remref()
822 MLI_UNLOCK(mli); in mli_remref()
826 ifp = mli->mli_ifp; in mli_remref()
827 mli->mli_ifp = NULL; in mli_remref()
828 IF_DRAIN(&mli->mli_gq); in mli_remref()
829 IF_DRAIN(&mli->mli_v1q); in mli_remref()
831 mld_flush_relq(mli, (struct mld_in6m_relhead *)&in6m_dthead); in mli_remref()
832 VERIFY(SLIST_EMPTY(&mli->mli_relinmhead)); in mli_remref()
833 MLI_UNLOCK(mli); in mli_remref()
841 mli_free(mli); in mli_remref()
855 struct mld_ifinfo *mli; in mld_v1_input_query() local
912 mli = MLD_IFINFO(ifp); in mld_v1_input_query()
913 VERIFY(mli != NULL); in mld_v1_input_query()
915 MLI_LOCK(mli); in mld_v1_input_query()
916 mtp.qpt = mld_set_version(mli, MLD_VERSION_1); in mld_v1_input_query()
917 MLI_UNLOCK(mli); in mld_v1_input_query()
1041 struct mld_ifinfo *mli; in mld_v2_input_query() local
1133 mli = MLD_IFINFO(ifp); in mld_v2_input_query()
1134 VERIFY(mli != NULL); in mld_v2_input_query()
1136 MLI_LOCK(mli); in mld_v2_input_query()
1142 if (mli->mli_version != MLD_VERSION_2) { in mld_v2_input_query()
1143 MLI_UNLOCK(mli); in mld_v2_input_query()
1147 mtp.qpt = mld_set_version(mli, MLD_VERSION_2); in mld_v2_input_query()
1148 mli->mli_rv = qrv; in mld_v2_input_query()
1149 mli->mli_qi = qqi; in mld_v2_input_query()
1150 mli->mli_qri = MAX(timer, MLD_QRI_MIN); in mld_v2_input_query()
1152 MLD_PRINTF(("%s: qrv %d qi %d qri %d\n", __func__, mli->mli_rv, in mld_v2_input_query()
1153 mli->mli_qi, mli->mli_qri)); in mld_v2_input_query()
1169 if (mli->mli_v2_timer == 0 || mli->mli_v2_timer >= timer) { in mld_v2_input_query()
1170 mtp.it = mli->mli_v2_timer = MLD_RANDOM_DELAY(timer); in mld_v2_input_query()
1172 MLI_UNLOCK(mli); in mld_v2_input_query()
1174 MLI_UNLOCK(mli); in mld_v2_input_query()
1210 MLI_LOCK(mli); in mld_v2_input_query()
1211 mtp.it = mli->mli_v2_timer; in mld_v2_input_query()
1212 MLI_UNLOCK(mli); in mld_v2_input_query()
1446 struct mld_ifinfo *mli; in mld_v1_input_report() local
1449 mli = inm->in6m_mli; in mld_v1_input_report()
1450 VERIFY(mli != NULL); in mld_v1_input_report()
1452 MLI_LOCK(mli); in mld_v1_input_report()
1457 if (mli->mli_version == MLD_VERSION_2) { in mld_v1_input_report()
1458 MLI_UNLOCK(mli); in mld_v1_input_report()
1463 MLI_UNLOCK(mli); in mld_v1_input_report()
1627 struct mld_ifinfo *mli; in mld_timeout() local
1663 LIST_FOREACH(mli, &mli_head, mli_link) { in mld_timeout()
1664 MLI_LOCK(mli); in mld_timeout()
1665 mld_v1_process_querier_timers(mli); in mld_timeout()
1666 if (mli->mli_v1_timer > 0) { in mld_timeout()
1669 MLI_UNLOCK(mli); in mld_timeout()
1679 mli = LIST_FIRST(&mli_head); in mld_timeout()
1681 while (mli != NULL) { in mld_timeout()
1682 if (mli->mli_flags & MLIF_PROCESSED) { in mld_timeout()
1683 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1687 MLI_LOCK(mli); in mld_timeout()
1688 if (mli->mli_version != MLD_VERSION_2) { in mld_timeout()
1689 MLI_UNLOCK(mli); in mld_timeout()
1690 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1701 MLI_ADDREF_LOCKED(mli); in mld_timeout()
1703 if (mli->mli_v2_timer == 0) { in mld_timeout()
1705 } else if (--mli->mli_v2_timer == 0) { in mld_timeout()
1706 if (mld_v2_dispatch_general_query(mli) > 0) { in mld_timeout()
1712 mli->mli_flags |= MLIF_PROCESSED; in mld_timeout()
1713 MLI_UNLOCK(mli); in mld_timeout()
1714 MLI_REMREF(mli); in mld_timeout()
1720 mli = LIST_FIRST(&mli_head); in mld_timeout()
1723 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1727 LIST_FOREACH(mli, &mli_head, mli_link) in mld_timeout()
1728 mli->mli_flags &= ~MLIF_PROCESSED; in mld_timeout()
1752 mli = LIST_FIRST(&mli_head); in mld_timeout()
1754 while (mli != NULL) { in mld_timeout()
1757 if (mli->mli_flags & MLIF_PROCESSED) { in mld_timeout()
1758 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1762 MLI_LOCK(mli); in mld_timeout()
1763 ifp = mli->mli_ifp; in mld_timeout()
1764 uri_sec = MLD_RANDOM_DELAY(mli->mli_uri); in mld_timeout()
1765 MLI_UNLOCK(mli); in mld_timeout()
1775 MLI_LOCK(mli); in mld_timeout()
1776 switch (mli->mli_version) { in mld_timeout()
1779 mli->mli_version); in mld_timeout()
1782 mld_v2_process_group_timers(mli, &qrq, in mld_timeout()
1786 MLI_UNLOCK(mli); in mld_timeout()
1801 MLI_LOCK(mli); in mld_timeout()
1802 MLI_ADDREF_LOCKED(mli); in mld_timeout()
1803 if (mli->mli_version == MLD_VERSION_1) { in mld_timeout()
1804 mld_dispatch_queue_locked(mli, &mli->mli_v1q, 0); in mld_timeout()
1805 } else if (mli->mli_version == MLD_VERSION_2) { in mld_timeout()
1806 MLI_UNLOCK(mli); in mld_timeout()
1811 MLI_LOCK(mli); in mld_timeout()
1817 IF_DRAIN(&mli->mli_v1q); in mld_timeout()
1824 mld_flush_relq(mli, (struct mld_in6m_relhead *)&in6m_dthead); in mld_timeout()
1825 VERIFY(SLIST_EMPTY(&mli->mli_relinmhead)); in mld_timeout()
1826 mli->mli_flags |= MLIF_PROCESSED; in mld_timeout()
1827 MLI_UNLOCK(mli); in mld_timeout()
1828 MLI_REMREF(mli); in mld_timeout()
1837 mli = LIST_FIRST(&mli_head); in mld_timeout()
1840 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1844 LIST_FOREACH(mli, &mli_head, mli_link) in mld_timeout()
1845 mli->mli_flags &= ~MLIF_PROCESSED; in mld_timeout()
1916 mld_flush_relq(struct mld_ifinfo *mli, struct mld_in6m_relhead *in6m_dthead) in mld_flush_relq() argument
1921 MLI_LOCK_ASSERT_HELD(mli); in mld_flush_relq()
1922 inm = SLIST_FIRST(&mli->mli_relinmhead); in mld_flush_relq()
1926 SLIST_REMOVE_HEAD(&mli->mli_relinmhead, in6m_nrele); in mld_flush_relq()
1927 MLI_UNLOCK(mli); in mld_flush_relq()
1952 MLI_LOCK(mli); in mld_flush_relq()
2011 mld_v2_process_group_timers(struct mld_ifinfo *mli, in mld_v2_process_group_timers() argument
2020 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_process_group_timers()
2021 VERIFY(mli == inm->in6m_mli); in mld_v2_process_group_timers()
2132 SLIST_INSERT_HEAD(&mli->mli_relinmhead, in mld_v2_process_group_timers()
2145 mld_set_version(struct mld_ifinfo *mli, const int mld_version) in mld_set_version() argument
2149 MLI_LOCK_ASSERT_HELD(mli); in mld_set_version()
2152 mld_version, (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), in mld_set_version()
2153 if_name(mli->mli_ifp))); in mld_set_version()
2160 old_version_timer = (mli->mli_rv * mli->mli_qi) + mli->mli_qri; in mld_set_version()
2161 mli->mli_v1_timer = old_version_timer; in mld_set_version()
2164 if (mli->mli_v1_timer > 0 && mli->mli_version != MLD_VERSION_1) { in mld_set_version()
2165 mli->mli_version = MLD_VERSION_1; in mld_set_version()
2166 mld_v2_cancel_link_timers(mli); in mld_set_version()
2169 MLI_LOCK_ASSERT_HELD(mli); in mld_set_version()
2171 return mli->mli_v1_timer; in mld_set_version()
2184 mld_v2_cancel_link_timers(struct mld_ifinfo *mli) in mld_v2_cancel_link_timers() argument
2190 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_cancel_link_timers()
2193 (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), if_name(mli->mli_ifp))); in mld_v2_cancel_link_timers()
2200 mli->mli_v2_timer = 0; in mld_v2_cancel_link_timers()
2206 ifp = mli->mli_ifp; in mld_v2_cancel_link_timers()
2207 MLI_UNLOCK(mli); in mld_v2_cancel_link_timers()
2240 MLI_LOCK(mli); in mld_v2_cancel_link_timers()
2241 SLIST_INSERT_HEAD(&mli->mli_relinmhead, inm, in mld_v2_cancel_link_timers()
2243 MLI_UNLOCK(mli); in mld_v2_cancel_link_timers()
2266 MLI_LOCK(mli); in mld_v2_cancel_link_timers()
2274 mld_v1_process_querier_timers(struct mld_ifinfo *mli) in mld_v1_process_querier_timers() argument
2276 MLI_LOCK_ASSERT_HELD(mli); in mld_v1_process_querier_timers()
2278 if (mld_v2enable && mli->mli_version != MLD_VERSION_2 && in mld_v1_process_querier_timers()
2279 --mli->mli_v1_timer == 0) { in mld_v1_process_querier_timers()
2284 __func__, mli->mli_version, MLD_VERSION_2, in mld_v1_process_querier_timers()
2285 (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), in mld_v1_process_querier_timers()
2286 if_name(mli->mli_ifp))); in mld_v1_process_querier_timers()
2287 mli->mli_version = MLD_VERSION_2; in mld_v1_process_querier_timers()
2415 struct mld_ifinfo *mli; in mld_change_state() local
2437 mli = MLD_IFINFO(ifp); in mld_change_state()
2438 VERIFY(mli != NULL); in mld_change_state()
2450 error = mld_initial_join(inm, mli, mtp, delay); in mld_change_state()
2454 mld_final_leave(inm, mli, mtp); in mld_change_state()
2461 error = mld_handle_state_change(inm, mli, mtp); in mld_change_state()
2479 mld_initial_join(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_initial_join() argument
2488 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_initial_join()
2501 MLI_LOCK(mli); in mld_initial_join()
2502 VERIFY(mli->mli_ifp == ifp); in mld_initial_join()
2516 (mli->mli_flags & MLIF_SILENT) || in mld_initial_join()
2533 if (mli->mli_version == MLD_VERSION_2 && in mld_initial_join()
2536 SLIST_INSERT_HEAD(&mli->mli_relinmhead, inm, in mld_initial_join()
2542 switch (mli->mli_version) { in mld_initial_join()
2561 MLI_LOCK_ASSERT_HELD(mli); in mld_initial_join()
2586 0, 0, (mli->mli_flags & MLIF_USEALLOW)); in mld_initial_join()
2604 VERIFY(mli->mli_rv > 1); in mld_initial_join()
2605 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_initial_join()
2621 MLI_UNLOCK(mli); in mld_initial_join()
2642 mld_handle_state_change(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_handle_state_change() argument
2649 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_handle_state_change()
2659 MLI_LOCK(mli); in mld_handle_state_change()
2660 VERIFY(mli->mli_ifp == ifp); in mld_handle_state_change()
2663 (mli->mli_flags & MLIF_SILENT) || in mld_handle_state_change()
2665 (mli->mli_version != MLD_VERSION_2)) { in mld_handle_state_change()
2666 MLI_UNLOCK(mli); in mld_handle_state_change()
2682 (mli->mli_flags & MLIF_USEALLOW)); in mld_handle_state_change()
2686 MLI_UNLOCK(mli); in mld_handle_state_change()
2697 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_handle_state_change()
2700 MLI_UNLOCK(mli); in mld_handle_state_change()
2715 mld_final_leave(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_final_leave() argument
2721 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_final_leave()
2741 MLI_LOCK(mli); in mld_final_leave()
2742 if (mli->mli_version == MLD_VERSION_1) { in mld_final_leave()
2754 MLI_LOCK_ASSERT_HELD(mli); in mld_final_leave()
2757 } else if (mli->mli_version == MLD_VERSION_2) { in mld_final_leave()
2766 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_final_leave()
2792 (mli->mli_flags & MLIF_USEALLOW)); in mld_final_leave()
2804 MLI_UNLOCK(mli); in mld_final_leave()
3581 mld_v2_dispatch_general_query(struct mld_ifinfo *mli) in mld_v2_dispatch_general_query() argument
3588 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_dispatch_general_query()
3590 VERIFY(mli->mli_version == MLD_VERSION_2); in mld_v2_dispatch_general_query()
3592 ifp = mli->mli_ifp; in mld_v2_dispatch_general_query()
3593 MLI_UNLOCK(mli); in mld_v2_dispatch_general_query()
3613 MLI_LOCK(mli); in mld_v2_dispatch_general_query()
3614 retval = mld_v2_enqueue_group_record(&mli->mli_gq, in mld_v2_dispatch_general_query()
3616 MLI_UNLOCK(mli); in mld_v2_dispatch_general_query()
3631 MLI_LOCK(mli); in mld_v2_dispatch_general_query()
3632 mld_dispatch_queue_locked(mli, &mli->mli_gq, MLD_MAX_RESPONSE_BURST); in mld_v2_dispatch_general_query()
3633 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_dispatch_general_query()
3638 if (mli->mli_gq.ifq_head != NULL) { in mld_v2_dispatch_general_query()
3639 mli->mli_v2_timer = 1 + MLD_RANDOM_DELAY( in mld_v2_dispatch_general_query()
3643 return mli->mli_v2_timer; in mld_v2_dispatch_general_query()