Lines Matching refs:mli

387 	struct mld_ifinfo       *mli;  variable
412 LIST_FOREACH(mli, &mli_head, mli_link) {
413 MLI_LOCK(mli);
414 if (ifp != mli->mli_ifp) {
415 MLI_UNLOCK(mli);
419 mli_u.mli_ifindex = mli->mli_ifp->if_index;
420 mli_u.mli_version = mli->mli_version;
421 mli_u.mli_v1_timer = mli->mli_v1_timer;
422 mli_u.mli_v2_timer = mli->mli_v2_timer;
423 mli_u.mli_flags = mli->mli_flags;
424 mli_u.mli_rv = mli->mli_rv;
425 mli_u.mli_qi = mli->mli_qi;
426 mli_u.mli_qri = mli->mli_qri;
427 mli_u.mli_uri = mli->mli_uri;
428 MLI_UNLOCK(mli);
445 struct mld_ifinfo *mli; variable
472 LIST_FOREACH(mli, &mli_head, mli_link) {
473 MLI_LOCK(mli);
474 if (mld_set_version(mli, MLD_VERSION_1) > 0) {
477 MLI_UNLOCK(mli);
500 mld_dispatch_queue_locked(struct mld_ifinfo *mli, struct ifqueue *ifq, int limit) in mld_dispatch_queue_locked() argument
506 if (mli != NULL) { in mld_dispatch_queue_locked()
507 MLI_LOCK_ASSERT_HELD(mli); in mld_dispatch_queue_locked()
519 if (mli != NULL) { in mld_dispatch_queue_locked()
520 MLI_UNLOCK(mli); in mld_dispatch_queue_locked()
527 if (mli != NULL) { in mld_dispatch_queue_locked()
528 MLI_LOCK(mli); in mld_dispatch_queue_locked()
536 if (mli != NULL) { in mld_dispatch_queue_locked()
537 MLI_LOCK_ASSERT_HELD(mli); in mld_dispatch_queue_locked()
579 struct mld_ifinfo *mli; in mld_domifattach() local
584 mli = mli_alloc(how); in mld_domifattach()
585 if (mli == NULL) { in mld_domifattach()
591 MLI_LOCK(mli); in mld_domifattach()
592 mli_initvar(mli, ifp, 0); in mld_domifattach()
593 mli->mli_debug |= IFD_ATTACHED; in mld_domifattach()
594 MLI_ADDREF_LOCKED(mli); /* hold a reference for mli_head */ in mld_domifattach()
595 MLI_ADDREF_LOCKED(mli); /* hold a reference for caller */ in mld_domifattach()
596 MLI_UNLOCK(mli); in mld_domifattach()
598 mld6_initsilent(ifp, mli); in mld_domifattach()
601 LIST_INSERT_HEAD(&mli_head, mli, mli_link); in mld_domifattach()
609 return mli; in mld_domifattach()
617 mld_domifreattach(struct mld_ifinfo *mli) in mld_domifreattach() argument
623 MLI_LOCK(mli); in mld_domifreattach()
624 VERIFY(!(mli->mli_debug & IFD_ATTACHED)); in mld_domifreattach()
625 ifp = mli->mli_ifp; in mld_domifreattach()
627 mli_initvar(mli, ifp, 1); in mld_domifreattach()
628 mli->mli_debug |= IFD_ATTACHED; in mld_domifreattach()
629 MLI_ADDREF_LOCKED(mli); /* hold a reference for mli_head */ in mld_domifreattach()
630 MLI_UNLOCK(mli); in mld_domifreattach()
632 mld6_initsilent(ifp, mli); in mld_domifreattach()
635 LIST_INSERT_HEAD(&mli_head, mli, mli_link); in mld_domifreattach()
674 struct mld_ifinfo *mli, *tmli; in mli_delete() local
678 LIST_FOREACH_SAFE(mli, &mli_head, mli_link, tmli) { in mli_delete()
679 MLI_LOCK(mli); in mli_delete()
680 if (mli->mli_ifp == ifp) { in mli_delete()
684 IF_DRAIN(&mli->mli_gq); in mli_delete()
685 IF_DRAIN(&mli->mli_v1q); in mli_delete()
686 mld_flush_relq(mli, in6m_dthead); in mli_delete()
687 mli->mli_debug &= ~IFD_ATTACHED; in mli_delete()
688 MLI_UNLOCK(mli); in mli_delete()
690 LIST_REMOVE(mli, mli_link); in mli_delete()
691 MLI_REMREF(mli); /* release mli_head reference */ in mli_delete()
695 MLI_UNLOCK(mli); in mli_delete()
702 mld6_initsilent(struct ifnet *ifp, struct mld_ifinfo *mli) in mld6_initsilent() argument
706 MLI_LOCK_ASSERT_NOTHELD(mli); in mld6_initsilent()
707 MLI_LOCK(mli); in mld6_initsilent()
710 mli->mli_flags |= MLIF_SILENT; in mld6_initsilent()
712 mli->mli_flags &= ~MLIF_SILENT; in mld6_initsilent()
714 MLI_UNLOCK(mli); in mld6_initsilent()
718 mli_initvar(struct mld_ifinfo *mli, struct ifnet *ifp, int reattach) in mli_initvar() argument
720 MLI_LOCK_ASSERT_HELD(mli); in mli_initvar()
722 mli->mli_ifp = ifp; in mli_initvar()
724 mli->mli_version = MLD_VERSION_2; in mli_initvar()
726 mli->mli_version = MLD_VERSION_1; in mli_initvar()
728 mli->mli_flags = 0; in mli_initvar()
729 mli->mli_rv = MLD_RV_INIT; in mli_initvar()
730 mli->mli_qi = MLD_QI_INIT; in mli_initvar()
731 mli->mli_qri = MLD_QRI_INIT; in mli_initvar()
732 mli->mli_uri = MLD_URI_INIT; in mli_initvar()
735 mli->mli_flags |= MLIF_USEALLOW; in mli_initvar()
738 SLIST_INIT(&mli->mli_relinmhead); in mli_initvar()
744 mli->mli_gq.ifq_maxlen = MLD_MAX_RESPONSE_PACKETS; in mli_initvar()
745 mli->mli_v1q.ifq_maxlen = MLD_MAX_RESPONSE_PACKETS; in mli_initvar()
751 struct mld_ifinfo *mli = zalloc_flags(mli_zone, how | Z_ZERO); in mli_alloc() local
752 if (mli != NULL) { in mli_alloc()
753 lck_mtx_init(&mli->mli_lock, &mld_mtx_grp, &mld_mtx_attr); in mli_alloc()
754 mli->mli_debug |= IFD_ALLOC; in mli_alloc()
756 return mli; in mli_alloc()
760 mli_free(struct mld_ifinfo *mli) in mli_free() argument
762 MLI_LOCK(mli); in mli_free()
763 if (mli->mli_debug & IFD_ATTACHED) { in mli_free()
764 panic("%s: attached mli=%p is being freed", __func__, mli); in mli_free()
766 } else if (mli->mli_ifp != NULL) { in mli_free()
767 panic("%s: ifp not NULL for mli=%p", __func__, mli); in mli_free()
769 } else if (!(mli->mli_debug & IFD_ALLOC)) { in mli_free()
770 panic("%s: mli %p cannot be freed", __func__, mli); in mli_free()
772 } else if (mli->mli_refcnt != 0) { in mli_free()
773 panic("%s: non-zero refcnt mli=%p", __func__, mli); in mli_free()
776 mli->mli_debug &= ~IFD_ALLOC; in mli_free()
777 MLI_UNLOCK(mli); in mli_free()
779 lck_mtx_destroy(&mli->mli_lock, &mld_mtx_grp); in mli_free()
780 zfree(mli_zone, mli); in mli_free()
784 mli_addref(struct mld_ifinfo *mli, int locked) in mli_addref() argument
787 MLI_LOCK_SPIN(mli); in mli_addref()
789 MLI_LOCK_ASSERT_HELD(mli); in mli_addref()
792 if (++mli->mli_refcnt == 0) { in mli_addref()
793 panic("%s: mli=%p wraparound refcnt", __func__, mli); in mli_addref()
797 MLI_UNLOCK(mli); in mli_addref()
802 mli_remref(struct mld_ifinfo *mli) in mli_remref() argument
807 MLI_LOCK_SPIN(mli); in mli_remref()
809 if (mli->mli_refcnt == 0) { in mli_remref()
810 panic("%s: mli=%p negative refcnt", __func__, mli); in mli_remref()
814 --mli->mli_refcnt; in mli_remref()
815 if (mli->mli_refcnt > 0) { in mli_remref()
816 MLI_UNLOCK(mli); in mli_remref()
820 ifp = mli->mli_ifp; in mli_remref()
821 mli->mli_ifp = NULL; in mli_remref()
822 IF_DRAIN(&mli->mli_gq); in mli_remref()
823 IF_DRAIN(&mli->mli_v1q); in mli_remref()
825 mld_flush_relq(mli, (struct mld_in6m_relhead *)&in6m_dthead); in mli_remref()
826 MLI_UNLOCK(mli); in mli_remref()
834 mli_free(mli); in mli_remref()
848 struct mld_ifinfo *mli; in mld_v1_input_query() local
904 mli = MLD_IFINFO(ifp); in mld_v1_input_query()
905 VERIFY(mli != NULL); in mld_v1_input_query()
907 MLI_LOCK(mli); in mld_v1_input_query()
908 mtp.qpt = mld_set_version(mli, MLD_VERSION_1); in mld_v1_input_query()
909 MLI_UNLOCK(mli); in mld_v1_input_query()
1033 struct mld_ifinfo *mli; in mld_v2_input_query() local
1126 mli = MLD_IFINFO(ifp); in mld_v2_input_query()
1127 VERIFY(mli != NULL); in mld_v2_input_query()
1129 MLI_LOCK(mli); in mld_v2_input_query()
1135 if (mli->mli_version != MLD_VERSION_2) { in mld_v2_input_query()
1136 MLI_UNLOCK(mli); in mld_v2_input_query()
1140 mtp.qpt = mld_set_version(mli, MLD_VERSION_2); in mld_v2_input_query()
1141 mli->mli_rv = qrv; in mld_v2_input_query()
1142 mli->mli_qi = qqi; in mld_v2_input_query()
1143 mli->mli_qri = MAX(timer, MLD_QRI_MIN); in mld_v2_input_query()
1145 MLD_PRINTF(("%s: qrv %d qi %d qri %d\n", __func__, mli->mli_rv, in mld_v2_input_query()
1146 mli->mli_qi, mli->mli_qri)); in mld_v2_input_query()
1162 if (mli->mli_v2_timer == 0 || mli->mli_v2_timer >= timer) { in mld_v2_input_query()
1163 mtp.it = mli->mli_v2_timer = MLD_RANDOM_DELAY(timer); in mld_v2_input_query()
1165 MLI_UNLOCK(mli); in mld_v2_input_query()
1167 MLI_UNLOCK(mli); in mld_v2_input_query()
1203 MLI_LOCK(mli); in mld_v2_input_query()
1204 mtp.it = mli->mli_v2_timer; in mld_v2_input_query()
1205 MLI_UNLOCK(mli); in mld_v2_input_query()
1438 struct mld_ifinfo *mli; in mld_v1_input_report() local
1441 mli = inm->in6m_mli; in mld_v1_input_report()
1442 VERIFY(mli != NULL); in mld_v1_input_report()
1444 MLI_LOCK(mli); in mld_v1_input_report()
1449 if (mli->mli_version == MLD_VERSION_2) { in mld_v1_input_report()
1450 MLI_UNLOCK(mli); in mld_v1_input_report()
1455 MLI_UNLOCK(mli); in mld_v1_input_report()
1619 struct mld_ifinfo *mli; in mld_timeout() local
1655 LIST_FOREACH(mli, &mli_head, mli_link) { in mld_timeout()
1656 MLI_LOCK(mli); in mld_timeout()
1657 mld_v1_process_querier_timers(mli); in mld_timeout()
1658 if (mli->mli_v1_timer > 0) { in mld_timeout()
1661 MLI_UNLOCK(mli); in mld_timeout()
1671 mli = LIST_FIRST(&mli_head); in mld_timeout()
1673 while (mli != NULL) { in mld_timeout()
1674 if (mli->mli_flags & MLIF_PROCESSED) { in mld_timeout()
1675 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1679 MLI_LOCK(mli); in mld_timeout()
1680 if (mli->mli_version != MLD_VERSION_2) { in mld_timeout()
1681 MLI_UNLOCK(mli); in mld_timeout()
1682 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1693 MLI_ADDREF_LOCKED(mli); in mld_timeout()
1695 if (mli->mli_v2_timer == 0) { in mld_timeout()
1697 } else if (--mli->mli_v2_timer == 0) { in mld_timeout()
1698 if (mld_v2_dispatch_general_query(mli) > 0) { in mld_timeout()
1704 mli->mli_flags |= MLIF_PROCESSED; in mld_timeout()
1705 MLI_UNLOCK(mli); in mld_timeout()
1706 MLI_REMREF(mli); in mld_timeout()
1712 mli = LIST_FIRST(&mli_head); in mld_timeout()
1715 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1719 LIST_FOREACH(mli, &mli_head, mli_link) in mld_timeout()
1720 mli->mli_flags &= ~MLIF_PROCESSED; in mld_timeout()
1744 mli = LIST_FIRST(&mli_head); in mld_timeout()
1746 while (mli != NULL) { in mld_timeout()
1749 if (mli->mli_flags & MLIF_PROCESSED) { in mld_timeout()
1750 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1754 MLI_LOCK(mli); in mld_timeout()
1755 ifp = mli->mli_ifp; in mld_timeout()
1756 uri_sec = MLD_RANDOM_DELAY(mli->mli_uri); in mld_timeout()
1757 MLI_UNLOCK(mli); in mld_timeout()
1767 MLI_LOCK(mli); in mld_timeout()
1768 switch (mli->mli_version) { in mld_timeout()
1771 mli->mli_version); in mld_timeout()
1774 mld_v2_process_group_timers(mli, &qrq, in mld_timeout()
1778 MLI_UNLOCK(mli); in mld_timeout()
1793 MLI_LOCK(mli); in mld_timeout()
1794 MLI_ADDREF_LOCKED(mli); in mld_timeout()
1795 if (mli->mli_version == MLD_VERSION_1) { in mld_timeout()
1796 mld_dispatch_queue_locked(mli, &mli->mli_v1q, 0); in mld_timeout()
1797 } else if (mli->mli_version == MLD_VERSION_2) { in mld_timeout()
1798 MLI_UNLOCK(mli); in mld_timeout()
1803 MLI_LOCK(mli); in mld_timeout()
1809 IF_DRAIN(&mli->mli_v1q); in mld_timeout()
1816 mld_flush_relq(mli, (struct mld_in6m_relhead *)&in6m_dthead); in mld_timeout()
1817 mli->mli_flags |= MLIF_PROCESSED; in mld_timeout()
1818 MLI_UNLOCK(mli); in mld_timeout()
1819 MLI_REMREF(mli); in mld_timeout()
1828 mli = LIST_FIRST(&mli_head); in mld_timeout()
1831 mli = LIST_NEXT(mli, mli_link); in mld_timeout()
1835 LIST_FOREACH(mli, &mli_head, mli_link) in mld_timeout()
1836 mli->mli_flags &= ~MLIF_PROCESSED; in mld_timeout()
1907 mld_append_relq(struct mld_ifinfo *mli, struct in6_multi *inm) in mld_append_relq() argument
1909 MLI_LOCK_ASSERT_HELD(mli); in mld_append_relq()
1913 mli->mli_ifp != NULL ? if_name(mli->mli_ifp) : "<null>"); in mld_append_relq()
1918 mli->mli_ifp != NULL ? if_name(mli->mli_ifp) : "<null>"); in mld_append_relq()
1920 SLIST_INSERT_HEAD(&mli->mli_relinmhead, inm, in6m_nrele); in mld_append_relq()
1929 mld_flush_relq(struct mld_ifinfo *mli, struct mld_in6m_relhead *in6m_dthead) in mld_flush_relq() argument
1939 MLI_LOCK_ASSERT_HELD(mli); in mld_flush_relq()
1941 while ((inm = SLIST_FIRST(&mli->mli_relinmhead)) != NULL) { in mld_flush_relq()
1942 SLIST_REMOVE_HEAD(&mli->mli_relinmhead, in6m_nrele); in mld_flush_relq()
1945 MLI_UNLOCK(mli); in mld_flush_relq()
1979 MLI_LOCK(mli); in mld_flush_relq()
2036 mld_v2_process_group_timers(struct mld_ifinfo *mli, in mld_v2_process_group_timers() argument
2045 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_process_group_timers()
2046 VERIFY(mli == inm->in6m_mli); in mld_v2_process_group_timers()
2157 mld_append_relq(mli, inm); in mld_v2_process_group_timers()
2169 mld_set_version(struct mld_ifinfo *mli, const int mld_version) in mld_set_version() argument
2173 MLI_LOCK_ASSERT_HELD(mli); in mld_set_version()
2176 mld_version, if_name(mli->mli_ifp)); in mld_set_version()
2183 old_version_timer = (mli->mli_rv * mli->mli_qi) + mli->mli_qri; in mld_set_version()
2184 mli->mli_v1_timer = old_version_timer; in mld_set_version()
2187 if (mli->mli_v1_timer > 0 && mli->mli_version != MLD_VERSION_1) { in mld_set_version()
2188 mli->mli_version = MLD_VERSION_1; in mld_set_version()
2189 mld_v2_cancel_link_timers(mli); in mld_set_version()
2192 MLI_LOCK_ASSERT_HELD(mli); in mld_set_version()
2194 return mli->mli_v1_timer; in mld_set_version()
2207 mld_v2_cancel_link_timers(struct mld_ifinfo *mli) in mld_v2_cancel_link_timers() argument
2213 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_cancel_link_timers()
2216 (uint64_t)VM_KERNEL_ADDRPERM(mli->mli_ifp), if_name(mli->mli_ifp))); in mld_v2_cancel_link_timers()
2223 mli->mli_v2_timer = 0; in mld_v2_cancel_link_timers()
2229 ifp = mli->mli_ifp; in mld_v2_cancel_link_timers()
2230 MLI_UNLOCK(mli); in mld_v2_cancel_link_timers()
2263 MLI_LOCK(mli); in mld_v2_cancel_link_timers()
2264 mld_append_relq(mli, inm); in mld_v2_cancel_link_timers()
2265 MLI_UNLOCK(mli); in mld_v2_cancel_link_timers()
2288 MLI_LOCK(mli); in mld_v2_cancel_link_timers()
2296 mld_v1_process_querier_timers(struct mld_ifinfo *mli) in mld_v1_process_querier_timers() argument
2298 MLI_LOCK_ASSERT_HELD(mli); in mld_v1_process_querier_timers()
2300 if (mld_v2enable && mli->mli_version != MLD_VERSION_2 && in mld_v1_process_querier_timers()
2301 --mli->mli_v1_timer == 0) { in mld_v1_process_querier_timers()
2306 __func__, mli->mli_version, MLD_VERSION_2, in mld_v1_process_querier_timers()
2307 if_name(mli->mli_ifp)); in mld_v1_process_querier_timers()
2308 mli->mli_version = MLD_VERSION_2; in mld_v1_process_querier_timers()
2436 struct mld_ifinfo *mli; in mld_change_state() local
2458 mli = MLD_IFINFO(ifp); in mld_change_state()
2459 VERIFY(mli != NULL); in mld_change_state()
2471 error = mld_initial_join(inm, mli, mtp, delay); in mld_change_state()
2475 mld_final_leave(inm, mli, mtp); in mld_change_state()
2482 error = mld_handle_state_change(inm, mli, mtp); in mld_change_state()
2500 mld_initial_join(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_initial_join() argument
2509 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_initial_join()
2522 MLI_LOCK(mli); in mld_initial_join()
2523 VERIFY(mli->mli_ifp == ifp); in mld_initial_join()
2537 (mli->mli_flags & MLIF_SILENT) || in mld_initial_join()
2554 if (mli->mli_version == MLD_VERSION_2 && in mld_initial_join()
2557 mld_append_relq(mli, inm); in mld_initial_join()
2562 switch (mli->mli_version) { in mld_initial_join()
2581 MLI_LOCK_ASSERT_HELD(mli); in mld_initial_join()
2606 0, 0, (mli->mli_flags & MLIF_USEALLOW)); in mld_initial_join()
2624 VERIFY(mli->mli_rv > 1); in mld_initial_join()
2625 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_initial_join()
2641 MLI_UNLOCK(mli); in mld_initial_join()
2662 mld_handle_state_change(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_handle_state_change() argument
2669 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_handle_state_change()
2679 MLI_LOCK(mli); in mld_handle_state_change()
2680 VERIFY(mli->mli_ifp == ifp); in mld_handle_state_change()
2683 (mli->mli_flags & MLIF_SILENT) || in mld_handle_state_change()
2685 (mli->mli_version != MLD_VERSION_2)) { in mld_handle_state_change()
2686 MLI_UNLOCK(mli); in mld_handle_state_change()
2702 (mli->mli_flags & MLIF_USEALLOW)); in mld_handle_state_change()
2706 MLI_UNLOCK(mli); in mld_handle_state_change()
2717 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_handle_state_change()
2720 MLI_UNLOCK(mli); in mld_handle_state_change()
2735 mld_final_leave(struct in6_multi *inm, struct mld_ifinfo *mli, in mld_final_leave() argument
2741 MLI_LOCK_ASSERT_NOTHELD(mli); in mld_final_leave()
2761 MLI_LOCK(mli); in mld_final_leave()
2762 if (mli->mli_version == MLD_VERSION_1) { in mld_final_leave()
2774 MLI_LOCK_ASSERT_HELD(mli); in mld_final_leave()
2777 } else if (mli->mli_version == MLD_VERSION_2) { in mld_final_leave()
2786 inm->in6m_scrv = (uint16_t)mli->mli_rv; in mld_final_leave()
2812 (mli->mli_flags & MLIF_USEALLOW)); in mld_final_leave()
2824 MLI_UNLOCK(mli); in mld_final_leave()
3602 mld_v2_dispatch_general_query(struct mld_ifinfo *mli) in mld_v2_dispatch_general_query() argument
3609 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_dispatch_general_query()
3611 VERIFY(mli->mli_version == MLD_VERSION_2); in mld_v2_dispatch_general_query()
3613 ifp = mli->mli_ifp; in mld_v2_dispatch_general_query()
3614 MLI_UNLOCK(mli); in mld_v2_dispatch_general_query()
3634 MLI_LOCK(mli); in mld_v2_dispatch_general_query()
3635 retval = mld_v2_enqueue_group_record(&mli->mli_gq, in mld_v2_dispatch_general_query()
3637 MLI_UNLOCK(mli); in mld_v2_dispatch_general_query()
3652 MLI_LOCK(mli); in mld_v2_dispatch_general_query()
3653 mld_dispatch_queue_locked(mli, &mli->mli_gq, MLD_MAX_RESPONSE_BURST); in mld_v2_dispatch_general_query()
3654 MLI_LOCK_ASSERT_HELD(mli); in mld_v2_dispatch_general_query()
3659 if (mli->mli_gq.ifq_head != NULL) { in mld_v2_dispatch_general_query()
3660 mli->mli_v2_timer = 1 + MLD_RANDOM_DELAY( in mld_v2_dispatch_general_query()
3664 return mli->mli_v2_timer; in mld_v2_dispatch_general_query()