Lines Matching refs:mli

386 	struct mld_ifinfo       *mli;  variable
418 LIST_FOREACH(mli, &mli_head, mli_link) {
419 MLI_LOCK(mli);
420 if (ifp != mli->mli_ifp) {
421 MLI_UNLOCK(mli);
425 mli_u.mli_ifindex = mli->mli_ifp->if_index;
426 mli_u.mli_version = mli->mli_version;
427 mli_u.mli_v1_timer = mli->mli_v1_timer;
428 mli_u.mli_v2_timer = mli->mli_v2_timer;
429 mli_u.mli_flags = mli->mli_flags;
430 mli_u.mli_rv = mli->mli_rv;
431 mli_u.mli_qi = mli->mli_qi;
432 mli_u.mli_qri = mli->mli_qri;
433 mli_u.mli_uri = mli->mli_uri;
434 MLI_UNLOCK(mli);
451 struct mld_ifinfo *mli; variable
478 LIST_FOREACH(mli, &mli_head, mli_link) {
479 MLI_LOCK(mli);
480 if (mld_set_version(mli, MLD_VERSION_1) > 0) {
483 MLI_UNLOCK(mli);
506 mld_dispatch_queue_locked(struct mld_ifinfo *mli, struct ifqueue *ifq, int limit) in mld_dispatch_queue_locked() argument
512 if (mli != NULL) { in mld_dispatch_queue_locked()
513 MLI_LOCK_ASSERT_HELD(mli); in mld_dispatch_queue_locked()
525 if (mli != NULL) { in mld_dispatch_queue_locked()
526 MLI_UNLOCK(mli); in mld_dispatch_queue_locked()
533 if (mli != NULL) { in mld_dispatch_queue_locked()
534 MLI_LOCK(mli); in mld_dispatch_queue_locked()
542 if (mli != NULL) { in mld_dispatch_queue_locked()
543 MLI_LOCK_ASSERT_HELD(mli); in mld_dispatch_queue_locked()
585 struct mld_ifinfo *mli; in mld_domifattach() local
590 mli = mli_alloc(how); in mld_domifattach()
591 if (mli == NULL) { in mld_domifattach()
597 MLI_LOCK(mli); in mld_domifattach()
598 mli_initvar(mli, ifp, 0); in mld_domifattach()
599 mli->mli_debug |= IFD_ATTACHED; in mld_domifattach()
600 MLI_ADDREF_LOCKED(mli); /* hold a reference for mli_head */ in mld_domifattach()
601 MLI_ADDREF_LOCKED(mli); /* hold a reference for caller */ in mld_domifattach()
602 MLI_UNLOCK(mli); in mld_domifattach()
604 mld6_initsilent(ifp, mli); in mld_domifattach()
607 LIST_INSERT_HEAD(&mli_head, mli, mli_link); in mld_domifattach()
615 return mli; in mld_domifattach()
623 mld_domifreattach(struct mld_ifinfo *mli) in mld_domifreattach() argument
629 MLI_LOCK(mli); in mld_domifreattach()
630 VERIFY(!(mli->mli_debug & IFD_ATTACHED)); in mld_domifreattach()
631 ifp = mli->mli_ifp; in mld_domifreattach()
633 mli_initvar(mli, ifp, 1); in mld_domifreattach()
634 mli->mli_debug |= IFD_ATTACHED; in mld_domifreattach()
635 MLI_ADDREF_LOCKED(mli); /* hold a reference for mli_head */ in mld_domifreattach()
636 MLI_UNLOCK(mli); in mld_domifreattach()
638 mld6_initsilent(ifp, mli); in mld_domifreattach()
641 LIST_INSERT_HEAD(&mli_head, mli, mli_link); in mld_domifreattach()
680 struct mld_ifinfo *mli, *tmli; in mli_delete() local
684 LIST_FOREACH_SAFE(mli, &mli_head, mli_link, tmli) { in mli_delete()
685 MLI_LOCK(mli); in mli_delete()
686 if (mli->mli_ifp == ifp) { in mli_delete()
690 IF_DRAIN(&mli->mli_gq); in mli_delete()
691 IF_DRAIN(&mli->mli_v1q); in mli_delete()
692 mld_flush_relq(mli, in6m_dthead); 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 MLI_UNLOCK(mli); in mli_remref()
840 mli_free(mli); in mli_remref()
854 struct mld_ifinfo *mli; in mld_v1_input_query() local
911 mli = MLD_IFINFO(ifp); in mld_v1_input_query()
912 VERIFY(mli != NULL); in mld_v1_input_query()
914 MLI_LOCK(mli); in mld_v1_input_query()
915 mtp.qpt = mld_set_version(mli, MLD_VERSION_1); in mld_v1_input_query()
916 MLI_UNLOCK(mli); in mld_v1_input_query()
1040 struct mld_ifinfo *mli; in mld_v2_input_query() local
1132 mli = MLD_IFINFO(ifp); in mld_v2_input_query()
1133 VERIFY(mli != NULL); in mld_v2_input_query()
1135 MLI_LOCK(mli); in mld_v2_input_query()
1141 if (mli->mli_version != MLD_VERSION_2) { in mld_v2_input_query()
1142 MLI_UNLOCK(mli); in mld_v2_input_query()
1146 mtp.qpt = mld_set_version(mli, MLD_VERSION_2); in mld_v2_input_query()
1147 mli->mli_rv = qrv; in mld_v2_input_query()
1148 mli->mli_qi = qqi; in mld_v2_input_query()
1149 mli->mli_qri = MAX(timer, MLD_QRI_MIN); in mld_v2_input_query()
1151 MLD_PRINTF(("%s: qrv %d qi %d qri %d\n", __func__, mli->mli_rv, in mld_v2_input_query()
1152 mli->mli_qi, mli->mli_qri)); in mld_v2_input_query()
1168 if (mli->mli_v2_timer == 0 || mli->mli_v2_timer >= timer) { in mld_v2_input_query()
1169 mtp.it = mli->mli_v2_timer = MLD_RANDOM_DELAY(timer); in mld_v2_input_query()
1171 MLI_UNLOCK(mli); in mld_v2_input_query()
1173 MLI_UNLOCK(mli); in mld_v2_input_query()
1209 MLI_LOCK(mli); in mld_v2_input_query()
1210 mtp.it = mli->mli_v2_timer; in mld_v2_input_query()
1211 MLI_UNLOCK(mli); in mld_v2_input_query()
1445 struct mld_ifinfo *mli; in mld_v1_input_report() local
1448 mli = inm->in6m_mli; in mld_v1_input_report()
1449 VERIFY(mli != NULL); in mld_v1_input_report()
1451 MLI_LOCK(mli); in mld_v1_input_report()
1456 if (mli->mli_version == MLD_VERSION_2) { in mld_v1_input_report()
1457 MLI_UNLOCK(mli); in mld_v1_input_report()
1462 MLI_UNLOCK(mli); in mld_v1_input_report()
1626 struct mld_ifinfo *mli; in mld_timeout() local
1662 LIST_FOREACH(mli, &mli_head, mli_link) { in mld_timeout()
1663 MLI_LOCK(mli); in mld_timeout()
1664 mld_v1_process_querier_timers(mli); in mld_timeout()
1665 if (mli->mli_v1_timer > 0) { in mld_timeout()
1668 MLI_UNLOCK(mli); in mld_timeout()
1678 mli = LIST_FIRST(&mli_head); in mld_timeout()
1680 while (mli != NULL) { in mld_timeout()
1681 if (mli->mli_flags & MLIF_PROCESSED) { in mld_timeout()
1682 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1686 MLI_LOCK(mli); in mld_timeout()
1687 if (mli->mli_version != MLD_VERSION_2) { in mld_timeout()
1688 MLI_UNLOCK(mli); in mld_timeout()
1689 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1700 MLI_ADDREF_LOCKED(mli); in mld_timeout()
1702 if (mli->mli_v2_timer == 0) { in mld_timeout()
1704 } else if (--mli->mli_v2_timer == 0) { in mld_timeout()
1705 if (mld_v2_dispatch_general_query(mli) > 0) { in mld_timeout()
1711 mli->mli_flags |= MLIF_PROCESSED; in mld_timeout()
1712 MLI_UNLOCK(mli); in mld_timeout()
1713 MLI_REMREF(mli); in mld_timeout()
1719 mli = LIST_FIRST(&mli_head); in mld_timeout()
1722 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1726 LIST_FOREACH(mli, &mli_head, mli_link) in mld_timeout()
1727 mli->mli_flags &= ~MLIF_PROCESSED; in mld_timeout()
1751 mli = LIST_FIRST(&mli_head); in mld_timeout()
1753 while (mli != NULL) { in mld_timeout()
1756 if (mli->mli_flags & MLIF_PROCESSED) { in mld_timeout()
1757 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1761 MLI_LOCK(mli); in mld_timeout()
1762 ifp = mli->mli_ifp; in mld_timeout()
1763 uri_sec = MLD_RANDOM_DELAY(mli->mli_uri); in mld_timeout()
1764 MLI_UNLOCK(mli); in mld_timeout()
1774 MLI_LOCK(mli); in mld_timeout()
1775 switch (mli->mli_version) { in mld_timeout()
1778 mli->mli_version); in mld_timeout()
1781 mld_v2_process_group_timers(mli, &qrq, in mld_timeout()
1785 MLI_UNLOCK(mli); in mld_timeout()
1800 MLI_LOCK(mli); in mld_timeout()
1801 MLI_ADDREF_LOCKED(mli); in mld_timeout()
1802 if (mli->mli_version == MLD_VERSION_1) { in mld_timeout()
1803 mld_dispatch_queue_locked(mli, &mli->mli_v1q, 0); in mld_timeout()
1804 } else if (mli->mli_version == MLD_VERSION_2) { in mld_timeout()
1805 MLI_UNLOCK(mli); in mld_timeout()
1810 MLI_LOCK(mli); in mld_timeout()
1816 IF_DRAIN(&mli->mli_v1q); in mld_timeout()
1823 mld_flush_relq(mli, (struct mld_in6m_relhead *)&in6m_dthead); in mld_timeout()
1824 mli->mli_flags |= MLIF_PROCESSED; in mld_timeout()
1825 MLI_UNLOCK(mli); in mld_timeout()
1826 MLI_REMREF(mli); in mld_timeout()
1835 mli = LIST_FIRST(&mli_head); in mld_timeout()
1838 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1842 LIST_FOREACH(mli, &mli_head, mli_link) in mld_timeout()
1843 mli->mli_flags &= ~MLIF_PROCESSED; in mld_timeout()
1914 mld_append_relq(struct mld_ifinfo *mli, struct in6_multi *inm) in mld_append_relq() argument
1916 MLI_LOCK_ASSERT_HELD(mli); in mld_append_relq()
1919 (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), in mld_append_relq()
1920 if_name(mli->mli_ifp))); in mld_append_relq()
1921 SLIST_INSERT_HEAD(&mli->mli_relinmhead, inm, in6m_nrele); in mld_append_relq()
1930 mld_flush_relq(struct mld_ifinfo *mli, struct mld_in6m_relhead *in6m_dthead) in mld_flush_relq() argument
1940 MLI_LOCK_ASSERT_HELD(mli); in mld_flush_relq()
1942 while ((inm = SLIST_FIRST(&mli->mli_relinmhead)) != NULL) { in mld_flush_relq()
1943 SLIST_REMOVE_HEAD(&mli->mli_relinmhead, in6m_nrele); in mld_flush_relq()
1946 MLI_UNLOCK(mli); in mld_flush_relq()
1975 MLI_LOCK(mli); in mld_flush_relq()
2032 mld_v2_process_group_timers(struct mld_ifinfo *mli, in mld_v2_process_group_timers() argument
2041 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_process_group_timers()
2042 VERIFY(mli == inm->in6m_mli); in mld_v2_process_group_timers()
2153 mld_append_relq(mli, inm); in mld_v2_process_group_timers()
2165 mld_set_version(struct mld_ifinfo *mli, const int mld_version) in mld_set_version() argument
2169 MLI_LOCK_ASSERT_HELD(mli); in mld_set_version()
2172 mld_version, (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), in mld_set_version()
2173 if_name(mli->mli_ifp))); in mld_set_version()
2180 old_version_timer = (mli->mli_rv * mli->mli_qi) + mli->mli_qri; in mld_set_version()
2181 mli->mli_v1_timer = old_version_timer; in mld_set_version()
2184 if (mli->mli_v1_timer > 0 && mli->mli_version != MLD_VERSION_1) { in mld_set_version()
2185 mli->mli_version = MLD_VERSION_1; in mld_set_version()
2186 mld_v2_cancel_link_timers(mli); in mld_set_version()
2189 MLI_LOCK_ASSERT_HELD(mli); in mld_set_version()
2191 return mli->mli_v1_timer; in mld_set_version()
2204 mld_v2_cancel_link_timers(struct mld_ifinfo *mli) in mld_v2_cancel_link_timers() argument
2210 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_cancel_link_timers()
2213 (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), if_name(mli->mli_ifp))); in mld_v2_cancel_link_timers()
2220 mli->mli_v2_timer = 0; in mld_v2_cancel_link_timers()
2226 ifp = mli->mli_ifp; in mld_v2_cancel_link_timers()
2227 MLI_UNLOCK(mli); in mld_v2_cancel_link_timers()
2260 MLI_LOCK(mli); in mld_v2_cancel_link_timers()
2261 mld_append_relq(mli, inm); in mld_v2_cancel_link_timers()
2262 MLI_UNLOCK(mli); in mld_v2_cancel_link_timers()
2285 MLI_LOCK(mli); in mld_v2_cancel_link_timers()
2293 mld_v1_process_querier_timers(struct mld_ifinfo *mli) in mld_v1_process_querier_timers() argument
2295 MLI_LOCK_ASSERT_HELD(mli); in mld_v1_process_querier_timers()
2297 if (mld_v2enable && mli->mli_version != MLD_VERSION_2 && in mld_v1_process_querier_timers()
2298 --mli->mli_v1_timer == 0) { in mld_v1_process_querier_timers()
2303 __func__, mli->mli_version, MLD_VERSION_2, in mld_v1_process_querier_timers()
2304 (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), in mld_v1_process_querier_timers()
2305 if_name(mli->mli_ifp))); in mld_v1_process_querier_timers()
2306 mli->mli_version = MLD_VERSION_2; in mld_v1_process_querier_timers()
2434 struct mld_ifinfo *mli; in mld_change_state() local
2456 mli = MLD_IFINFO(ifp); in mld_change_state()
2457 VERIFY(mli != NULL); in mld_change_state()
2469 error = mld_initial_join(inm, mli, mtp, delay); in mld_change_state()
2473 mld_final_leave(inm, mli, mtp); in mld_change_state()
2480 error = mld_handle_state_change(inm, mli, mtp); in mld_change_state()
2498 mld_initial_join(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_initial_join() argument
2507 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_initial_join()
2520 MLI_LOCK(mli); in mld_initial_join()
2521 VERIFY(mli->mli_ifp == ifp); in mld_initial_join()
2535 (mli->mli_flags & MLIF_SILENT) || in mld_initial_join()
2552 if (mli->mli_version == MLD_VERSION_2 && in mld_initial_join()
2555 mld_append_relq(mli, inm); in mld_initial_join()
2560 switch (mli->mli_version) { in mld_initial_join()
2579 MLI_LOCK_ASSERT_HELD(mli); in mld_initial_join()
2604 0, 0, (mli->mli_flags & MLIF_USEALLOW)); in mld_initial_join()
2622 VERIFY(mli->mli_rv > 1); in mld_initial_join()
2623 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_initial_join()
2639 MLI_UNLOCK(mli); in mld_initial_join()
2660 mld_handle_state_change(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_handle_state_change() argument
2667 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_handle_state_change()
2677 MLI_LOCK(mli); in mld_handle_state_change()
2678 VERIFY(mli->mli_ifp == ifp); in mld_handle_state_change()
2681 (mli->mli_flags & MLIF_SILENT) || in mld_handle_state_change()
2683 (mli->mli_version != MLD_VERSION_2)) { in mld_handle_state_change()
2684 MLI_UNLOCK(mli); in mld_handle_state_change()
2700 (mli->mli_flags & MLIF_USEALLOW)); in mld_handle_state_change()
2704 MLI_UNLOCK(mli); in mld_handle_state_change()
2715 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_handle_state_change()
2718 MLI_UNLOCK(mli); in mld_handle_state_change()
2733 mld_final_leave(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_final_leave() argument
2739 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_final_leave()
2759 MLI_LOCK(mli); in mld_final_leave()
2760 if (mli->mli_version == MLD_VERSION_1) { in mld_final_leave()
2772 MLI_LOCK_ASSERT_HELD(mli); in mld_final_leave()
2775 } else if (mli->mli_version == MLD_VERSION_2) { in mld_final_leave()
2784 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_final_leave()
2810 (mli->mli_flags & MLIF_USEALLOW)); in mld_final_leave()
2822 MLI_UNLOCK(mli); in mld_final_leave()
3599 mld_v2_dispatch_general_query(struct mld_ifinfo *mli) in mld_v2_dispatch_general_query() argument
3606 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_dispatch_general_query()
3608 VERIFY(mli->mli_version == MLD_VERSION_2); in mld_v2_dispatch_general_query()
3610 ifp = mli->mli_ifp; in mld_v2_dispatch_general_query()
3611 MLI_UNLOCK(mli); in mld_v2_dispatch_general_query()
3631 MLI_LOCK(mli); in mld_v2_dispatch_general_query()
3632 retval = mld_v2_enqueue_group_record(&mli->mli_gq, in mld_v2_dispatch_general_query()
3634 MLI_UNLOCK(mli); in mld_v2_dispatch_general_query()
3649 MLI_LOCK(mli); in mld_v2_dispatch_general_query()
3650 mld_dispatch_queue_locked(mli, &mli->mli_gq, MLD_MAX_RESPONSE_BURST); in mld_v2_dispatch_general_query()
3651 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_dispatch_general_query()
3656 if (mli->mli_gq.ifq_head != NULL) { in mld_v2_dispatch_general_query()
3657 mli->mli_v2_timer = 1 + MLD_RANDOM_DELAY( in mld_v2_dispatch_general_query()
3661 return mli->mli_v2_timer; in mld_v2_dispatch_general_query()