Lines Matching refs:igi
438 struct igmp_ifinfo *igi; variable
463 LIST_FOREACH(igi, &igi_head, igi_link) {
464 IGI_LOCK(igi);
465 if (ifp != igi->igi_ifp) {
466 IGI_UNLOCK(igi);
469 igi_u.igi_ifindex = igi->igi_ifp->if_index;
470 igi_u.igi_version = igi->igi_version;
471 igi_u.igi_v1_timer = igi->igi_v1_timer;
472 igi_u.igi_v2_timer = igi->igi_v2_timer;
473 igi_u.igi_v3_timer = igi->igi_v3_timer;
474 igi_u.igi_flags = igi->igi_flags;
475 igi_u.igi_rv = igi->igi_rv;
476 igi_u.igi_qi = igi->igi_qi;
477 igi_u.igi_qri = igi->igi_qri;
478 igi_u.igi_uri = igi->igi_uri;
479 IGI_UNLOCK(igi);
496 igmp_dispatch_queue(struct igmp_ifinfo *igi, struct ifqueue *ifq, int limit, in igmp_dispatch_queue() argument
502 if (igi != NULL) { in igmp_dispatch_queue()
503 IGI_LOCK_ASSERT_HELD(igi); in igmp_dispatch_queue()
528 if (igi != NULL) { in igmp_dispatch_queue()
529 IGI_UNLOCK(igi); in igmp_dispatch_queue()
532 if (igi != NULL) { in igmp_dispatch_queue()
533 IGI_LOCK(igi); in igmp_dispatch_queue()
544 if (igi != NULL) { in igmp_dispatch_queue()
545 IGI_LOCK_ASSERT_HELD(igi); in igmp_dispatch_queue()
601 struct igmp_ifinfo *igi; in igmp_domifattach() local
606 igi = igi_alloc(how); in igmp_domifattach()
607 if (igi == NULL) { in igmp_domifattach()
613 IGI_LOCK(igi); in igmp_domifattach()
614 igi_initvar(igi, ifp, 0); in igmp_domifattach()
615 igi->igi_debug |= IFD_ATTACHED; in igmp_domifattach()
616 IGI_ADDREF_LOCKED(igi); /* hold a reference for igi_head */ in igmp_domifattach()
617 IGI_ADDREF_LOCKED(igi); /* hold a reference for caller */ in igmp_domifattach()
618 IGI_UNLOCK(igi); in igmp_domifattach()
620 igmp_initsilent(ifp, igi); in igmp_domifattach()
623 LIST_INSERT_HEAD(&igi_head, igi, igi_link); in igmp_domifattach()
630 return igi; in igmp_domifattach()
638 igmp_domifreattach(struct igmp_ifinfo *igi) in igmp_domifreattach() argument
644 IGI_LOCK(igi); in igmp_domifreattach()
645 VERIFY(!(igi->igi_debug & IFD_ATTACHED)); in igmp_domifreattach()
646 ifp = igi->igi_ifp; in igmp_domifreattach()
648 igi_initvar(igi, ifp, 1); in igmp_domifreattach()
649 igi->igi_debug |= IFD_ATTACHED; in igmp_domifreattach()
650 IGI_ADDREF_LOCKED(igi); /* hold a reference for igi_head */ in igmp_domifreattach()
651 IGI_UNLOCK(igi); in igmp_domifreattach()
653 igmp_initsilent(ifp, igi); in igmp_domifreattach()
656 LIST_INSERT_HEAD(&igi_head, igi, igi_link); in igmp_domifreattach()
694 struct igmp_ifinfo *igi, *tigi; in igi_delete() local
698 LIST_FOREACH_SAFE(igi, &igi_head, igi_link, tigi) { in igi_delete()
699 IGI_LOCK(igi); in igi_delete()
700 if (igi->igi_ifp == ifp) { in igi_delete()
704 IF_DRAIN(&igi->igi_gq); in igi_delete()
705 IF_DRAIN(&igi->igi_v2q); in igi_delete()
706 igmp_flush_relq(igi, inm_dthead); in igi_delete()
707 igi->igi_debug &= ~IFD_ATTACHED; in igi_delete()
708 IGI_UNLOCK(igi); in igi_delete()
710 LIST_REMOVE(igi, igi_link); in igi_delete()
711 IGI_REMREF(igi); /* release igi_head reference */ in igi_delete()
714 IGI_UNLOCK(igi); in igi_delete()
721 igmp_initsilent(struct ifnet *ifp, struct igmp_ifinfo *igi) in igmp_initsilent() argument
725 IGI_LOCK_ASSERT_NOTHELD(igi); in igmp_initsilent()
726 IGI_LOCK(igi); in igmp_initsilent()
728 igi->igi_flags |= IGIF_SILENT; in igmp_initsilent()
730 igi->igi_flags &= ~IGIF_SILENT; in igmp_initsilent()
732 IGI_UNLOCK(igi); in igmp_initsilent()
736 igi_initvar(struct igmp_ifinfo *igi, struct ifnet *ifp, int reattach) in igi_initvar() argument
738 IGI_LOCK_ASSERT_HELD(igi); in igi_initvar()
740 igi->igi_ifp = ifp; in igi_initvar()
741 igi->igi_version = igmp_default_version; in igi_initvar()
742 igi->igi_flags = 0; in igi_initvar()
743 igi->igi_rv = IGMP_RV_INIT; in igi_initvar()
744 igi->igi_qi = IGMP_QI_INIT; in igi_initvar()
745 igi->igi_qri = IGMP_QRI_INIT; in igi_initvar()
746 igi->igi_uri = IGMP_URI_INIT; in igi_initvar()
749 SLIST_INIT(&igi->igi_relinmhead); in igi_initvar()
755 igi->igi_gq.ifq_maxlen = IGMP_MAX_RESPONSE_PACKETS; in igi_initvar()
756 igi->igi_v2q.ifq_maxlen = IGMP_MAX_RESPONSE_PACKETS; in igi_initvar()
762 struct igmp_ifinfo *igi = zalloc_flags(igi_zone, how | Z_ZERO); in igi_alloc() local
763 if (igi != NULL) { in igi_alloc()
764 lck_mtx_init(&igi->igi_lock, &igmp_mtx_grp, &igmp_mtx_attr); in igi_alloc()
765 igi->igi_debug |= IFD_ALLOC; in igi_alloc()
767 return igi; in igi_alloc()
771 igi_free(struct igmp_ifinfo *igi) in igi_free() argument
773 IGI_LOCK(igi); in igi_free()
774 if (igi->igi_debug & IFD_ATTACHED) { in igi_free()
775 panic("%s: attached igi=%p is being freed", __func__, igi); in igi_free()
777 } else if (igi->igi_ifp != NULL) { in igi_free()
778 panic("%s: ifp not NULL for igi=%p", __func__, igi); in igi_free()
780 } else if (!(igi->igi_debug & IFD_ALLOC)) { in igi_free()
781 panic("%s: igi %p cannot be freed", __func__, igi); in igi_free()
783 } else if (igi->igi_refcnt != 0) { in igi_free()
784 panic("%s: non-zero refcnt igi=%p", __func__, igi); in igi_free()
787 igi->igi_debug &= ~IFD_ALLOC; in igi_free()
788 IGI_UNLOCK(igi); in igi_free()
790 lck_mtx_destroy(&igi->igi_lock, &igmp_mtx_grp); in igi_free()
791 zfree(igi_zone, igi); in igi_free()
795 igi_addref(struct igmp_ifinfo *igi, int locked) in igi_addref() argument
798 IGI_LOCK_SPIN(igi); in igi_addref()
800 IGI_LOCK_ASSERT_HELD(igi); in igi_addref()
803 if (++igi->igi_refcnt == 0) { in igi_addref()
804 panic("%s: igi=%p wraparound refcnt", __func__, igi); in igi_addref()
808 IGI_UNLOCK(igi); in igi_addref()
813 igi_remref(struct igmp_ifinfo *igi) in igi_remref() argument
818 IGI_LOCK_SPIN(igi); in igi_remref()
820 if (igi->igi_refcnt == 0) { in igi_remref()
821 panic("%s: igi=%p negative refcnt", __func__, igi); in igi_remref()
825 --igi->igi_refcnt; in igi_remref()
826 if (igi->igi_refcnt > 0) { in igi_remref()
827 IGI_UNLOCK(igi); in igi_remref()
831 ifp = igi->igi_ifp; in igi_remref()
832 igi->igi_ifp = NULL; in igi_remref()
833 IF_DRAIN(&igi->igi_gq); in igi_remref()
834 IF_DRAIN(&igi->igi_v2q); in igi_remref()
836 igmp_flush_relq(igi, (struct igmp_inm_relhead *)&inm_dthead); in igi_remref()
837 IGI_UNLOCK(igi); in igi_remref()
845 igi_free(igi); in igi_remref()
856 struct igmp_ifinfo *igi; in igmp_input_v1_query() local
876 igi = IGMP_IFINFO(ifp); in igmp_input_v1_query()
877 VERIFY(igi != NULL); in igmp_input_v1_query()
879 IGI_LOCK(igi); in igmp_input_v1_query()
880 if (igi->igi_flags & IGIF_LOOPBACK) { in igmp_input_v1_query()
885 IGI_UNLOCK(igi); in igmp_input_v1_query()
891 itp.qpt = igmp_set_version(igi, IGMP_VERSION_1); in igmp_input_v1_query()
892 IGI_UNLOCK(igi); in igmp_input_v1_query()
946 struct igmp_ifinfo *igi; in igmp_input_v2_query() local
974 igi = IGMP_IFINFO(ifp); in igmp_input_v2_query()
975 VERIFY(igi != NULL); in igmp_input_v2_query()
977 IGI_LOCK(igi); in igmp_input_v2_query()
978 if (igi->igi_flags & IGIF_LOOPBACK) { in igmp_input_v2_query()
981 IGI_UNLOCK(igi); in igmp_input_v2_query()
987 if (igi->igi_version == IGMP_VERSION_1) { in igmp_input_v2_query()
988 IGI_UNLOCK(igi); in igmp_input_v2_query()
991 itp.qpt = igmp_set_version(igi, IGMP_VERSION_2); in igmp_input_v2_query()
992 IGI_UNLOCK(igi); in igmp_input_v2_query()
1110 struct igmp_ifinfo *igi; in igmp_input_v3_query() local
1185 igi = IGMP_IFINFO(ifp); in igmp_input_v3_query()
1186 VERIFY(igi != NULL); in igmp_input_v3_query()
1188 IGI_LOCK(igi); in igmp_input_v3_query()
1189 if (igi->igi_flags & IGIF_LOOPBACK) { in igmp_input_v3_query()
1193 IGI_UNLOCK(igi); in igmp_input_v3_query()
1203 if (igi->igi_version != IGMP_VERSION_3) { in igmp_input_v3_query()
1205 "ifp %s\n", __func__, igi->igi_version, in igmp_input_v3_query()
1207 IGI_UNLOCK(igi); in igmp_input_v3_query()
1211 itp.qpt = igmp_set_version(igi, IGMP_VERSION_3); in igmp_input_v3_query()
1212 igi->igi_rv = qrv; in igmp_input_v3_query()
1213 igi->igi_qi = qqi; in igmp_input_v3_query()
1214 igi->igi_qri = MAX(timer, IGMP_QRI_MIN); in igmp_input_v3_query()
1216 IGMP_PRINTF(("%s: qrv %d qi %d qri %d\n", __func__, igi->igi_rv, in igmp_input_v3_query()
1217 igi->igi_qi, igi->igi_qri)); in igmp_input_v3_query()
1230 if (igi->igi_v3_timer == 0 || igi->igi_v3_timer >= timer) { in igmp_input_v3_query()
1231 itp.it = igi->igi_v3_timer = IGMP_RANDOM_DELAY(timer); in igmp_input_v3_query()
1233 IGI_UNLOCK(igi); in igmp_input_v3_query()
1235 IGI_UNLOCK(igi); in igmp_input_v3_query()
1273 IGI_LOCK(igi); in igmp_input_v3_query()
1274 itp.it = igi->igi_v3_timer; in igmp_input_v3_query()
1275 IGI_UNLOCK(igi); in igmp_input_v3_query()
1449 struct igmp_ifinfo *igi; in igmp_input_v1_report() local
1453 igi = inm->inm_igi; in igmp_input_v1_report()
1454 VERIFY(igi != NULL); in igmp_input_v1_report()
1464 IGI_LOCK(igi); in igmp_input_v1_report()
1465 if (igi->igi_version == IGMP_VERSION_3) { in igmp_input_v1_report()
1469 IGI_UNLOCK(igi); in igmp_input_v1_report()
1498 if (igi->igi_version == IGMP_VERSION_1) { in igmp_input_v1_report()
1500 } else if (igi->igi_version == IGMP_VERSION_2) { in igmp_input_v1_report()
1509 IGI_UNLOCK(igi); in igmp_input_v1_report()
1600 struct igmp_ifinfo *igi; in igmp_input_v2_report() local
1603 igi = inm->inm_igi; in igmp_input_v2_report()
1604 VERIFY(igi != NULL); in igmp_input_v2_report()
1614 IGI_LOCK(igi); in igmp_input_v2_report()
1615 if (igi->igi_version == IGMP_VERSION_3) { in igmp_input_v2_report()
1619 IGI_UNLOCK(igi); in igmp_input_v2_report()
1648 IGI_UNLOCK(igi); in igmp_input_v2_report()
1930 struct igmp_ifinfo *igi; in igmp_timeout() local
1965 LIST_FOREACH(igi, &igi_head, igi_link) { in igmp_timeout()
1966 IGI_LOCK(igi); in igmp_timeout()
1967 igmp_v1v2_process_querier_timers(igi); in igmp_timeout()
1968 if (igi->igi_v1_timer > 0 || igi->igi_v2_timer > 0) { in igmp_timeout()
1971 IGI_UNLOCK(igi); in igmp_timeout()
1981 LIST_FOREACH(igi, &igi_head, igi_link) { in igmp_timeout()
1982 IGI_LOCK(igi); in igmp_timeout()
1983 if (igi->igi_version != IGMP_VERSION_3) { in igmp_timeout()
1984 IGI_UNLOCK(igi); in igmp_timeout()
1987 if (igi->igi_v3_timer == 0) { in igmp_timeout()
1989 } else if (--igi->igi_v3_timer == 0) { in igmp_timeout()
1990 if (igmp_v3_dispatch_general_query(igi) > 0) { in igmp_timeout()
1996 IGI_UNLOCK(igi); in igmp_timeout()
2021 LIST_FOREACH(igi, &igi_head, igi_link) { in igmp_timeout()
2024 IGI_LOCK(igi); in igmp_timeout()
2025 ifp = igi->igi_ifp; in igmp_timeout()
2026 loop = (igi->igi_flags & IGIF_LOOPBACK) ? 1 : 0; in igmp_timeout()
2027 uri_sec = IGMP_RANDOM_DELAY(igi->igi_uri); in igmp_timeout()
2028 IGI_UNLOCK(igi); in igmp_timeout()
2038 IGI_LOCK(igi); in igmp_timeout()
2039 switch (igi->igi_version) { in igmp_timeout()
2043 igi->igi_version); in igmp_timeout()
2046 igmp_v3_process_group_timers(igi, &qrq, in igmp_timeout()
2050 IGI_UNLOCK(igi); in igmp_timeout()
2057 IGI_LOCK(igi); in igmp_timeout()
2058 if (igi->igi_version == IGMP_VERSION_1 || in igmp_timeout()
2059 igi->igi_version == IGMP_VERSION_2) { in igmp_timeout()
2060 igmp_dispatch_queue(igi, &igi->igi_v2q, 0, loop); in igmp_timeout()
2061 } else if (igi->igi_version == IGMP_VERSION_3) { in igmp_timeout()
2062 IGI_UNLOCK(igi); in igmp_timeout()
2067 IGI_LOCK(igi); in igmp_timeout()
2073 IF_DRAIN(&igi->igi_v2q); in igmp_timeout()
2080 igmp_flush_relq(igi, (struct igmp_inm_relhead *)&inm_dthead); in igmp_timeout()
2081 IGI_UNLOCK(igi); in igmp_timeout()
2155 igmp_append_relq(struct igmp_ifinfo *igi, struct in_multi *inm) in igmp_append_relq() argument
2157 IGI_LOCK_ASSERT_HELD(igi); in igmp_append_relq()
2161 if_name(igi->igi_ifp)); in igmp_append_relq()
2166 if_name(igi->igi_ifp)); in igmp_append_relq()
2168 SLIST_INSERT_HEAD(&igi->igi_relinmhead, inm, inm_nrele); in igmp_append_relq()
2177 igmp_flush_relq(struct igmp_ifinfo *igi, struct igmp_inm_relhead *inm_dthead) in igmp_flush_relq() argument
2187 IGI_LOCK_ASSERT_HELD(igi); in igmp_flush_relq()
2189 while ((inm = SLIST_FIRST(&igi->igi_relinmhead)) != NULL) { in igmp_flush_relq()
2190 SLIST_REMOVE_HEAD(&igi->igi_relinmhead, inm_nrele); in igmp_flush_relq()
2193 IGI_UNLOCK(igi); in igmp_flush_relq()
2228 IGI_LOCK(igi); in igmp_flush_relq()
2286 igmp_v3_process_group_timers(struct igmp_ifinfo *igi, in igmp_v3_process_group_timers() argument
2295 IGI_LOCK_ASSERT_HELD(igi); in igmp_v3_process_group_timers()
2296 VERIFY(igi == inm->inm_igi); in igmp_v3_process_group_timers()
2407 igmp_append_relq(igi, inm); in igmp_v3_process_group_timers()
2449 igmp_set_version(struct igmp_ifinfo *igi, const int igmp_version) in igmp_set_version() argument
2453 IGI_LOCK_ASSERT_HELD(igi); in igmp_set_version()
2456 igmp_version, if_name(igi->igi_ifp)); in igmp_set_version()
2463 old_version_timer = igi->igi_rv * igi->igi_qi + igi->igi_qri; in igmp_set_version()
2466 igi->igi_v1_timer = old_version_timer; in igmp_set_version()
2467 igi->igi_v2_timer = 0; in igmp_set_version()
2469 igi->igi_v1_timer = 0; in igmp_set_version()
2470 igi->igi_v2_timer = old_version_timer; in igmp_set_version()
2474 if (igi->igi_v1_timer == 0 && igi->igi_v2_timer > 0) { in igmp_set_version()
2475 if (igi->igi_version != IGMP_VERSION_2) { in igmp_set_version()
2476 igmp_v3_cancel_link_timers(igi); in igmp_set_version()
2477 igi->igi_version = IGMP_VERSION_2; in igmp_set_version()
2479 } else if (igi->igi_v1_timer > 0) { in igmp_set_version()
2480 if (igi->igi_version != IGMP_VERSION_1) { in igmp_set_version()
2481 igmp_v3_cancel_link_timers(igi); in igmp_set_version()
2482 igi->igi_version = IGMP_VERSION_1; in igmp_set_version()
2486 IGI_LOCK_ASSERT_HELD(igi); in igmp_set_version()
2488 return MAX(igi->igi_v1_timer, igi->igi_v2_timer); in igmp_set_version()
2501 igmp_v3_cancel_link_timers(struct igmp_ifinfo *igi) in igmp_v3_cancel_link_timers() argument
2507 IGI_LOCK_ASSERT_HELD(igi); in igmp_v3_cancel_link_timers()
2510 (uint64_t)VM_KERNEL_ADDRPERM(igi->igi_ifp), if_name(igi->igi_ifp))); in igmp_v3_cancel_link_timers()
2517 igi->igi_v3_timer = 0; in igmp_v3_cancel_link_timers()
2523 ifp = igi->igi_ifp; in igmp_v3_cancel_link_timers()
2524 IGI_UNLOCK(igi); in igmp_v3_cancel_link_timers()
2530 if (inm->inm_ifp != ifp && inm->inm_igi != igi) { in igmp_v3_cancel_link_timers()
2560 IGI_LOCK(igi); in igmp_v3_cancel_link_timers()
2561 igmp_append_relq(igi, inm); in igmp_v3_cancel_link_timers()
2562 IGI_UNLOCK(igi); in igmp_v3_cancel_link_timers()
2585 IGI_LOCK(igi); in igmp_v3_cancel_link_timers()
2593 igmp_v1v2_process_querier_timers(struct igmp_ifinfo *igi) in igmp_v1v2_process_querier_timers() argument
2595 IGI_LOCK_ASSERT_HELD(igi); in igmp_v1v2_process_querier_timers()
2597 if (igi->igi_v1_timer == 0 && igi->igi_v2_timer == 0) { in igmp_v1v2_process_querier_timers()
2603 if (igi->igi_version != IGMP_VERSION_3) { in igmp_v1v2_process_querier_timers()
2606 igi->igi_version, IGMP_VERSION_3, in igmp_v1v2_process_querier_timers()
2607 if_name(igi->igi_ifp)); in igmp_v1v2_process_querier_timers()
2608 igi->igi_version = IGMP_VERSION_3; in igmp_v1v2_process_querier_timers()
2609 IF_DRAIN(&igi->igi_v2q); in igmp_v1v2_process_querier_timers()
2611 } else if (igi->igi_v1_timer == 0 && igi->igi_v2_timer > 0) { in igmp_v1v2_process_querier_timers()
2622 igi->igi_version, IGMP_VERSION_3, in igmp_v1v2_process_querier_timers()
2623 if_name(igi->igi_ifp)); in igmp_v1v2_process_querier_timers()
2624 igi->igi_v2_timer = 0; in igmp_v1v2_process_querier_timers()
2625 igi->igi_version = IGMP_VERSION_3; in igmp_v1v2_process_querier_timers()
2626 IF_DRAIN(&igi->igi_v2q); in igmp_v1v2_process_querier_timers()
2628 --igi->igi_v2_timer; in igmp_v1v2_process_querier_timers()
2629 if (igi->igi_version != IGMP_VERSION_2) { in igmp_v1v2_process_querier_timers()
2632 igi->igi_version, IGMP_VERSION_2, in igmp_v1v2_process_querier_timers()
2633 if_name(igi->igi_ifp)); in igmp_v1v2_process_querier_timers()
2634 IF_DRAIN(&igi->igi_gq); in igmp_v1v2_process_querier_timers()
2635 igmp_v3_cancel_link_timers(igi); in igmp_v1v2_process_querier_timers()
2636 igi->igi_version = IGMP_VERSION_2; in igmp_v1v2_process_querier_timers()
2639 } else if (igi->igi_v1_timer > 0) { in igmp_v1v2_process_querier_timers()
2651 igi->igi_version, IGMP_VERSION_3, in igmp_v1v2_process_querier_timers()
2652 if_name(igi->igi_ifp)); in igmp_v1v2_process_querier_timers()
2653 igi->igi_v1_timer = 0; in igmp_v1v2_process_querier_timers()
2654 igi->igi_version = IGMP_VERSION_3; in igmp_v1v2_process_querier_timers()
2655 IF_DRAIN(&igi->igi_v2q); in igmp_v1v2_process_querier_timers()
2657 --igi->igi_v1_timer; in igmp_v1v2_process_querier_timers()
2659 if (igi->igi_v2_timer > 0) { in igmp_v1v2_process_querier_timers()
2662 (uint64_t)VM_KERNEL_ADDRPERM(igi->igi_ifp), in igmp_v1v2_process_querier_timers()
2663 if_name(igi->igi_ifp))); in igmp_v1v2_process_querier_timers()
2664 igi->igi_v2_timer = 0; in igmp_v1v2_process_querier_timers()
2770 struct igmp_ifinfo *igi; in igmp_change_state() local
2792 igi = IGMP_IFINFO(ifp); in igmp_change_state()
2793 VERIFY(igi != NULL); in igmp_change_state()
2805 error = igmp_initial_join(inm, igi, itp); in igmp_change_state()
2809 igmp_final_leave(inm, igi, itp); in igmp_change_state()
2816 error = igmp_handle_state_change(inm, igi, itp); in igmp_change_state()
2832 igmp_initial_join(struct in_multi *inm, struct igmp_ifinfo *igi, in igmp_initial_join() argument
2840 IGI_LOCK_ASSERT_NOTHELD(igi); in igmp_initial_join()
2853 IGI_LOCK(igi); in igmp_initial_join()
2854 VERIFY(igi->igi_ifp == ifp); in igmp_initial_join()
2866 (igi->igi_flags & IGIF_SILENT) || in igmp_initial_join()
2881 if (igi->igi_version == IGMP_VERSION_3 && in igmp_initial_join()
2884 igmp_append_relq(igi, inm); in igmp_initial_join()
2889 switch (igi->igi_version) { in igmp_initial_join()
2894 (igi->igi_version == IGMP_VERSION_2) ? in igmp_initial_join()
2899 IGI_LOCK_ASSERT_HELD(igi); in igmp_initial_join()
2939 if (igi->igi_flags & IGIF_LOOPBACK) { in igmp_initial_join()
2942 VERIFY(igi->igi_rv > 1); in igmp_initial_join()
2943 inm->inm_scrv = (uint16_t)igi->igi_rv; in igmp_initial_join()
2952 IGI_UNLOCK(igi); in igmp_initial_join()
2973 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()
3016 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()