Lines Matching defs:igi

399 	struct igmp_ifinfo	*igi;
428 LIST_FOREACH(igi, &igi_head, igi_link) {
429 IGI_LOCK(igi);
430 if (ifp != igi->igi_ifp) {
431 IGI_UNLOCK(igi);
434 igi_u.igi_ifindex = igi->igi_ifp->if_index;
435 igi_u.igi_version = igi->igi_version;
436 igi_u.igi_v1_timer = igi->igi_v1_timer;
437 igi_u.igi_v2_timer = igi->igi_v2_timer;
438 igi_u.igi_v3_timer = igi->igi_v3_timer;
439 igi_u.igi_flags = igi->igi_flags;
440 igi_u.igi_rv = igi->igi_rv;
441 igi_u.igi_qi = igi->igi_qi;
442 igi_u.igi_qri = igi->igi_qri;
443 igi_u.igi_uri = igi->igi_uri;
444 IGI_UNLOCK(igi);
461 igmp_dispatch_queue(struct igmp_ifinfo *igi, struct ifqueue *ifq, int limit,
467 if (igi != NULL)
468 IGI_LOCK_ASSERT_HELD(igi);
478 if (igi != NULL)
479 IGI_UNLOCK(igi);
481 if (igi != NULL)
482 IGI_LOCK(igi);
487 if (igi != NULL)
488 IGI_LOCK_ASSERT_HELD(igi);
542 struct igmp_ifinfo *igi;
547 igi = igi_alloc(how);
548 if (igi == NULL)
553 IGI_LOCK(igi);
554 igi_initvar(igi, ifp, 0);
555 igi->igi_debug |= IFD_ATTACHED;
556 IGI_ADDREF_LOCKED(igi); /* hold a reference for igi_head */
557 IGI_ADDREF_LOCKED(igi); /* hold a reference for caller */
558 IGI_UNLOCK(igi);
560 igmp_initsilent(ifp, igi);
563 LIST_INSERT_HEAD(&igi_head, igi, igi_link);
570 return (igi);
575 * expected to have an outstanding reference to the igi.
578 igmp_domifreattach(struct igmp_ifinfo *igi)
584 IGI_LOCK(igi);
585 VERIFY(!(igi->igi_debug & IFD_ATTACHED));
586 ifp = igi->igi_ifp;
588 igi_initvar(igi, ifp, 1);
589 igi->igi_debug |= IFD_ATTACHED;
590 IGI_ADDREF_LOCKED(igi); /* hold a reference for igi_head */
591 IGI_UNLOCK(igi);
593 igmp_initsilent(ifp, igi);
596 LIST_INSERT_HEAD(&igi_head, igi, igi_link);
634 struct igmp_ifinfo *igi, *tigi;
638 LIST_FOREACH_SAFE(igi, &igi_head, igi_link, tigi) {
639 IGI_LOCK(igi);
640 if (igi->igi_ifp == ifp) {
644 IF_DRAIN(&igi->igi_gq);
645 IF_DRAIN(&igi->igi_v2q);
646 igmp_flush_relq(igi, inm_dthead);
647 VERIFY(SLIST_EMPTY(&igi->igi_relinmhead));
648 igi->igi_debug &= ~IFD_ATTACHED;
649 IGI_UNLOCK(igi);
651 LIST_REMOVE(igi, igi_link);
652 IGI_REMREF(igi); /* release igi_head reference */
655 IGI_UNLOCK(igi);
661 igmp_initsilent(struct ifnet *ifp, struct igmp_ifinfo *igi)
665 IGI_LOCK_ASSERT_NOTHELD(igi);
666 IGI_LOCK(igi);
668 igi->igi_flags |= IGIF_SILENT;
670 igi->igi_flags &= ~IGIF_SILENT;
671 IGI_UNLOCK(igi);
675 igi_initvar(struct igmp_ifinfo *igi, struct ifnet *ifp, int reattach)
677 IGI_LOCK_ASSERT_HELD(igi);
679 igi->igi_ifp = ifp;
680 igi->igi_version = igmp_default_version;
681 igi->igi_flags = 0;
682 igi->igi_rv = IGMP_RV_INIT;
683 igi->igi_qi = IGMP_QI_INIT;
684 igi->igi_qri = IGMP_QRI_INIT;
685 igi->igi_uri = IGMP_URI_INIT;
688 SLIST_INIT(&igi->igi_relinmhead);
693 igi->igi_gq.ifq_maxlen = IGMP_MAX_RESPONSE_PACKETS;
694 igi->igi_v2q.ifq_maxlen = IGMP_MAX_RESPONSE_PACKETS;
700 struct igmp_ifinfo *igi;
702 igi = (how == M_WAITOK) ? zalloc(igi_zone) : zalloc_noblock(igi_zone);
703 if (igi != NULL) {
704 bzero(igi, igi_size);
705 lck_mtx_init(&igi->igi_lock, igmp_mtx_grp, igmp_mtx_attr);
706 igi->igi_debug |= IFD_ALLOC;
708 return (igi);
712 igi_free(struct igmp_ifinfo *igi)
714 IGI_LOCK(igi);
715 if (igi->igi_debug & IFD_ATTACHED) {
716 panic("%s: attached igi=%p is being freed", __func__, igi);
718 } else if (igi->igi_ifp != NULL) {
719 panic("%s: ifp not NULL for igi=%p", __func__, igi);
721 } else if (!(igi->igi_debug & IFD_ALLOC)) {
722 panic("%s: igi %p cannot be freed", __func__, igi);
724 } else if (igi->igi_refcnt != 0) {
725 panic("%s: non-zero refcnt igi=%p", __func__, igi);
728 igi->igi_debug &= ~IFD_ALLOC;
729 IGI_UNLOCK(igi);
731 lck_mtx_destroy(&igi->igi_lock, igmp_mtx_grp);
732 zfree(igi_zone, igi);
736 igi_addref(struct igmp_ifinfo *igi, int locked)
739 IGI_LOCK_SPIN(igi);
741 IGI_LOCK_ASSERT_HELD(igi);
743 if (++igi->igi_refcnt == 0) {
744 panic("%s: igi=%p wraparound refcnt", __func__, igi);
748 IGI_UNLOCK(igi);
752 igi_remref(struct igmp_ifinfo *igi)
757 IGI_LOCK_SPIN(igi);
759 if (igi->igi_refcnt == 0) {
760 panic("%s: igi=%p negative refcnt", __func__, igi);
764 --igi->igi_refcnt;
765 if (igi->igi_refcnt > 0) {
766 IGI_UNLOCK(igi);
770 ifp = igi->igi_ifp;
771 igi->igi_ifp = NULL;
772 IF_DRAIN(&igi->igi_gq);
773 IF_DRAIN(&igi->igi_v2q);
775 igmp_flush_relq(igi, (struct igmp_inm_relhead *)&inm_dthead);
776 VERIFY(SLIST_EMPTY(&igi->igi_relinmhead));
777 IGI_UNLOCK(igi);
785 igi_free(igi);
796 struct igmp_ifinfo *igi;
813 igi = IGMP_IFINFO(ifp);
814 VERIFY(igi != NULL);
816 IGI_LOCK(igi);
817 if (igi->igi_flags & IGIF_LOOPBACK) {
820 IGI_UNLOCK(igi);
826 igmp_set_version(igi, IGMP_VERSION_1);
827 IGI_UNLOCK(igi);
881 struct igmp_ifinfo *igi;
905 igi = IGMP_IFINFO(ifp);
906 VERIFY(igi != NULL);
908 IGI_LOCK(igi);
909 if (igi->igi_flags & IGIF_LOOPBACK) {
912 IGI_UNLOCK(igi);
918 if (igi->igi_version == IGMP_VERSION_1) {
919 IGI_UNLOCK(igi);
922 igmp_set_version(igi, IGMP_VERSION_2);
923 IGI_UNLOCK(igi);
1036 struct igmp_ifinfo *igi;
1106 igi = IGMP_IFINFO(ifp);
1107 VERIFY(igi != NULL);
1109 IGI_LOCK(igi);
1110 if (igi->igi_flags & IGIF_LOOPBACK) {
1113 IGI_UNLOCK(igi);
1123 if (igi->igi_version != IGMP_VERSION_3) {
1125 igi->igi_version, ifp, ifp->if_name, ifp->if_unit));
1126 IGI_UNLOCK(igi);
1130 igmp_set_version(igi, IGMP_VERSION_3);
1131 igi->igi_rv = qrv;
1132 igi->igi_qi = qqi;
1133 igi->igi_qri = maxresp;
1150 if (igi->igi_v3_timer == 0 || igi->igi_v3_timer >= timer) {
1151 igi->igi_v3_timer = IGMP_RANDOM_DELAY(timer);
1154 IGI_UNLOCK(igi);
1156 IGI_UNLOCK(igi);
1194 IGI_LOCK(igi);
1195 if (igi->igi_v3_timer == 0 || igi->igi_v3_timer >= timer) {
1196 IGI_UNLOCK(igi);
1199 IGI_UNLOCK(igi);
1362 struct igmp_ifinfo *igi;
1366 igi = inm->inm_igi;
1367 VERIFY(igi != NULL);
1377 IGI_LOCK(igi);
1378 if (igi->igi_version == IGMP_VERSION_3) {
1381 IGI_UNLOCK(igi);
1407 if (igi->igi_version == IGMP_VERSION_1)
1409 else if (igi->igi_version == IGMP_VERSION_2)
1417 IGI_UNLOCK(igi);
1501 struct igmp_ifinfo *igi;
1504 igi = inm->inm_igi;
1505 VERIFY(igi != NULL);
1515 IGI_LOCK(igi);
1516 if (igi->igi_version == IGMP_VERSION_3) {
1519 IGI_UNLOCK(igi);
1546 IGI_UNLOCK(igi);
1773 struct igmp_ifinfo *igi;
1782 LIST_FOREACH(igi, &igi_head, igi_link) {
1783 IGI_LOCK(igi);
1784 igmp_v1v2_process_querier_timers(igi);
1785 IGI_UNLOCK(igi);
1806 LIST_FOREACH(igi, &igi_head, igi_link) {
1807 IGI_LOCK(igi);
1808 if (igi->igi_v3_timer == 0) {
1810 } else if (--igi->igi_v3_timer == 0) {
1811 igmp_v3_dispatch_general_query(igi);
1815 IGI_UNLOCK(igi);
1836 LIST_FOREACH(igi, &igi_head, igi_link) {
1839 IGI_LOCK(igi);
1840 ifp = igi->igi_ifp;
1841 loop = (igi->igi_flags & IGIF_LOOPBACK) ? 1 : 0;
1842 uri_fasthz = IGMP_RANDOM_DELAY(igi->igi_uri * PR_SLOWHZ);
1843 IGI_UNLOCK(igi);
1852 IGI_LOCK(igi);
1853 switch (igi->igi_version) {
1857 igi->igi_version);
1860 igmp_v3_process_group_timers(igi, &qrq,
1864 IGI_UNLOCK(igi);
1871 IGI_LOCK(igi);
1872 if (igi->igi_version == IGMP_VERSION_1 ||
1873 igi->igi_version == IGMP_VERSION_2) {
1874 igmp_dispatch_queue(igi, &igi->igi_v2q, 0, loop, ifp);
1875 } else if (igi->igi_version == IGMP_VERSION_3) {
1876 IGI_UNLOCK(igi);
1881 IGI_LOCK(igi);
1887 IF_DRAIN(&igi->igi_v2q);
1894 igmp_flush_relq(igi, (struct igmp_inm_relhead *)&inm_dthead);
1895 VERIFY(SLIST_EMPTY(&igi->igi_relinmhead));
1896 IGI_UNLOCK(igi);
1915 igmp_flush_relq(struct igmp_ifinfo *igi, struct igmp_inm_relhead *inm_dthead)
1920 IGI_LOCK_ASSERT_HELD(igi);
1921 inm = SLIST_FIRST(&igi->igi_relinmhead);
1925 SLIST_REMOVE_HEAD(&igi->igi_relinmhead, inm_nrele);
1926 IGI_UNLOCK(igi);
1951 IGI_LOCK(igi);
2006 * Note: Unlocked read from igi.
2009 igmp_v3_process_group_timers(struct igmp_ifinfo *igi,
2017 IGI_LOCK_ASSERT_HELD(igi);
2018 VERIFY(igi == inm->inm_igi);
2125 SLIST_INSERT_HEAD(&igi->igi_relinmhead,
2167 igmp_set_version(struct igmp_ifinfo *igi, const int igmp_version)
2171 IGI_LOCK_ASSERT_HELD(igi);
2174 igmp_version, igi->igi_ifp, igi->igi_ifp->if_name,
2175 igi->igi_ifp->if_unit));
2182 old_version_timer = igi->igi_rv * igi->igi_qi + igi->igi_qri;
2186 igi->igi_v1_timer = old_version_timer;
2187 igi->igi_v2_timer = 0;
2189 igi->igi_v1_timer = 0;
2190 igi->igi_v2_timer = old_version_timer;
2194 if (igi->igi_v1_timer == 0 && igi->igi_v2_timer > 0) {
2195 if (igi->igi_version != IGMP_VERSION_2) {
2196 igi->igi_version = IGMP_VERSION_2;
2197 igmp_v3_cancel_link_timers(igi);
2199 } else if (igi->igi_v1_timer > 0) {
2200 if (igi->igi_version != IGMP_VERSION_1) {
2201 igi->igi_version = IGMP_VERSION_1;
2202 igmp_v3_cancel_link_timers(igi);
2206 IGI_LOCK_ASSERT_HELD(igi);
2219 igmp_v3_cancel_link_timers(struct igmp_ifinfo *igi)
2225 IGI_LOCK_ASSERT_HELD(igi);
2228 igi->igi_ifp, igi->igi_ifp->if_name, igi->igi_ifp->if_unit));
2235 igi->igi_v3_timer = 0;
2241 ifp = igi->igi_ifp;
2242 IGI_UNLOCK(igi);
2277 IGI_LOCK(igi);
2278 SLIST_INSERT_HEAD(&igi->igi_relinmhead, inm, inm_nrele);
2279 IGI_UNLOCK(igi);
2302 IGI_LOCK(igi);
2310 igmp_v1v2_process_querier_timers(struct igmp_ifinfo *igi)
2312 IGI_LOCK_ASSERT_HELD(igi);
2314 if (igi->igi_v1_timer == 0 && igi->igi_v2_timer == 0) {
2320 if (igi->igi_version != IGMP_VERSION_3) {
2322 __func__, igi->igi_version, IGMP_VERSION_3,
2323 igi->igi_ifp, igi->igi_ifp->if_name,
2324 igi->igi_ifp->if_unit));
2325 igi->igi_version = IGMP_VERSION_3;
2326 IF_DRAIN(&igi->igi_v2q);
2328 } else if (igi->igi_v1_timer == 0 && igi->igi_v2_timer > 0) {
2338 __func__, igi->igi_version, IGMP_VERSION_3,
2339 igi->igi_ifp, igi->igi_ifp->if_name,
2340 igi->igi_ifp->if_unit));
2341 igi->igi_v2_timer = 0;
2342 igi->igi_version = IGMP_VERSION_3;
2343 IF_DRAIN(&igi->igi_v2q);
2345 --igi->igi_v2_timer;
2346 if (igi->igi_version != IGMP_VERSION_2) {
2348 __func__, igi->igi_version, IGMP_VERSION_2,
2349 igi->igi_ifp, igi->igi_ifp->if_name,
2350 igi->igi_ifp->if_unit));
2351 igi->igi_version = IGMP_VERSION_2;
2352 IF_DRAIN(&igi->igi_gq);
2355 } else if (igi->igi_v1_timer > 0) {
2366 __func__, igi->igi_version, IGMP_VERSION_3,
2367 igi->igi_ifp, igi->igi_ifp->if_name,
2368 igi->igi_ifp->if_unit));
2369 igi->igi_v1_timer = 0;
2370 igi->igi_version = IGMP_VERSION_3;
2371 IF_DRAIN(&igi->igi_v2q);
2373 --igi->igi_v1_timer;
2375 if (igi->igi_v2_timer > 0) {
2377 __func__, igi->igi_ifp, igi->igi_ifp->if_name,
2378 igi->igi_ifp->if_unit));
2379 igi->igi_v2_timer = 0;
2477 struct igmp_ifinfo *igi;
2496 igi = IGMP_IFINFO(ifp);
2497 VERIFY(igi != NULL);
2509 error = igmp_initial_join(inm, igi);
2513 igmp_final_leave(inm, igi);
2520 error = igmp_handle_state_change(inm, igi);
2536 igmp_initial_join(struct in_multi *inm, struct igmp_ifinfo *igi)
2543 IGI_LOCK_ASSERT_NOTHELD(igi);
2554 IGI_LOCK(igi);
2555 VERIFY(igi->igi_ifp == ifp);
2567 (igi->igi_flags & IGIF_SILENT) ||
2582 if (igi->igi_version == IGMP_VERSION_3 &&
2585 SLIST_INSERT_HEAD(&igi->igi_relinmhead, inm, inm_nrele);
2590 switch (igi->igi_version) {
2595 (igi->igi_version == IGMP_VERSION_2) ?
2600 IGI_LOCK_ASSERT_HELD(igi);
2639 if (igi->igi_flags & IGIF_LOOPBACK) {
2642 VERIFY(igi->igi_rv > 1);
2643 inm->inm_scrv = igi->igi_rv;
2652 IGI_UNLOCK(igi);
2673 igmp_handle_state_change(struct in_multi *inm, struct igmp_ifinfo *igi)
2679 IGI_LOCK_ASSERT_NOTHELD(igi);
2687 IGI_LOCK(igi);
2688 VERIFY(igi->igi_ifp == ifp);
2691 (igi->igi_flags & IGIF_SILENT) ||
2693 (igi->igi_version != IGMP_VERSION_3)) {
2694 IGI_UNLOCK(igi);
2711 IGI_UNLOCK(igi);
2718 inm->inm_scrv = ((igi->igi_flags & IGIF_LOOPBACK) ? 1 : igi->igi_rv);
2721 IGI_UNLOCK(igi);
2736 igmp_final_leave(struct in_multi *inm, struct igmp_ifinfo *igi)
2741 IGI_LOCK_ASSERT_NOTHELD(igi);
2759 IGI_LOCK(igi);
2760 if (igi->igi_version == IGMP_VERSION_2) {
2770 IGI_LOCK_ASSERT_HELD(igi);
2773 } else if (igi->igi_version == IGMP_VERSION_3) {
2782 if (igi->igi_flags & IGIF_LOOPBACK) {
2785 inm->inm_scrv = igi->igi_rv;
2822 IGI_UNLOCK(igi);
3555 igmp_v3_dispatch_general_query(struct igmp_ifinfo *igi)
3562 IGI_LOCK_ASSERT_HELD(igi);
3564 VERIFY(igi->igi_version == IGMP_VERSION_3);
3566 ifp = igi->igi_ifp;
3567 IGI_UNLOCK(igi);
3586 IGI_LOCK(igi);
3587 retval = igmp_v3_enqueue_group_record(&igi->igi_gq,
3589 IGI_UNLOCK(igi);
3604 IGI_LOCK(igi);
3605 loop = (igi->igi_flags & IGIF_LOOPBACK) ? 1 : 0;
3606 igmp_dispatch_queue(igi, &igi->igi_gq, IGMP_MAX_RESPONSE_BURST,
3608 IGI_LOCK_ASSERT_HELD(igi);
3612 if (igi->igi_gq.ifq_head != NULL) {
3613 igi->igi_v3_timer = 1 + IGMP_RANDOM_DELAY(