Lines Matching refs:mli

358 	struct mld_ifinfo	*mli;
387 LIST_FOREACH(mli, &mli_head, mli_link) {
388 MLI_LOCK(mli);
389 if (ifp != mli->mli_ifp) {
390 MLI_UNLOCK(mli);
394 mli_u.mli_ifindex = mli->mli_ifp->if_index;
395 mli_u.mli_version = mli->mli_version;
396 mli_u.mli_v1_timer = mli->mli_v1_timer;
397 mli_u.mli_v2_timer = mli->mli_v2_timer;
398 mli_u.mli_flags = mli->mli_flags;
399 mli_u.mli_rv = mli->mli_rv;
400 mli_u.mli_qi = mli->mli_qi;
401 mli_u.mli_qri = mli->mli_qri;
402 mli_u.mli_uri = mli->mli_uri;
403 MLI_UNLOCK(mli);
420 mld_dispatch_queue(struct mld_ifinfo *mli, struct ifqueue *ifq, int limit)
424 if (mli != NULL)
425 MLI_LOCK_ASSERT_HELD(mli);
432 if (mli != NULL)
433 MLI_UNLOCK(mli);
435 if (mli != NULL)
436 MLI_LOCK(mli);
441 if (mli != NULL)
442 MLI_LOCK_ASSERT_HELD(mli);
482 struct mld_ifinfo *mli;
487 mli = mli_alloc(how);
488 if (mli == NULL)
493 MLI_LOCK(mli);
494 mli_initvar(mli, ifp, 0);
495 mli->mli_debug |= IFD_ATTACHED;
496 MLI_ADDREF_LOCKED(mli); /* hold a reference for mli_head */
497 MLI_ADDREF_LOCKED(mli); /* hold a reference for caller */
498 MLI_UNLOCK(mli);
500 mld6_initsilent(ifp, mli);
503 LIST_INSERT_HEAD(&mli_head, mli, mli_link);
510 return (mli);
515 * expected to have an outstanding reference to the mli.
518 mld_domifreattach(struct mld_ifinfo *mli)
524 MLI_LOCK(mli);
525 VERIFY(!(mli->mli_debug & IFD_ATTACHED));
526 ifp = mli->mli_ifp;
528 mli_initvar(mli, ifp, 1);
529 mli->mli_debug |= IFD_ATTACHED;
530 MLI_ADDREF_LOCKED(mli); /* hold a reference for mli_head */
531 MLI_UNLOCK(mli);
533 mld6_initsilent(ifp, mli);
536 LIST_INSERT_HEAD(&mli_head, mli, mli_link);
574 struct mld_ifinfo *mli, *tmli;
578 LIST_FOREACH_SAFE(mli, &mli_head, mli_link, tmli) {
579 MLI_LOCK(mli);
580 if (mli->mli_ifp == ifp) {
584 IF_DRAIN(&mli->mli_gq);
585 IF_DRAIN(&mli->mli_v1q);
586 mld_flush_relq(mli, in6m_dthead);
587 VERIFY(SLIST_EMPTY(&mli->mli_relinmhead));
588 mli->mli_debug &= ~IFD_ATTACHED;
589 MLI_UNLOCK(mli);
591 LIST_REMOVE(mli, mli_link);
592 MLI_REMREF(mli); /* release mli_head reference */
595 MLI_UNLOCK(mli);
601 mld6_initsilent(struct ifnet *ifp, struct mld_ifinfo *mli)
605 MLI_LOCK_ASSERT_NOTHELD(mli);
606 MLI_LOCK(mli);
609 mli->mli_flags |= MLIF_SILENT;
611 mli->mli_flags &= ~MLIF_SILENT;
612 MLI_UNLOCK(mli);
616 mli_initvar(struct mld_ifinfo *mli, struct ifnet *ifp, int reattach)
618 MLI_LOCK_ASSERT_HELD(mli);
620 mli->mli_ifp = ifp;
621 mli->mli_version = MLD_VERSION_2;
622 mli->mli_flags = 0;
623 mli->mli_rv = MLD_RV_INIT;
624 mli->mli_qi = MLD_QI_INIT;
625 mli->mli_qri = MLD_QRI_INIT;
626 mli->mli_uri = MLD_URI_INIT;
629 mli->mli_flags |= MLIF_USEALLOW;
631 SLIST_INIT(&mli->mli_relinmhead);
636 mli->mli_gq.ifq_maxlen = MLD_MAX_RESPONSE_PACKETS;
637 mli->mli_v1q.ifq_maxlen = MLD_MAX_RESPONSE_PACKETS;
643 struct mld_ifinfo *mli;
645 mli = (how == M_WAITOK) ? zalloc(mli_zone) : zalloc_noblock(mli_zone);
646 if (mli != NULL) {
647 bzero(mli, mli_size);
648 lck_mtx_init(&mli->mli_lock, mld_mtx_grp, mld_mtx_attr);
649 mli->mli_debug |= IFD_ALLOC;
651 return (mli);
655 mli_free(struct mld_ifinfo *mli)
657 MLI_LOCK(mli);
658 if (mli->mli_debug & IFD_ATTACHED) {
659 panic("%s: attached mli=%p is being freed", __func__, mli);
661 } else if (mli->mli_ifp != NULL) {
662 panic("%s: ifp not NULL for mli=%p", __func__, mli);
664 } else if (!(mli->mli_debug & IFD_ALLOC)) {
665 panic("%s: mli %p cannot be freed", __func__, mli);
667 } else if (mli->mli_refcnt != 0) {
668 panic("%s: non-zero refcnt mli=%p", __func__, mli);
671 mli->mli_debug &= ~IFD_ALLOC;
672 MLI_UNLOCK(mli);
674 lck_mtx_destroy(&mli->mli_lock, mld_mtx_grp);
675 zfree(mli_zone, mli);
679 mli_addref(struct mld_ifinfo *mli, int locked)
682 MLI_LOCK_SPIN(mli);
684 MLI_LOCK_ASSERT_HELD(mli);
686 if (++mli->mli_refcnt == 0) {
687 panic("%s: mli=%p wraparound refcnt", __func__, mli);
691 MLI_UNLOCK(mli);
695 mli_remref(struct mld_ifinfo *mli)
700 MLI_LOCK_SPIN(mli);
702 if (mli->mli_refcnt == 0) {
703 panic("%s: mli=%p negative refcnt", __func__, mli);
707 --mli->mli_refcnt;
708 if (mli->mli_refcnt > 0) {
709 MLI_UNLOCK(mli);
713 ifp = mli->mli_ifp;
714 mli->mli_ifp = NULL;
715 IF_DRAIN(&mli->mli_gq);
716 IF_DRAIN(&mli->mli_v1q);
718 mld_flush_relq(mli, (struct mld_in6m_relhead *)&in6m_dthead);
719 VERIFY(SLIST_EMPTY(&mli->mli_relinmhead));
720 MLI_UNLOCK(mli);
728 mli_free(mli);
742 struct mld_ifinfo *mli;
794 mli = MLD_IFINFO(ifp);
795 VERIFY(mli != NULL);
797 MLI_LOCK(mli);
798 mld_set_version(mli, MLD_VERSION_1);
799 MLI_UNLOCK(mli);
917 struct mld_ifinfo *mli;
999 mli = MLD_IFINFO(ifp);
1000 VERIFY(mli != NULL);
1002 MLI_LOCK(mli);
1008 if (mli->mli_version != MLD_VERSION_2) {
1009 MLI_UNLOCK(mli);
1013 mld_set_version(mli, MLD_VERSION_2);
1014 mli->mli_rv = qrv;
1015 mli->mli_qi = qqi;
1016 mli->mli_qri = maxdelay;
1035 if (mli->mli_v2_timer == 0 || mli->mli_v2_timer >= timer) {
1036 mli->mli_v2_timer = MLD_RANDOM_DELAY(timer);
1039 MLI_UNLOCK(mli);
1041 MLI_UNLOCK(mli);
1079 MLI_LOCK(mli);
1080 if (mli->mli_v2_timer == 0 || mli->mli_v2_timer >= timer) {
1081 MLI_UNLOCK(mli);
1084 MLI_UNLOCK(mli);
1304 struct mld_ifinfo *mli;
1307 mli = inm->in6m_mli;
1308 VERIFY(mli != NULL);
1310 MLI_LOCK(mli);
1315 if (mli->mli_version == MLD_VERSION_2) {
1316 MLI_UNLOCK(mli);
1321 MLI_UNLOCK(mli);
1439 struct mld_ifinfo *mli;
1448 LIST_FOREACH(mli, &mli_head, mli_link) {
1449 MLI_LOCK(mli);
1450 mld_v1_process_querier_timers(mli);
1451 MLI_UNLOCK(mli);
1473 LIST_FOREACH(mli, &mli_head, mli_link) {
1474 MLI_LOCK(mli);
1475 if (mli->mli_v2_timer == 0) {
1477 } else if (--mli->mli_v2_timer == 0) {
1478 mld_v2_dispatch_general_query(mli);
1482 MLI_UNLOCK(mli);
1506 LIST_FOREACH(mli, &mli_head, mli_link) {
1509 MLI_LOCK(mli);
1510 ifp = mli->mli_ifp;
1511 uri_fasthz = MLD_RANDOM_DELAY(mli->mli_uri * PR_SLOWHZ);
1512 MLI_UNLOCK(mli);
1521 MLI_LOCK(mli);
1522 switch (mli->mli_version) {
1525 mli->mli_version);
1528 mld_v2_process_group_timers(mli, &qrq,
1532 MLI_UNLOCK(mli);
1539 MLI_LOCK(mli);
1540 if (mli->mli_version == MLD_VERSION_1) {
1541 mld_dispatch_queue(mli, &mli->mli_v1q, 0);
1542 } else if (mli->mli_version == MLD_VERSION_2) {
1543 MLI_UNLOCK(mli);
1548 MLI_LOCK(mli);
1554 IF_DRAIN(&mli->mli_v1q);
1561 mld_flush_relq(mli, (struct mld_in6m_relhead *)&in6m_dthead);
1562 VERIFY(SLIST_EMPTY(&mli->mli_relinmhead));
1563 MLI_UNLOCK(mli);
1582 mld_flush_relq(struct mld_ifinfo *mli, struct mld_in6m_relhead *in6m_dthead)
1587 MLI_LOCK_ASSERT_HELD(mli);
1588 inm = SLIST_FIRST(&mli->mli_relinmhead);
1592 SLIST_REMOVE_HEAD(&mli->mli_relinmhead, in6m_nrele);
1593 MLI_UNLOCK(mli);
1618 MLI_LOCK(mli);
1672 * Note: Unlocked read from mli.
1675 mld_v2_process_group_timers(struct mld_ifinfo *mli,
1683 MLI_LOCK_ASSERT_HELD(mli);
1684 VERIFY(mli == inm->in6m_mli);
1791 SLIST_INSERT_HEAD(&mli->mli_relinmhead,
1804 mld_set_version(struct mld_ifinfo *mli, const int mld_version)
1808 MLI_LOCK_ASSERT_HELD(mli);
1811 mld_version, mli->mli_ifp, mli->mli_ifp->if_name,
1812 mli->mli_ifp->if_unit));
1819 old_version_timer = (mli->mli_rv * mli->mli_qi) + mli->mli_qri;
1821 mli->mli_v1_timer = old_version_timer;
1824 if (mli->mli_v1_timer > 0 && mli->mli_version != MLD_VERSION_1) {
1825 mli->mli_version = MLD_VERSION_1;
1826 mld_v2_cancel_link_timers(mli);
1829 MLI_LOCK_ASSERT_HELD(mli);
1837 mld_v2_cancel_link_timers(struct mld_ifinfo *mli)
1843 MLI_LOCK_ASSERT_HELD(mli);
1846 mli->mli_ifp, mli->mli_ifp->if_name, mli->mli_ifp->if_unit));
1857 mli->mli_v2_timer = 0;
1858 ifp = mli->mli_ifp;
1859 MLI_UNLOCK(mli);
1887 MLI_LOCK(mli);
1888 SLIST_INSERT_HEAD(&mli->mli_relinmhead, inm,
1890 MLI_UNLOCK(mli);
1912 MLI_LOCK(mli);
1920 mld_v1_process_querier_timers(struct mld_ifinfo *mli)
1922 MLI_LOCK_ASSERT_HELD(mli);
1924 if (mli->mli_version != MLD_VERSION_2 && --mli->mli_v1_timer == 0) {
1929 __func__, mli->mli_version, MLD_VERSION_2,
1930 mli->mli_ifp, mli->mli_ifp->if_name, mli->mli_ifp->if_unit));
1931 mli->mli_version = MLD_VERSION_2;
2050 struct mld_ifinfo *mli;
2069 mli = MLD_IFINFO(ifp);
2070 VERIFY(mli != NULL);
2082 error = mld_initial_join(inm, mli, delay);
2086 mld_final_leave(inm, mli);
2093 error = mld_handle_state_change(inm, mli);
2112 mld_initial_join(struct in6_multi *inm, struct mld_ifinfo *mli,
2121 MLI_LOCK_ASSERT_NOTHELD(mli);
2132 MLI_LOCK(mli);
2133 VERIFY(mli->mli_ifp == ifp);
2145 (mli->mli_flags & MLIF_SILENT) ||
2160 if (mli->mli_version == MLD_VERSION_2 &&
2163 SLIST_INSERT_HEAD(&mli->mli_relinmhead, inm,
2169 switch (mli->mli_version) {
2188 MLI_LOCK_ASSERT_HELD(mli);
2213 0, 0, (mli->mli_flags & MLIF_USEALLOW));
2230 VERIFY(mli->mli_rv > 1);
2231 inm->in6m_scrv = mli->mli_rv;
2246 MLI_UNLOCK(mli);
2267 mld_handle_state_change(struct in6_multi *inm, struct mld_ifinfo *mli)
2273 MLI_LOCK_ASSERT_NOTHELD(mli);
2281 MLI_LOCK(mli);
2282 VERIFY(mli->mli_ifp == ifp);
2285 (mli->mli_flags & MLIF_SILENT) ||
2287 (mli->mli_version != MLD_VERSION_2)) {
2288 MLI_UNLOCK(mli);
2304 (mli->mli_flags & MLIF_USEALLOW));
2307 MLI_UNLOCK(mli);
2314 inm->in6m_scrv = mli->mli_rv;
2317 MLI_UNLOCK(mli);
2331 mld_final_leave(struct in6_multi *inm, struct mld_ifinfo *mli)
2336 MLI_LOCK_ASSERT_NOTHELD(mli);
2354 MLI_LOCK(mli);
2355 if (mli->mli_version == MLD_VERSION_1) {
2365 MLI_LOCK_ASSERT_HELD(mli);
2368 } else if (mli->mli_version == MLD_VERSION_2) {
2377 inm->in6m_scrv = mli->mli_rv;
2403 (mli->mli_flags & MLIF_USEALLOW));
2414 MLI_UNLOCK(mli);
3156 mld_v2_dispatch_general_query(struct mld_ifinfo *mli)
3163 MLI_LOCK_ASSERT_HELD(mli);
3165 VERIFY(mli->mli_version == MLD_VERSION_2);
3167 ifp = mli->mli_ifp;
3168 MLI_UNLOCK(mli);
3187 MLI_LOCK(mli);
3188 retval = mld_v2_enqueue_group_record(&mli->mli_gq,
3190 MLI_UNLOCK(mli);
3205 MLI_LOCK(mli);
3206 mld_dispatch_queue(mli, &mli->mli_gq, MLD_MAX_RESPONSE_BURST);
3207 MLI_LOCK_ASSERT_HELD(mli);
3212 if (mli->mli_gq.ifq_head != NULL) {
3213 mli->mli_v2_timer = 1 + MLD_RANDOM_DELAY(