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()
1613 struct mld_ifinfo *mli; in mld_timeout() local
1640 LIST_FOREACH(mli, &mli_head, mli_link) { in mld_timeout()
1641 MLI_LOCK(mli); in mld_timeout()
1642 mld_v1_process_querier_timers(mli); in mld_timeout()
1643 if (mli->mli_v1_timer > 0) { in mld_timeout()
1646 MLI_UNLOCK(mli); in mld_timeout()
1656 mli = LIST_FIRST(&mli_head); in mld_timeout()
1658 while (mli != NULL) { in mld_timeout()
1659 if (mli->mli_flags & MLIF_PROCESSED) { in mld_timeout()
1660 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1664 MLI_LOCK(mli); in mld_timeout()
1665 if (mli->mli_version != MLD_VERSION_2) { in mld_timeout()
1666 MLI_UNLOCK(mli); in mld_timeout()
1667 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1678 MLI_ADDREF_LOCKED(mli); in mld_timeout()
1680 if (mli->mli_v2_timer == 0) { in mld_timeout()
1682 } else if (--mli->mli_v2_timer == 0) { in mld_timeout()
1683 if (mld_v2_dispatch_general_query(mli) > 0) { in mld_timeout()
1689 mli->mli_flags |= MLIF_PROCESSED; in mld_timeout()
1690 MLI_UNLOCK(mli); in mld_timeout()
1691 MLI_REMREF(mli); in mld_timeout()
1697 mli = LIST_FIRST(&mli_head); in mld_timeout()
1700 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1704 LIST_FOREACH(mli, &mli_head, mli_link) in mld_timeout()
1705 mli->mli_flags &= ~MLIF_PROCESSED; in mld_timeout()
1730 mli = LIST_FIRST(&mli_head); in mld_timeout()
1732 while (mli != NULL) { in mld_timeout()
1735 if (mli->mli_flags & MLIF_PROCESSED) { in mld_timeout()
1736 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1740 MLI_LOCK(mli); in mld_timeout()
1741 ifp = mli->mli_ifp; in mld_timeout()
1742 uri_sec = MLD_RANDOM_DELAY(mli->mli_uri); in mld_timeout()
1743 MLI_UNLOCK(mli); in mld_timeout()
1753 MLI_LOCK(mli); in mld_timeout()
1754 switch (mli->mli_version) { in mld_timeout()
1757 mli->mli_version); in mld_timeout()
1760 mld_v2_process_group_timers(mli, &qrq, in mld_timeout()
1764 MLI_UNLOCK(mli); in mld_timeout()
1779 MLI_LOCK(mli); in mld_timeout()
1780 MLI_ADDREF_LOCKED(mli); in mld_timeout()
1781 if (mli->mli_version == MLD_VERSION_1) { in mld_timeout()
1782 mld_dispatch_queue_locked(mli, &mli->mli_v1q, 0); in mld_timeout()
1783 } else if (mli->mli_version == MLD_VERSION_2) { in mld_timeout()
1784 MLI_UNLOCK(mli); in mld_timeout()
1789 MLI_LOCK(mli); in mld_timeout()
1795 IF_DRAIN(&mli->mli_v1q); in mld_timeout()
1802 mld_flush_relq(mli, (struct mld_in6m_relhead *)&in6m_dthead); in mld_timeout()
1803 VERIFY(SLIST_EMPTY(&mli->mli_relinmhead)); in mld_timeout()
1804 mli->mli_flags |= MLIF_PROCESSED; in mld_timeout()
1805 MLI_UNLOCK(mli); in mld_timeout()
1806 MLI_REMREF(mli); in mld_timeout()
1815 mli = LIST_FIRST(&mli_head); in mld_timeout()
1818 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1822 LIST_FOREACH(mli, &mli_head, mli_link) in mld_timeout()
1823 mli->mli_flags &= ~MLIF_PROCESSED; in mld_timeout()
1854 mld_flush_relq(struct mld_ifinfo *mli, struct mld_in6m_relhead *in6m_dthead) in mld_flush_relq() argument
1859 MLI_LOCK_ASSERT_HELD(mli); in mld_flush_relq()
1860 inm = SLIST_FIRST(&mli->mli_relinmhead); in mld_flush_relq()
1864 SLIST_REMOVE_HEAD(&mli->mli_relinmhead, in6m_nrele); in mld_flush_relq()
1865 MLI_UNLOCK(mli); in mld_flush_relq()
1890 MLI_LOCK(mli); in mld_flush_relq()
1949 mld_v2_process_group_timers(struct mld_ifinfo *mli, in mld_v2_process_group_timers() argument
1958 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_process_group_timers()
1959 VERIFY(mli == inm->in6m_mli); in mld_v2_process_group_timers()
2070 SLIST_INSERT_HEAD(&mli->mli_relinmhead, in mld_v2_process_group_timers()
2083 mld_set_version(struct mld_ifinfo *mli, const int mld_version) in mld_set_version() argument
2087 MLI_LOCK_ASSERT_HELD(mli); in mld_set_version()
2090 mld_version, (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), in mld_set_version()
2091 if_name(mli->mli_ifp))); in mld_set_version()
2098 old_version_timer = (mli->mli_rv * mli->mli_qi) + mli->mli_qri; in mld_set_version()
2099 mli->mli_v1_timer = old_version_timer; in mld_set_version()
2102 if (mli->mli_v1_timer > 0 && mli->mli_version != MLD_VERSION_1) { in mld_set_version()
2103 mli->mli_version = MLD_VERSION_1; in mld_set_version()
2104 mld_v2_cancel_link_timers(mli); in mld_set_version()
2107 MLI_LOCK_ASSERT_HELD(mli); in mld_set_version()
2109 return mli->mli_v1_timer; in mld_set_version()
2122 mld_v2_cancel_link_timers(struct mld_ifinfo *mli) in mld_v2_cancel_link_timers() argument
2128 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_cancel_link_timers()
2131 (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), if_name(mli->mli_ifp))); in mld_v2_cancel_link_timers()
2138 mli->mli_v2_timer = 0; in mld_v2_cancel_link_timers()
2144 ifp = mli->mli_ifp; in mld_v2_cancel_link_timers()
2145 MLI_UNLOCK(mli); in mld_v2_cancel_link_timers()
2178 MLI_LOCK(mli); in mld_v2_cancel_link_timers()
2179 SLIST_INSERT_HEAD(&mli->mli_relinmhead, inm, in mld_v2_cancel_link_timers()
2181 MLI_UNLOCK(mli); in mld_v2_cancel_link_timers()
2204 MLI_LOCK(mli); in mld_v2_cancel_link_timers()
2212 mld_v1_process_querier_timers(struct mld_ifinfo *mli) in mld_v1_process_querier_timers() argument
2214 MLI_LOCK_ASSERT_HELD(mli); in mld_v1_process_querier_timers()
2216 if (mld_v2enable && mli->mli_version != MLD_VERSION_2 && in mld_v1_process_querier_timers()
2217 --mli->mli_v1_timer == 0) { in mld_v1_process_querier_timers()
2222 __func__, mli->mli_version, MLD_VERSION_2, in mld_v1_process_querier_timers()
2223 (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), in mld_v1_process_querier_timers()
2224 if_name(mli->mli_ifp))); in mld_v1_process_querier_timers()
2225 mli->mli_version = MLD_VERSION_2; in mld_v1_process_querier_timers()
2353 struct mld_ifinfo *mli; in mld_change_state() local
2375 mli = MLD_IFINFO(ifp); in mld_change_state()
2376 VERIFY(mli != NULL); in mld_change_state()
2388 error = mld_initial_join(inm, mli, mtp, delay); in mld_change_state()
2392 mld_final_leave(inm, mli, mtp); in mld_change_state()
2399 error = mld_handle_state_change(inm, mli, mtp); in mld_change_state()
2417 mld_initial_join(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_initial_join() argument
2426 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_initial_join()
2439 MLI_LOCK(mli); in mld_initial_join()
2440 VERIFY(mli->mli_ifp == ifp); in mld_initial_join()
2454 (mli->mli_flags & MLIF_SILENT) || in mld_initial_join()
2471 if (mli->mli_version == MLD_VERSION_2 && in mld_initial_join()
2474 SLIST_INSERT_HEAD(&mli->mli_relinmhead, inm, in mld_initial_join()
2480 switch (mli->mli_version) { in mld_initial_join()
2499 MLI_LOCK_ASSERT_HELD(mli); in mld_initial_join()
2524 0, 0, (mli->mli_flags & MLIF_USEALLOW)); in mld_initial_join()
2542 VERIFY(mli->mli_rv > 1); in mld_initial_join()
2543 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_initial_join()
2559 MLI_UNLOCK(mli); in mld_initial_join()
2580 mld_handle_state_change(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_handle_state_change() argument
2587 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_handle_state_change()
2597 MLI_LOCK(mli); in mld_handle_state_change()
2598 VERIFY(mli->mli_ifp == ifp); in mld_handle_state_change()
2601 (mli->mli_flags & MLIF_SILENT) || in mld_handle_state_change()
2603 (mli->mli_version != MLD_VERSION_2)) { in mld_handle_state_change()
2604 MLI_UNLOCK(mli); in mld_handle_state_change()
2620 (mli->mli_flags & MLIF_USEALLOW)); in mld_handle_state_change()
2624 MLI_UNLOCK(mli); in mld_handle_state_change()
2635 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_handle_state_change()
2638 MLI_UNLOCK(mli); in mld_handle_state_change()
2653 mld_final_leave(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_final_leave() argument
2659 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_final_leave()
2679 MLI_LOCK(mli); in mld_final_leave()
2680 if (mli->mli_version == MLD_VERSION_1) { in mld_final_leave()
2692 MLI_LOCK_ASSERT_HELD(mli); in mld_final_leave()
2695 } else if (mli->mli_version == MLD_VERSION_2) { in mld_final_leave()
2704 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_final_leave()
2730 (mli->mli_flags & MLIF_USEALLOW)); in mld_final_leave()
2742 MLI_UNLOCK(mli); in mld_final_leave()
3519 mld_v2_dispatch_general_query(struct mld_ifinfo *mli) in mld_v2_dispatch_general_query() argument
3526 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_dispatch_general_query()
3528 VERIFY(mli->mli_version == MLD_VERSION_2); in mld_v2_dispatch_general_query()
3530 ifp = mli->mli_ifp; in mld_v2_dispatch_general_query()
3531 MLI_UNLOCK(mli); in mld_v2_dispatch_general_query()
3551 MLI_LOCK(mli); in mld_v2_dispatch_general_query()
3552 retval = mld_v2_enqueue_group_record(&mli->mli_gq, in mld_v2_dispatch_general_query()
3554 MLI_UNLOCK(mli); in mld_v2_dispatch_general_query()
3569 MLI_LOCK(mli); in mld_v2_dispatch_general_query()
3570 mld_dispatch_queue_locked(mli, &mli->mli_gq, MLD_MAX_RESPONSE_BURST); in mld_v2_dispatch_general_query()
3571 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_dispatch_general_query()
3576 if (mli->mli_gq.ifq_head != NULL) { in mld_v2_dispatch_general_query()
3577 mli->mli_v2_timer = 1 + MLD_RANDOM_DELAY( in mld_v2_dispatch_general_query()
3581 return mli->mli_v2_timer; in mld_v2_dispatch_general_query()