Lines Matching refs:mli
382 struct mld_ifinfo *mli; variable
414 LIST_FOREACH(mli, &mli_head, mli_link) {
415 MLI_LOCK(mli);
416 if (ifp != mli->mli_ifp) {
417 MLI_UNLOCK(mli);
421 mli_u.mli_ifindex = mli->mli_ifp->if_index;
422 mli_u.mli_version = mli->mli_version;
423 mli_u.mli_v1_timer = mli->mli_v1_timer;
424 mli_u.mli_v2_timer = mli->mli_v2_timer;
425 mli_u.mli_flags = mli->mli_flags;
426 mli_u.mli_rv = mli->mli_rv;
427 mli_u.mli_qi = mli->mli_qi;
428 mli_u.mli_qri = mli->mli_qri;
429 mli_u.mli_uri = mli->mli_uri;
430 MLI_UNLOCK(mli);
447 struct mld_ifinfo *mli; variable
474 LIST_FOREACH(mli, &mli_head, mli_link) {
475 MLI_LOCK(mli);
476 if (mld_set_version(mli, MLD_VERSION_1) > 0) {
479 MLI_UNLOCK(mli);
502 mld_dispatch_queue_locked(struct mld_ifinfo *mli, struct ifqueue *ifq, int limit) in mld_dispatch_queue_locked() argument
508 if (mli != NULL) { in mld_dispatch_queue_locked()
509 MLI_LOCK_ASSERT_HELD(mli); in mld_dispatch_queue_locked()
521 if (mli != NULL) { in mld_dispatch_queue_locked()
522 MLI_UNLOCK(mli); in mld_dispatch_queue_locked()
529 if (mli != NULL) { in mld_dispatch_queue_locked()
530 MLI_LOCK(mli); in mld_dispatch_queue_locked()
538 if (mli != NULL) { in mld_dispatch_queue_locked()
539 MLI_LOCK_ASSERT_HELD(mli); in mld_dispatch_queue_locked()
581 struct mld_ifinfo *mli; in mld_domifattach() local
586 mli = mli_alloc(how); in mld_domifattach()
587 if (mli == NULL) { in mld_domifattach()
593 MLI_LOCK(mli); in mld_domifattach()
594 mli_initvar(mli, ifp, 0); in mld_domifattach()
595 mli->mli_debug |= IFD_ATTACHED; in mld_domifattach()
596 MLI_ADDREF_LOCKED(mli); /* hold a reference for mli_head */ in mld_domifattach()
597 MLI_ADDREF_LOCKED(mli); /* hold a reference for caller */ in mld_domifattach()
598 MLI_UNLOCK(mli); in mld_domifattach()
600 mld6_initsilent(ifp, mli); in mld_domifattach()
603 LIST_INSERT_HEAD(&mli_head, mli, mli_link); in mld_domifattach()
611 return mli; in mld_domifattach()
619 mld_domifreattach(struct mld_ifinfo *mli) in mld_domifreattach() argument
625 MLI_LOCK(mli); in mld_domifreattach()
626 VERIFY(!(mli->mli_debug & IFD_ATTACHED)); in mld_domifreattach()
627 ifp = mli->mli_ifp; in mld_domifreattach()
629 mli_initvar(mli, ifp, 1); in mld_domifreattach()
630 mli->mli_debug |= IFD_ATTACHED; in mld_domifreattach()
631 MLI_ADDREF_LOCKED(mli); /* hold a reference for mli_head */ in mld_domifreattach()
632 MLI_UNLOCK(mli); in mld_domifreattach()
634 mld6_initsilent(ifp, mli); in mld_domifreattach()
637 LIST_INSERT_HEAD(&mli_head, mli, mli_link); in mld_domifreattach()
676 struct mld_ifinfo *mli, *tmli; in mli_delete() local
680 LIST_FOREACH_SAFE(mli, &mli_head, mli_link, tmli) { in mli_delete()
681 MLI_LOCK(mli); in mli_delete()
682 if (mli->mli_ifp == ifp) { in mli_delete()
686 IF_DRAIN(&mli->mli_gq); in mli_delete()
687 IF_DRAIN(&mli->mli_v1q); in mli_delete()
688 mld_flush_relq(mli, in6m_dthead); in mli_delete()
689 VERIFY(SLIST_EMPTY(&mli->mli_relinmhead)); in mli_delete()
690 mli->mli_debug &= ~IFD_ATTACHED; in mli_delete()
691 MLI_UNLOCK(mli); in mli_delete()
693 LIST_REMOVE(mli, mli_link); in mli_delete()
694 MLI_REMREF(mli); /* release mli_head reference */ in mli_delete()
698 MLI_UNLOCK(mli); in mli_delete()
705 mld6_initsilent(struct ifnet *ifp, struct mld_ifinfo *mli) in mld6_initsilent() argument
709 MLI_LOCK_ASSERT_NOTHELD(mli); in mld6_initsilent()
710 MLI_LOCK(mli); in mld6_initsilent()
713 mli->mli_flags |= MLIF_SILENT; in mld6_initsilent()
715 mli->mli_flags &= ~MLIF_SILENT; in mld6_initsilent()
717 MLI_UNLOCK(mli); in mld6_initsilent()
721 mli_initvar(struct mld_ifinfo *mli, struct ifnet *ifp, int reattach) in mli_initvar() argument
723 MLI_LOCK_ASSERT_HELD(mli); in mli_initvar()
725 mli->mli_ifp = ifp; in mli_initvar()
727 mli->mli_version = MLD_VERSION_2; in mli_initvar()
729 mli->mli_version = MLD_VERSION_1; in mli_initvar()
731 mli->mli_flags = 0; in mli_initvar()
732 mli->mli_rv = MLD_RV_INIT; in mli_initvar()
733 mli->mli_qi = MLD_QI_INIT; in mli_initvar()
734 mli->mli_qri = MLD_QRI_INIT; in mli_initvar()
735 mli->mli_uri = MLD_URI_INIT; in mli_initvar()
738 mli->mli_flags |= MLIF_USEALLOW; in mli_initvar()
741 SLIST_INIT(&mli->mli_relinmhead); in mli_initvar()
747 mli->mli_gq.ifq_maxlen = MLD_MAX_RESPONSE_PACKETS; in mli_initvar()
748 mli->mli_v1q.ifq_maxlen = MLD_MAX_RESPONSE_PACKETS; in mli_initvar()
754 struct mld_ifinfo *mli = zalloc_flags(mli_zone, how | Z_ZERO); in mli_alloc() local
755 if (mli != NULL) { in mli_alloc()
756 lck_mtx_init(&mli->mli_lock, &mld_mtx_grp, &mld_mtx_attr); in mli_alloc()
757 mli->mli_debug |= IFD_ALLOC; in mli_alloc()
759 return mli; in mli_alloc()
763 mli_free(struct mld_ifinfo *mli) in mli_free() argument
765 MLI_LOCK(mli); in mli_free()
766 if (mli->mli_debug & IFD_ATTACHED) { in mli_free()
767 panic("%s: attached mli=%p is being freed", __func__, mli); in mli_free()
769 } else if (mli->mli_ifp != NULL) { in mli_free()
770 panic("%s: ifp not NULL for mli=%p", __func__, mli); in mli_free()
772 } else if (!(mli->mli_debug & IFD_ALLOC)) { in mli_free()
773 panic("%s: mli %p cannot be freed", __func__, mli); in mli_free()
775 } else if (mli->mli_refcnt != 0) { in mli_free()
776 panic("%s: non-zero refcnt mli=%p", __func__, mli); in mli_free()
779 mli->mli_debug &= ~IFD_ALLOC; in mli_free()
780 MLI_UNLOCK(mli); in mli_free()
782 lck_mtx_destroy(&mli->mli_lock, &mld_mtx_grp); in mli_free()
783 zfree(mli_zone, mli); in mli_free()
787 mli_addref(struct mld_ifinfo *mli, int locked) in mli_addref() argument
790 MLI_LOCK_SPIN(mli); in mli_addref()
792 MLI_LOCK_ASSERT_HELD(mli); in mli_addref()
795 if (++mli->mli_refcnt == 0) { in mli_addref()
796 panic("%s: mli=%p wraparound refcnt", __func__, mli); in mli_addref()
800 MLI_UNLOCK(mli); in mli_addref()
805 mli_remref(struct mld_ifinfo *mli) in mli_remref() argument
810 MLI_LOCK_SPIN(mli); in mli_remref()
812 if (mli->mli_refcnt == 0) { in mli_remref()
813 panic("%s: mli=%p negative refcnt", __func__, mli); in mli_remref()
817 --mli->mli_refcnt; in mli_remref()
818 if (mli->mli_refcnt > 0) { in mli_remref()
819 MLI_UNLOCK(mli); in mli_remref()
823 ifp = mli->mli_ifp; in mli_remref()
824 mli->mli_ifp = NULL; in mli_remref()
825 IF_DRAIN(&mli->mli_gq); in mli_remref()
826 IF_DRAIN(&mli->mli_v1q); in mli_remref()
828 mld_flush_relq(mli, (struct mld_in6m_relhead *)&in6m_dthead); in mli_remref()
829 VERIFY(SLIST_EMPTY(&mli->mli_relinmhead)); in mli_remref()
830 MLI_UNLOCK(mli); in mli_remref()
838 mli_free(mli); in mli_remref()
852 struct mld_ifinfo *mli; in mld_v1_input_query() local
909 mli = MLD_IFINFO(ifp); in mld_v1_input_query()
910 VERIFY(mli != NULL); in mld_v1_input_query()
912 MLI_LOCK(mli); in mld_v1_input_query()
913 mtp.qpt = mld_set_version(mli, MLD_VERSION_1); in mld_v1_input_query()
914 MLI_UNLOCK(mli); in mld_v1_input_query()
1038 struct mld_ifinfo *mli; in mld_v2_input_query() local
1130 mli = MLD_IFINFO(ifp); in mld_v2_input_query()
1131 VERIFY(mli != NULL); in mld_v2_input_query()
1133 MLI_LOCK(mli); in mld_v2_input_query()
1139 if (mli->mli_version != MLD_VERSION_2) { in mld_v2_input_query()
1140 MLI_UNLOCK(mli); in mld_v2_input_query()
1144 mtp.qpt = mld_set_version(mli, MLD_VERSION_2); in mld_v2_input_query()
1145 mli->mli_rv = qrv; in mld_v2_input_query()
1146 mli->mli_qi = qqi; in mld_v2_input_query()
1147 mli->mli_qri = MAX(timer, MLD_QRI_MIN); in mld_v2_input_query()
1149 MLD_PRINTF(("%s: qrv %d qi %d qri %d\n", __func__, mli->mli_rv, in mld_v2_input_query()
1150 mli->mli_qi, mli->mli_qri)); in mld_v2_input_query()
1166 if (mli->mli_v2_timer == 0 || mli->mli_v2_timer >= timer) { in mld_v2_input_query()
1167 mtp.it = mli->mli_v2_timer = MLD_RANDOM_DELAY(timer); in mld_v2_input_query()
1169 MLI_UNLOCK(mli); in mld_v2_input_query()
1171 MLI_UNLOCK(mli); in mld_v2_input_query()
1207 MLI_LOCK(mli); in mld_v2_input_query()
1208 mtp.it = mli->mli_v2_timer; in mld_v2_input_query()
1209 MLI_UNLOCK(mli); in mld_v2_input_query()
1443 struct mld_ifinfo *mli; in mld_v1_input_report() local
1446 mli = inm->in6m_mli; in mld_v1_input_report()
1447 VERIFY(mli != NULL); in mld_v1_input_report()
1449 MLI_LOCK(mli); in mld_v1_input_report()
1454 if (mli->mli_version == MLD_VERSION_2) { in mld_v1_input_report()
1455 MLI_UNLOCK(mli); in mld_v1_input_report()
1460 MLI_UNLOCK(mli); in mld_v1_input_report()
1620 struct mld_ifinfo *mli; in mld_timeout() local
1656 LIST_FOREACH(mli, &mli_head, mli_link) { in mld_timeout()
1657 MLI_LOCK(mli); in mld_timeout()
1658 mld_v1_process_querier_timers(mli); in mld_timeout()
1659 if (mli->mli_v1_timer > 0) { in mld_timeout()
1662 MLI_UNLOCK(mli); in mld_timeout()
1672 mli = LIST_FIRST(&mli_head); in mld_timeout()
1674 while (mli != NULL) { in mld_timeout()
1675 if (mli->mli_flags & MLIF_PROCESSED) { in mld_timeout()
1676 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1680 MLI_LOCK(mli); in mld_timeout()
1681 if (mli->mli_version != MLD_VERSION_2) { in mld_timeout()
1682 MLI_UNLOCK(mli); in mld_timeout()
1683 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1694 MLI_ADDREF_LOCKED(mli); in mld_timeout()
1696 if (mli->mli_v2_timer == 0) { in mld_timeout()
1698 } else if (--mli->mli_v2_timer == 0) { in mld_timeout()
1699 if (mld_v2_dispatch_general_query(mli) > 0) { in mld_timeout()
1705 mli->mli_flags |= MLIF_PROCESSED; in mld_timeout()
1706 MLI_UNLOCK(mli); in mld_timeout()
1707 MLI_REMREF(mli); in mld_timeout()
1713 mli = LIST_FIRST(&mli_head); in mld_timeout()
1716 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1720 LIST_FOREACH(mli, &mli_head, mli_link) in mld_timeout()
1721 mli->mli_flags &= ~MLIF_PROCESSED; in mld_timeout()
1745 mli = LIST_FIRST(&mli_head); in mld_timeout()
1747 while (mli != NULL) { in mld_timeout()
1750 if (mli->mli_flags & MLIF_PROCESSED) { in mld_timeout()
1751 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1755 MLI_LOCK(mli); in mld_timeout()
1756 ifp = mli->mli_ifp; in mld_timeout()
1757 uri_sec = MLD_RANDOM_DELAY(mli->mli_uri); in mld_timeout()
1758 MLI_UNLOCK(mli); in mld_timeout()
1768 MLI_LOCK(mli); in mld_timeout()
1769 switch (mli->mli_version) { in mld_timeout()
1772 mli->mli_version); in mld_timeout()
1775 mld_v2_process_group_timers(mli, &qrq, in mld_timeout()
1779 MLI_UNLOCK(mli); in mld_timeout()
1794 MLI_LOCK(mli); in mld_timeout()
1795 MLI_ADDREF_LOCKED(mli); in mld_timeout()
1796 if (mli->mli_version == MLD_VERSION_1) { in mld_timeout()
1797 mld_dispatch_queue_locked(mli, &mli->mli_v1q, 0); in mld_timeout()
1798 } else if (mli->mli_version == MLD_VERSION_2) { in mld_timeout()
1799 MLI_UNLOCK(mli); in mld_timeout()
1804 MLI_LOCK(mli); in mld_timeout()
1810 IF_DRAIN(&mli->mli_v1q); in mld_timeout()
1817 mld_flush_relq(mli, (struct mld_in6m_relhead *)&in6m_dthead); in mld_timeout()
1818 VERIFY(SLIST_EMPTY(&mli->mli_relinmhead)); in mld_timeout()
1819 mli->mli_flags |= MLIF_PROCESSED; in mld_timeout()
1820 MLI_UNLOCK(mli); in mld_timeout()
1821 MLI_REMREF(mli); in mld_timeout()
1830 mli = LIST_FIRST(&mli_head); in mld_timeout()
1833 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1837 LIST_FOREACH(mli, &mli_head, mli_link) in mld_timeout()
1838 mli->mli_flags &= ~MLIF_PROCESSED; in mld_timeout()
1871 mld_flush_relq(struct mld_ifinfo *mli, struct mld_in6m_relhead *in6m_dthead) in mld_flush_relq() argument
1876 MLI_LOCK_ASSERT_HELD(mli); in mld_flush_relq()
1877 inm = SLIST_FIRST(&mli->mli_relinmhead); in mld_flush_relq()
1881 SLIST_REMOVE_HEAD(&mli->mli_relinmhead, in6m_nrele); in mld_flush_relq()
1882 MLI_UNLOCK(mli); in mld_flush_relq()
1907 MLI_LOCK(mli); in mld_flush_relq()
1966 mld_v2_process_group_timers(struct mld_ifinfo *mli, in mld_v2_process_group_timers() argument
1975 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_process_group_timers()
1976 VERIFY(mli == inm->in6m_mli); in mld_v2_process_group_timers()
2087 SLIST_INSERT_HEAD(&mli->mli_relinmhead, in mld_v2_process_group_timers()
2100 mld_set_version(struct mld_ifinfo *mli, const int mld_version) in mld_set_version() argument
2104 MLI_LOCK_ASSERT_HELD(mli); in mld_set_version()
2107 mld_version, (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), in mld_set_version()
2108 if_name(mli->mli_ifp))); in mld_set_version()
2115 old_version_timer = (mli->mli_rv * mli->mli_qi) + mli->mli_qri; in mld_set_version()
2116 mli->mli_v1_timer = old_version_timer; in mld_set_version()
2119 if (mli->mli_v1_timer > 0 && mli->mli_version != MLD_VERSION_1) { in mld_set_version()
2120 mli->mli_version = MLD_VERSION_1; in mld_set_version()
2121 mld_v2_cancel_link_timers(mli); in mld_set_version()
2124 MLI_LOCK_ASSERT_HELD(mli); in mld_set_version()
2126 return mli->mli_v1_timer; in mld_set_version()
2139 mld_v2_cancel_link_timers(struct mld_ifinfo *mli) in mld_v2_cancel_link_timers() argument
2145 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_cancel_link_timers()
2148 (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), if_name(mli->mli_ifp))); in mld_v2_cancel_link_timers()
2155 mli->mli_v2_timer = 0; in mld_v2_cancel_link_timers()
2161 ifp = mli->mli_ifp; in mld_v2_cancel_link_timers()
2162 MLI_UNLOCK(mli); in mld_v2_cancel_link_timers()
2195 MLI_LOCK(mli); in mld_v2_cancel_link_timers()
2196 SLIST_INSERT_HEAD(&mli->mli_relinmhead, inm, in mld_v2_cancel_link_timers()
2198 MLI_UNLOCK(mli); in mld_v2_cancel_link_timers()
2221 MLI_LOCK(mli); in mld_v2_cancel_link_timers()
2229 mld_v1_process_querier_timers(struct mld_ifinfo *mli) in mld_v1_process_querier_timers() argument
2231 MLI_LOCK_ASSERT_HELD(mli); in mld_v1_process_querier_timers()
2233 if (mld_v2enable && mli->mli_version != MLD_VERSION_2 && in mld_v1_process_querier_timers()
2234 --mli->mli_v1_timer == 0) { in mld_v1_process_querier_timers()
2239 __func__, mli->mli_version, MLD_VERSION_2, in mld_v1_process_querier_timers()
2240 (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), in mld_v1_process_querier_timers()
2241 if_name(mli->mli_ifp))); in mld_v1_process_querier_timers()
2242 mli->mli_version = MLD_VERSION_2; in mld_v1_process_querier_timers()
2370 struct mld_ifinfo *mli; in mld_change_state() local
2392 mli = MLD_IFINFO(ifp); in mld_change_state()
2393 VERIFY(mli != NULL); in mld_change_state()
2405 error = mld_initial_join(inm, mli, mtp, delay); in mld_change_state()
2409 mld_final_leave(inm, mli, mtp); in mld_change_state()
2416 error = mld_handle_state_change(inm, mli, mtp); in mld_change_state()
2434 mld_initial_join(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_initial_join() argument
2443 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_initial_join()
2456 MLI_LOCK(mli); in mld_initial_join()
2457 VERIFY(mli->mli_ifp == ifp); in mld_initial_join()
2471 (mli->mli_flags & MLIF_SILENT) || in mld_initial_join()
2488 if (mli->mli_version == MLD_VERSION_2 && in mld_initial_join()
2491 SLIST_INSERT_HEAD(&mli->mli_relinmhead, inm, in mld_initial_join()
2497 switch (mli->mli_version) { in mld_initial_join()
2516 MLI_LOCK_ASSERT_HELD(mli); in mld_initial_join()
2541 0, 0, (mli->mli_flags & MLIF_USEALLOW)); in mld_initial_join()
2559 VERIFY(mli->mli_rv > 1); in mld_initial_join()
2560 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_initial_join()
2576 MLI_UNLOCK(mli); in mld_initial_join()
2597 mld_handle_state_change(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_handle_state_change() argument
2604 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_handle_state_change()
2614 MLI_LOCK(mli); in mld_handle_state_change()
2615 VERIFY(mli->mli_ifp == ifp); in mld_handle_state_change()
2618 (mli->mli_flags & MLIF_SILENT) || in mld_handle_state_change()
2620 (mli->mli_version != MLD_VERSION_2)) { in mld_handle_state_change()
2621 MLI_UNLOCK(mli); in mld_handle_state_change()
2637 (mli->mli_flags & MLIF_USEALLOW)); in mld_handle_state_change()
2641 MLI_UNLOCK(mli); in mld_handle_state_change()
2652 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_handle_state_change()
2655 MLI_UNLOCK(mli); in mld_handle_state_change()
2670 mld_final_leave(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_final_leave() argument
2676 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_final_leave()
2696 MLI_LOCK(mli); in mld_final_leave()
2697 if (mli->mli_version == MLD_VERSION_1) { in mld_final_leave()
2709 MLI_LOCK_ASSERT_HELD(mli); in mld_final_leave()
2712 } else if (mli->mli_version == MLD_VERSION_2) { in mld_final_leave()
2721 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_final_leave()
2747 (mli->mli_flags & MLIF_USEALLOW)); in mld_final_leave()
2759 MLI_UNLOCK(mli); in mld_final_leave()
3536 mld_v2_dispatch_general_query(struct mld_ifinfo *mli) in mld_v2_dispatch_general_query() argument
3543 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_dispatch_general_query()
3545 VERIFY(mli->mli_version == MLD_VERSION_2); in mld_v2_dispatch_general_query()
3547 ifp = mli->mli_ifp; in mld_v2_dispatch_general_query()
3548 MLI_UNLOCK(mli); in mld_v2_dispatch_general_query()
3568 MLI_LOCK(mli); in mld_v2_dispatch_general_query()
3569 retval = mld_v2_enqueue_group_record(&mli->mli_gq, in mld_v2_dispatch_general_query()
3571 MLI_UNLOCK(mli); in mld_v2_dispatch_general_query()
3586 MLI_LOCK(mli); in mld_v2_dispatch_general_query()
3587 mld_dispatch_queue_locked(mli, &mli->mli_gq, MLD_MAX_RESPONSE_BURST); in mld_v2_dispatch_general_query()
3588 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_dispatch_general_query()
3593 if (mli->mli_gq.ifq_head != NULL) { in mld_v2_dispatch_general_query()
3594 mli->mli_v2_timer = 1 + MLD_RANDOM_DELAY( in mld_v2_dispatch_general_query()
3598 return mli->mli_v2_timer; in mld_v2_dispatch_general_query()