Lines Matching refs:igi
437 struct igmp_ifinfo *igi; variable
462 LIST_FOREACH(igi, &igi_head, igi_link) {
463 IGI_LOCK(igi);
464 if (ifp != igi->igi_ifp) {
465 IGI_UNLOCK(igi);
468 igi_u.igi_ifindex = igi->igi_ifp->if_index;
469 igi_u.igi_version = igi->igi_version;
470 igi_u.igi_v1_timer = igi->igi_v1_timer;
471 igi_u.igi_v2_timer = igi->igi_v2_timer;
472 igi_u.igi_v3_timer = igi->igi_v3_timer;
473 igi_u.igi_flags = igi->igi_flags;
474 igi_u.igi_rv = igi->igi_rv;
475 igi_u.igi_qi = igi->igi_qi;
476 igi_u.igi_qri = igi->igi_qri;
477 igi_u.igi_uri = igi->igi_uri;
478 IGI_UNLOCK(igi);
495 igmp_dispatch_queue(struct igmp_ifinfo *igi, struct ifqueue *ifq, int limit, in igmp_dispatch_queue() argument
501 if (igi != NULL) { in igmp_dispatch_queue()
502 IGI_LOCK_ASSERT_HELD(igi); in igmp_dispatch_queue()
527 if (igi != NULL) { in igmp_dispatch_queue()
528 IGI_UNLOCK(igi); in igmp_dispatch_queue()
531 if (igi != NULL) { in igmp_dispatch_queue()
532 IGI_LOCK(igi); in igmp_dispatch_queue()
543 if (igi != NULL) { in igmp_dispatch_queue()
544 IGI_LOCK_ASSERT_HELD(igi); in igmp_dispatch_queue()
600 struct igmp_ifinfo *igi; in igmp_domifattach() local
605 igi = igi_alloc(how); in igmp_domifattach()
606 if (igi == NULL) { in igmp_domifattach()
612 IGI_LOCK(igi); in igmp_domifattach()
613 igi_initvar(igi, ifp, 0); in igmp_domifattach()
614 igi->igi_debug |= IFD_ATTACHED; in igmp_domifattach()
615 IGI_ADDREF_LOCKED(igi); /* hold a reference for igi_head */ in igmp_domifattach()
616 IGI_ADDREF_LOCKED(igi); /* hold a reference for caller */ in igmp_domifattach()
617 IGI_UNLOCK(igi); in igmp_domifattach()
619 igmp_initsilent(ifp, igi); in igmp_domifattach()
622 LIST_INSERT_HEAD(&igi_head, igi, igi_link); in igmp_domifattach()
629 return igi; in igmp_domifattach()
637 igmp_domifreattach(struct igmp_ifinfo *igi) in igmp_domifreattach() argument
643 IGI_LOCK(igi); in igmp_domifreattach()
644 VERIFY(!(igi->igi_debug & IFD_ATTACHED)); in igmp_domifreattach()
645 ifp = igi->igi_ifp; in igmp_domifreattach()
647 igi_initvar(igi, ifp, 1); in igmp_domifreattach()
648 igi->igi_debug |= IFD_ATTACHED; in igmp_domifreattach()
649 IGI_ADDREF_LOCKED(igi); /* hold a reference for igi_head */ in igmp_domifreattach()
650 IGI_UNLOCK(igi); in igmp_domifreattach()
652 igmp_initsilent(ifp, igi); in igmp_domifreattach()
655 LIST_INSERT_HEAD(&igi_head, igi, igi_link); in igmp_domifreattach()
693 struct igmp_ifinfo *igi, *tigi; in igi_delete() local
697 LIST_FOREACH_SAFE(igi, &igi_head, igi_link, tigi) { in igi_delete()
698 IGI_LOCK(igi); in igi_delete()
699 if (igi->igi_ifp == ifp) { in igi_delete()
703 IF_DRAIN(&igi->igi_gq); in igi_delete()
704 IF_DRAIN(&igi->igi_v2q); in igi_delete()
705 igmp_flush_relq(igi, inm_dthead); in igi_delete()
706 igi->igi_debug &= ~IFD_ATTACHED; in igi_delete()
707 IGI_UNLOCK(igi); in igi_delete()
709 LIST_REMOVE(igi, igi_link); in igi_delete()
710 IGI_REMREF(igi); /* release igi_head reference */ in igi_delete()
713 IGI_UNLOCK(igi); in igi_delete()
720 igmp_initsilent(struct ifnet *ifp, struct igmp_ifinfo *igi) in igmp_initsilent() argument
724 IGI_LOCK_ASSERT_NOTHELD(igi); in igmp_initsilent()
725 IGI_LOCK(igi); in igmp_initsilent()
727 igi->igi_flags |= IGIF_SILENT; in igmp_initsilent()
729 igi->igi_flags &= ~IGIF_SILENT; in igmp_initsilent()
731 IGI_UNLOCK(igi); in igmp_initsilent()
735 igi_initvar(struct igmp_ifinfo *igi, struct ifnet *ifp, int reattach) in igi_initvar() argument
737 IGI_LOCK_ASSERT_HELD(igi); in igi_initvar()
739 igi->igi_ifp = ifp; in igi_initvar()
740 igi->igi_version = igmp_default_version; in igi_initvar()
741 igi->igi_flags = 0; in igi_initvar()
742 igi->igi_rv = IGMP_RV_INIT; in igi_initvar()
743 igi->igi_qi = IGMP_QI_INIT; in igi_initvar()
744 igi->igi_qri = IGMP_QRI_INIT; in igi_initvar()
745 igi->igi_uri = IGMP_URI_INIT; in igi_initvar()
748 SLIST_INIT(&igi->igi_relinmhead); in igi_initvar()
754 igi->igi_gq.ifq_maxlen = IGMP_MAX_RESPONSE_PACKETS; in igi_initvar()
755 igi->igi_v2q.ifq_maxlen = IGMP_MAX_RESPONSE_PACKETS; in igi_initvar()
761 struct igmp_ifinfo *igi = zalloc_flags(igi_zone, how | Z_ZERO); in igi_alloc() local
762 if (igi != NULL) { in igi_alloc()
763 lck_mtx_init(&igi->igi_lock, &igmp_mtx_grp, &igmp_mtx_attr); in igi_alloc()
764 igi->igi_debug |= IFD_ALLOC; in igi_alloc()
766 return igi; in igi_alloc()
770 igi_free(struct igmp_ifinfo *igi) in igi_free() argument
772 IGI_LOCK(igi); in igi_free()
773 if (igi->igi_debug & IFD_ATTACHED) { in igi_free()
774 panic("%s: attached igi=%p is being freed", __func__, igi); in igi_free()
776 } else if (igi->igi_ifp != NULL) { in igi_free()
777 panic("%s: ifp not NULL for igi=%p", __func__, igi); in igi_free()
779 } else if (!(igi->igi_debug & IFD_ALLOC)) { in igi_free()
780 panic("%s: igi %p cannot be freed", __func__, igi); in igi_free()
782 } else if (igi->igi_refcnt != 0) { in igi_free()
783 panic("%s: non-zero refcnt igi=%p", __func__, igi); in igi_free()
786 igi->igi_debug &= ~IFD_ALLOC; in igi_free()
787 IGI_UNLOCK(igi); in igi_free()
789 lck_mtx_destroy(&igi->igi_lock, &igmp_mtx_grp); in igi_free()
790 zfree(igi_zone, igi); in igi_free()
794 igi_addref(struct igmp_ifinfo *igi, int locked) in igi_addref() argument
797 IGI_LOCK_SPIN(igi); in igi_addref()
799 IGI_LOCK_ASSERT_HELD(igi); in igi_addref()
802 if (++igi->igi_refcnt == 0) { in igi_addref()
803 panic("%s: igi=%p wraparound refcnt", __func__, igi); in igi_addref()
807 IGI_UNLOCK(igi); in igi_addref()
812 igi_remref(struct igmp_ifinfo *igi) in igi_remref() argument
817 IGI_LOCK_SPIN(igi); in igi_remref()
819 if (igi->igi_refcnt == 0) { in igi_remref()
820 panic("%s: igi=%p negative refcnt", __func__, igi); in igi_remref()
824 --igi->igi_refcnt; in igi_remref()
825 if (igi->igi_refcnt > 0) { in igi_remref()
826 IGI_UNLOCK(igi); in igi_remref()
830 ifp = igi->igi_ifp; in igi_remref()
831 igi->igi_ifp = NULL; in igi_remref()
832 IF_DRAIN(&igi->igi_gq); in igi_remref()
833 IF_DRAIN(&igi->igi_v2q); in igi_remref()
835 igmp_flush_relq(igi, (struct igmp_inm_relhead *)&inm_dthead); in igi_remref()
836 IGI_UNLOCK(igi); in igi_remref()
844 igi_free(igi); in igi_remref()
855 struct igmp_ifinfo *igi; in igmp_input_v1_query() local
875 igi = IGMP_IFINFO(ifp); in igmp_input_v1_query()
876 VERIFY(igi != NULL); in igmp_input_v1_query()
878 IGI_LOCK(igi); in igmp_input_v1_query()
879 if (igi->igi_flags & IGIF_LOOPBACK) { in igmp_input_v1_query()
884 IGI_UNLOCK(igi); in igmp_input_v1_query()
890 itp.qpt = igmp_set_version(igi, IGMP_VERSION_1); in igmp_input_v1_query()
891 IGI_UNLOCK(igi); in igmp_input_v1_query()
945 struct igmp_ifinfo *igi; in igmp_input_v2_query() local
973 igi = IGMP_IFINFO(ifp); in igmp_input_v2_query()
974 VERIFY(igi != NULL); in igmp_input_v2_query()
976 IGI_LOCK(igi); in igmp_input_v2_query()
977 if (igi->igi_flags & IGIF_LOOPBACK) { in igmp_input_v2_query()
980 IGI_UNLOCK(igi); in igmp_input_v2_query()
986 if (igi->igi_version == IGMP_VERSION_1) { in igmp_input_v2_query()
987 IGI_UNLOCK(igi); in igmp_input_v2_query()
990 itp.qpt = igmp_set_version(igi, IGMP_VERSION_2); in igmp_input_v2_query()
991 IGI_UNLOCK(igi); in igmp_input_v2_query()
1109 struct igmp_ifinfo *igi; in igmp_input_v3_query() local
1184 igi = IGMP_IFINFO(ifp); in igmp_input_v3_query()
1185 VERIFY(igi != NULL); in igmp_input_v3_query()
1187 IGI_LOCK(igi); in igmp_input_v3_query()
1188 if (igi->igi_flags & IGIF_LOOPBACK) { in igmp_input_v3_query()
1192 IGI_UNLOCK(igi); in igmp_input_v3_query()
1202 if (igi->igi_version != IGMP_VERSION_3) { in igmp_input_v3_query()
1204 "ifp %s\n", __func__, igi->igi_version, in igmp_input_v3_query()
1206 IGI_UNLOCK(igi); in igmp_input_v3_query()
1210 itp.qpt = igmp_set_version(igi, IGMP_VERSION_3); in igmp_input_v3_query()
1211 igi->igi_rv = qrv; in igmp_input_v3_query()
1212 igi->igi_qi = qqi; in igmp_input_v3_query()
1213 igi->igi_qri = MAX(timer, IGMP_QRI_MIN); in igmp_input_v3_query()
1215 IGMP_PRINTF(("%s: qrv %d qi %d qri %d\n", __func__, igi->igi_rv, in igmp_input_v3_query()
1216 igi->igi_qi, igi->igi_qri)); in igmp_input_v3_query()
1229 if (igi->igi_v3_timer == 0 || igi->igi_v3_timer >= timer) { in igmp_input_v3_query()
1230 itp.it = igi->igi_v3_timer = IGMP_RANDOM_DELAY(timer); in igmp_input_v3_query()
1232 IGI_UNLOCK(igi); in igmp_input_v3_query()
1234 IGI_UNLOCK(igi); in igmp_input_v3_query()
1272 IGI_LOCK(igi); in igmp_input_v3_query()
1273 itp.it = igi->igi_v3_timer; in igmp_input_v3_query()
1274 IGI_UNLOCK(igi); in igmp_input_v3_query()
1448 struct igmp_ifinfo *igi; in igmp_input_v1_report() local
1452 igi = inm->inm_igi; in igmp_input_v1_report()
1453 VERIFY(igi != NULL); in igmp_input_v1_report()
1463 IGI_LOCK(igi); in igmp_input_v1_report()
1464 if (igi->igi_version == IGMP_VERSION_3) { in igmp_input_v1_report()
1468 IGI_UNLOCK(igi); in igmp_input_v1_report()
1497 if (igi->igi_version == IGMP_VERSION_1) { in igmp_input_v1_report()
1499 } else if (igi->igi_version == IGMP_VERSION_2) { in igmp_input_v1_report()
1508 IGI_UNLOCK(igi); in igmp_input_v1_report()
1599 struct igmp_ifinfo *igi; in igmp_input_v2_report() local
1602 igi = inm->inm_igi; in igmp_input_v2_report()
1603 VERIFY(igi != NULL); in igmp_input_v2_report()
1613 IGI_LOCK(igi); in igmp_input_v2_report()
1614 if (igi->igi_version == IGMP_VERSION_3) { in igmp_input_v2_report()
1618 IGI_UNLOCK(igi); in igmp_input_v2_report()
1647 IGI_UNLOCK(igi); in igmp_input_v2_report()
1929 struct igmp_ifinfo *igi; in igmp_timeout() local
1964 LIST_FOREACH(igi, &igi_head, igi_link) { in igmp_timeout()
1965 IGI_LOCK(igi); in igmp_timeout()
1966 igmp_v1v2_process_querier_timers(igi); in igmp_timeout()
1967 if (igi->igi_v1_timer > 0 || igi->igi_v2_timer > 0) { in igmp_timeout()
1970 IGI_UNLOCK(igi); in igmp_timeout()
1980 LIST_FOREACH(igi, &igi_head, igi_link) { in igmp_timeout()
1981 IGI_LOCK(igi); in igmp_timeout()
1982 if (igi->igi_version != IGMP_VERSION_3) { in igmp_timeout()
1983 IGI_UNLOCK(igi); in igmp_timeout()
1986 if (igi->igi_v3_timer == 0) { in igmp_timeout()
1988 } else if (--igi->igi_v3_timer == 0) { in igmp_timeout()
1989 if (igmp_v3_dispatch_general_query(igi) > 0) { in igmp_timeout()
1995 IGI_UNLOCK(igi); in igmp_timeout()
2020 LIST_FOREACH(igi, &igi_head, igi_link) { in igmp_timeout()
2023 IGI_LOCK(igi); in igmp_timeout()
2024 ifp = igi->igi_ifp; in igmp_timeout()
2025 loop = (igi->igi_flags & IGIF_LOOPBACK) ? 1 : 0; in igmp_timeout()
2026 uri_sec = IGMP_RANDOM_DELAY(igi->igi_uri); in igmp_timeout()
2027 IGI_UNLOCK(igi); in igmp_timeout()
2037 IGI_LOCK(igi); in igmp_timeout()
2038 switch (igi->igi_version) { in igmp_timeout()
2042 igi->igi_version); in igmp_timeout()
2045 igmp_v3_process_group_timers(igi, &qrq, in igmp_timeout()
2049 IGI_UNLOCK(igi); in igmp_timeout()
2056 IGI_LOCK(igi); in igmp_timeout()
2057 if (igi->igi_version == IGMP_VERSION_1 || in igmp_timeout()
2058 igi->igi_version == IGMP_VERSION_2) { in igmp_timeout()
2059 igmp_dispatch_queue(igi, &igi->igi_v2q, 0, loop); in igmp_timeout()
2060 } else if (igi->igi_version == IGMP_VERSION_3) { in igmp_timeout()
2061 IGI_UNLOCK(igi); in igmp_timeout()
2066 IGI_LOCK(igi); in igmp_timeout()
2072 IF_DRAIN(&igi->igi_v2q); in igmp_timeout()
2079 igmp_flush_relq(igi, (struct igmp_inm_relhead *)&inm_dthead); in igmp_timeout()
2080 IGI_UNLOCK(igi); in igmp_timeout()
2154 igmp_append_relq(struct igmp_ifinfo *igi, struct in_multi *inm) in igmp_append_relq() argument
2156 IGI_LOCK_ASSERT_HELD(igi); in igmp_append_relq()
2160 if_name(igi->igi_ifp)); in igmp_append_relq()
2165 if_name(igi->igi_ifp)); in igmp_append_relq()
2167 SLIST_INSERT_HEAD(&igi->igi_relinmhead, inm, inm_nrele); in igmp_append_relq()
2176 igmp_flush_relq(struct igmp_ifinfo *igi, struct igmp_inm_relhead *inm_dthead) in igmp_flush_relq() argument
2186 IGI_LOCK_ASSERT_HELD(igi); in igmp_flush_relq()
2188 while ((inm = SLIST_FIRST(&igi->igi_relinmhead)) != NULL) { in igmp_flush_relq()
2189 SLIST_REMOVE_HEAD(&igi->igi_relinmhead, inm_nrele); in igmp_flush_relq()
2192 IGI_UNLOCK(igi); in igmp_flush_relq()
2227 IGI_LOCK(igi); in igmp_flush_relq()
2285 igmp_v3_process_group_timers(struct igmp_ifinfo *igi, in igmp_v3_process_group_timers() argument
2294 IGI_LOCK_ASSERT_HELD(igi); in igmp_v3_process_group_timers()
2295 VERIFY(igi == inm->inm_igi); in igmp_v3_process_group_timers()
2406 igmp_append_relq(igi, inm); in igmp_v3_process_group_timers()
2448 igmp_set_version(struct igmp_ifinfo *igi, const int igmp_version) in igmp_set_version() argument
2452 IGI_LOCK_ASSERT_HELD(igi); in igmp_set_version()
2455 igmp_version, if_name(igi->igi_ifp)); in igmp_set_version()
2462 old_version_timer = igi->igi_rv * igi->igi_qi + igi->igi_qri; in igmp_set_version()
2465 igi->igi_v1_timer = old_version_timer; in igmp_set_version()
2466 igi->igi_v2_timer = 0; in igmp_set_version()
2468 igi->igi_v1_timer = 0; in igmp_set_version()
2469 igi->igi_v2_timer = old_version_timer; in igmp_set_version()
2473 if (igi->igi_v1_timer == 0 && igi->igi_v2_timer > 0) { in igmp_set_version()
2474 if (igi->igi_version != IGMP_VERSION_2) { in igmp_set_version()
2475 igmp_v3_cancel_link_timers(igi); in igmp_set_version()
2476 igi->igi_version = IGMP_VERSION_2; in igmp_set_version()
2478 } else if (igi->igi_v1_timer > 0) { in igmp_set_version()
2479 if (igi->igi_version != IGMP_VERSION_1) { in igmp_set_version()
2480 igmp_v3_cancel_link_timers(igi); in igmp_set_version()
2481 igi->igi_version = IGMP_VERSION_1; in igmp_set_version()
2485 IGI_LOCK_ASSERT_HELD(igi); in igmp_set_version()
2487 return MAX(igi->igi_v1_timer, igi->igi_v2_timer); in igmp_set_version()
2500 igmp_v3_cancel_link_timers(struct igmp_ifinfo *igi) in igmp_v3_cancel_link_timers() argument
2506 IGI_LOCK_ASSERT_HELD(igi); in igmp_v3_cancel_link_timers()
2509 (uint64_t)VM_KERNEL_ADDRPERM(igi->igi_ifp), if_name(igi->igi_ifp))); in igmp_v3_cancel_link_timers()
2516 igi->igi_v3_timer = 0; in igmp_v3_cancel_link_timers()
2522 ifp = igi->igi_ifp; in igmp_v3_cancel_link_timers()
2523 IGI_UNLOCK(igi); in igmp_v3_cancel_link_timers()
2529 if (inm->inm_ifp != ifp && inm->inm_igi != igi) { in igmp_v3_cancel_link_timers()
2559 IGI_LOCK(igi); in igmp_v3_cancel_link_timers()
2560 igmp_append_relq(igi, inm); in igmp_v3_cancel_link_timers()
2561 IGI_UNLOCK(igi); in igmp_v3_cancel_link_timers()
2584 IGI_LOCK(igi); in igmp_v3_cancel_link_timers()
2592 igmp_v1v2_process_querier_timers(struct igmp_ifinfo *igi) in igmp_v1v2_process_querier_timers() argument
2594 IGI_LOCK_ASSERT_HELD(igi); in igmp_v1v2_process_querier_timers()
2596 if (igi->igi_v1_timer == 0 && igi->igi_v2_timer == 0) { in igmp_v1v2_process_querier_timers()
2602 if (igi->igi_version != IGMP_VERSION_3) { in igmp_v1v2_process_querier_timers()
2605 igi->igi_version, IGMP_VERSION_3, in igmp_v1v2_process_querier_timers()
2606 if_name(igi->igi_ifp)); in igmp_v1v2_process_querier_timers()
2607 igi->igi_version = IGMP_VERSION_3; in igmp_v1v2_process_querier_timers()
2608 IF_DRAIN(&igi->igi_v2q); in igmp_v1v2_process_querier_timers()
2610 } else if (igi->igi_v1_timer == 0 && igi->igi_v2_timer > 0) { in igmp_v1v2_process_querier_timers()
2621 igi->igi_version, IGMP_VERSION_3, in igmp_v1v2_process_querier_timers()
2622 if_name(igi->igi_ifp)); in igmp_v1v2_process_querier_timers()
2623 igi->igi_v2_timer = 0; in igmp_v1v2_process_querier_timers()
2624 igi->igi_version = IGMP_VERSION_3; in igmp_v1v2_process_querier_timers()
2625 IF_DRAIN(&igi->igi_v2q); in igmp_v1v2_process_querier_timers()
2627 --igi->igi_v2_timer; in igmp_v1v2_process_querier_timers()
2628 if (igi->igi_version != IGMP_VERSION_2) { in igmp_v1v2_process_querier_timers()
2631 igi->igi_version, IGMP_VERSION_2, in igmp_v1v2_process_querier_timers()
2632 if_name(igi->igi_ifp)); in igmp_v1v2_process_querier_timers()
2633 IF_DRAIN(&igi->igi_gq); in igmp_v1v2_process_querier_timers()
2634 igmp_v3_cancel_link_timers(igi); in igmp_v1v2_process_querier_timers()
2635 igi->igi_version = IGMP_VERSION_2; in igmp_v1v2_process_querier_timers()
2638 } else if (igi->igi_v1_timer > 0) { in igmp_v1v2_process_querier_timers()
2650 igi->igi_version, IGMP_VERSION_3, in igmp_v1v2_process_querier_timers()
2651 if_name(igi->igi_ifp)); in igmp_v1v2_process_querier_timers()
2652 igi->igi_v1_timer = 0; in igmp_v1v2_process_querier_timers()
2653 igi->igi_version = IGMP_VERSION_3; in igmp_v1v2_process_querier_timers()
2654 IF_DRAIN(&igi->igi_v2q); in igmp_v1v2_process_querier_timers()
2656 --igi->igi_v1_timer; in igmp_v1v2_process_querier_timers()
2658 if (igi->igi_v2_timer > 0) { in igmp_v1v2_process_querier_timers()
2661 (uint64_t)VM_KERNEL_ADDRPERM(igi->igi_ifp), in igmp_v1v2_process_querier_timers()
2662 if_name(igi->igi_ifp))); in igmp_v1v2_process_querier_timers()
2663 igi->igi_v2_timer = 0; in igmp_v1v2_process_querier_timers()
2769 struct igmp_ifinfo *igi; in igmp_change_state() local
2791 igi = IGMP_IFINFO(ifp); in igmp_change_state()
2792 VERIFY(igi != NULL); in igmp_change_state()
2804 error = igmp_initial_join(inm, igi, itp); in igmp_change_state()
2808 igmp_final_leave(inm, igi, itp); in igmp_change_state()
2815 error = igmp_handle_state_change(inm, igi, itp); in igmp_change_state()
2831 igmp_initial_join(struct in_multi *inm, struct igmp_ifinfo *igi, in igmp_initial_join() argument
2839 IGI_LOCK_ASSERT_NOTHELD(igi); in igmp_initial_join()
2852 IGI_LOCK(igi); in igmp_initial_join()
2853 VERIFY(igi->igi_ifp == ifp); in igmp_initial_join()
2865 (igi->igi_flags & IGIF_SILENT) || in igmp_initial_join()
2880 if (igi->igi_version == IGMP_VERSION_3 && in igmp_initial_join()
2883 igmp_append_relq(igi, inm); in igmp_initial_join()
2888 switch (igi->igi_version) { in igmp_initial_join()
2893 (igi->igi_version == IGMP_VERSION_2) ? in igmp_initial_join()
2898 IGI_LOCK_ASSERT_HELD(igi); in igmp_initial_join()
2938 if (igi->igi_flags & IGIF_LOOPBACK) { in igmp_initial_join()
2941 VERIFY(igi->igi_rv > 1); in igmp_initial_join()
2942 inm->inm_scrv = (uint16_t)igi->igi_rv; in igmp_initial_join()
2951 IGI_UNLOCK(igi); in igmp_initial_join()
2972 igmp_handle_state_change(struct in_multi *inm, struct igmp_ifinfo *igi, in igmp_handle_state_change() argument
2979 IGI_LOCK_ASSERT_NOTHELD(igi); in igmp_handle_state_change()
2989 IGI_LOCK(igi); in igmp_handle_state_change()
2990 VERIFY(igi->igi_ifp == ifp); in igmp_handle_state_change()
2993 (igi->igi_flags & IGIF_SILENT) || in igmp_handle_state_change()
2995 (igi->igi_version != IGMP_VERSION_3)) { in igmp_handle_state_change()
2996 IGI_UNLOCK(igi); in igmp_handle_state_change()
3015 IGI_UNLOCK(igi); in igmp_handle_state_change()
3023 inm->inm_scrv = ((igi->igi_flags & IGIF_LOOPBACK) ? 1 : (uint16_t)igi->igi_rv); in igmp_handle_state_change()
3026 IGI_UNLOCK(igi); in igmp_handle_state_change()
3041 igmp_final_leave(struct in_multi *inm, struct igmp_ifinfo *igi, in igmp_final_leave() argument
3048 IGI_LOCK_ASSERT_NOTHELD(igi); in igmp_final_leave()
3069 IGI_LOCK(igi); in igmp_final_leave()
3070 if (igi->igi_version == IGMP_VERSION_2) { in igmp_final_leave()
3079 IGI_UNLOCK(igi); in igmp_final_leave()
3095 IGI_LOCK_ASSERT_HELD(igi); in igmp_final_leave()
3098 } else if (igi->igi_version == IGMP_VERSION_3) { in igmp_final_leave()
3107 if (igi->igi_flags & IGIF_LOOPBACK) { in igmp_final_leave()
3110 inm->inm_scrv = (uint16_t)igi->igi_rv; in igmp_final_leave()
3148 IGI_UNLOCK(igi); in igmp_final_leave()
3940 igmp_v3_dispatch_general_query(struct igmp_ifinfo *igi) in igmp_v3_dispatch_general_query() argument
3947 IGI_LOCK_ASSERT_HELD(igi); in igmp_v3_dispatch_general_query()
3949 VERIFY(igi->igi_version == IGMP_VERSION_3); in igmp_v3_dispatch_general_query()
3951 ifp = igi->igi_ifp; in igmp_v3_dispatch_general_query()
3952 IGI_UNLOCK(igi); in igmp_v3_dispatch_general_query()
3972 IGI_LOCK(igi); in igmp_v3_dispatch_general_query()
3973 retval = igmp_v3_enqueue_group_record(&igi->igi_gq, in igmp_v3_dispatch_general_query()
3975 IGI_UNLOCK(igi); in igmp_v3_dispatch_general_query()
3990 IGI_LOCK(igi); in igmp_v3_dispatch_general_query()
3991 loop = (igi->igi_flags & IGIF_LOOPBACK) ? 1 : 0; in igmp_v3_dispatch_general_query()
3992 igmp_dispatch_queue(igi, &igi->igi_gq, IGMP_MAX_RESPONSE_BURST, in igmp_v3_dispatch_general_query()
3994 IGI_LOCK_ASSERT_HELD(igi); in igmp_v3_dispatch_general_query()
3998 if (igi->igi_gq.ifq_head != NULL) { in igmp_v3_dispatch_general_query()
3999 igi->igi_v3_timer = 1 + IGMP_RANDOM_DELAY( in igmp_v3_dispatch_general_query()
4003 return igi->igi_v3_timer; in igmp_v3_dispatch_general_query()