Lines Matching defs:inm

627  * responses and record releases; all remaining inm records and their source
797 struct in_multi *inm;
838 IN_FIRST_MULTI(step, inm);
839 while (inm != NULL) {
840 INM_LOCK(inm);
841 if (inm->inm_ifp != ifp)
843 if (inm->inm_timer != 0)
846 switch (inm->inm_state) {
857 inm->inm_state = IGMP_REPORTING_MEMBER;
858 inm->inm_timer = IGMP_RANDOM_DELAY(
866 INM_UNLOCK(inm);
867 IN_NEXT_MULTI(step, inm);
882 struct in_multi *inm;
939 IN_FIRST_MULTI(step, inm);
940 while (inm != NULL) {
941 INM_LOCK(inm);
942 if (inm->inm_ifp == ifp)
943 igmp_v2_update_group(inm, timer);
944 INM_UNLOCK(inm);
945 IN_NEXT_MULTI(step, inm);
954 IN_LOOKUP_MULTI(&igmp->igmp_group, ifp, inm);
956 if (inm != NULL) {
957 INM_LOCK(inm);
961 igmp_v2_update_group(inm, timer);
962 INM_UNLOCK(inm);
963 INM_REMREF(inm); /* from IN_LOOKUP_MULTI */
986 igmp_v2_update_group(struct in_multi *inm, const int timer)
990 inet_ntoa(inm->inm_addr), inm->inm_ifp->if_name,
991 inm->inm_ifp->if_unit, timer));
993 INM_LOCK_ASSERT_HELD(inm);
995 switch (inm->inm_state) {
1000 if (inm->inm_timer != 0 &&
1001 inm->inm_timer <= timer) {
1013 inm->inm_state = IGMP_REPORTING_MEMBER;
1014 inm->inm_timer = IGMP_RANDOM_DELAY(timer);
1019 inm->inm_state = IGMP_AWAKENING_MEMBER;
1037 struct in_multi *inm;
1164 IN_LOOKUP_MULTI(&igmpv3->igmp_group, ifp, inm);
1166 if (inm == NULL)
1169 INM_LOCK(inm);
1173 if (!ratecheck(&inm->inm_lastgsrtv,
1178 INM_UNLOCK(inm);
1179 INM_REMREF(inm); /* from IN_LOOKUP_MULTI */
1197 igmp_input_v3_group_query(inm, timer, igmpv3);
1201 INM_UNLOCK(inm);
1202 INM_REMREF(inm); /* from IN_LOOKUP_MULTI */
1214 igmp_input_v3_group_query(struct in_multi *inm,
1220 INM_LOCK_ASSERT_HELD(inm);
1224 switch (inm->inm_state) {
1248 if (inm->inm_state == IGMP_G_QUERY_PENDING_MEMBER ||
1249 inm->inm_state == IGMP_SG_QUERY_PENDING_MEMBER) {
1250 inm_clear_recorded(inm);
1251 timer = min(inm->inm_timer, timer);
1253 inm->inm_state = IGMP_G_QUERY_PENDING_MEMBER;
1254 inm->inm_timer = IGMP_RANDOM_DELAY(timer);
1263 if (inm->inm_state == IGMP_G_QUERY_PENDING_MEMBER) {
1264 timer = min(inm->inm_timer, timer);
1265 inm->inm_timer = IGMP_RANDOM_DELAY(timer);
1284 if (inm->inm_nsrc > 0) {
1291 retval = inm_record_source(inm, ap->s_addr);
1299 inm->inm_state = IGMP_SG_QUERY_PENDING_MEMBER;
1300 inm->inm_timer = IGMP_RANDOM_DELAY(timer);
1318 struct in_multi *inm;
1359 IN_LOOKUP_MULTI(&igmp->igmp_group, ifp, inm);
1361 if (inm != NULL) {
1364 INM_LOCK(inm);
1366 igi = inm->inm_igi;
1380 igmp_v3_suppress_group_record(inm);
1382 INM_UNLOCK(inm);
1383 INM_REMREF(inm); /* from IN_LOOKUP_MULTI */
1387 INM_LOCK_ASSERT_HELD(inm);
1388 inm->inm_timer = 0;
1390 switch (inm->inm_state) {
1401 inm->inm_state = IGMP_SLEEPING_MEMBER;
1408 inm->inm_state = IGMP_LAZY_MEMBER;
1410 inm->inm_state = IGMP_SLEEPING_MEMBER;
1418 INM_UNLOCK(inm);
1419 INM_REMREF(inm); /* from IN_LOOKUP_MULTI */
1435 struct in_multi *inm;
1498 IN_LOOKUP_MULTI(&igmp->igmp_group, ifp, inm);
1500 if (inm != NULL) {
1503 INM_LOCK(inm);
1504 igi = inm->inm_igi;
1518 igmp_v3_suppress_group_record(inm);
1520 INM_UNLOCK(inm);
1521 INM_REMREF(inm);
1525 inm->inm_timer = 0;
1527 switch (inm->inm_state) {
1539 inm->inm_state = IGMP_LAZY_MEMBER;
1547 INM_UNLOCK(inm);
1548 INM_REMREF(inm);
1774 struct in_multi *inm;
1846 IN_FIRST_MULTI(step, inm);
1847 while (inm != NULL) {
1848 INM_LOCK(inm);
1849 if (inm->inm_ifp != ifp)
1856 igmp_v1v2_process_group_timer(inm,
1861 &scq, inm, uri_fasthz);
1866 INM_UNLOCK(inm);
1867 IN_NEXT_MULTI(step, inm);
1889 * Release all deferred inm records, and drain any locally
1917 struct in_multi *inm;
1921 inm = SLIST_FIRST(&igi->igi_relinmhead);
1922 if (inm != NULL) {
1929 INM_LOCK(inm);
1930 VERIFY(inm->inm_nrelecnt != 0);
1931 inm->inm_nrelecnt--;
1932 lastref = in_multi_detach(inm);
1933 VERIFY(!lastref || (!(inm->inm_debug & IFD_ATTACHED) &&
1934 inm->inm_reqcnt == 0));
1935 INM_UNLOCK(inm);
1938 INM_REMREF(inm);
1949 IGMP_ADD_DETACHED_INM(inm_dthead, inm);
1961 igmp_v1v2_process_group_timer(struct in_multi *inm, const int igmp_version)
1965 INM_LOCK_ASSERT_HELD(inm);
1966 IGI_LOCK_ASSERT_HELD(inm->inm_igi);
1968 if (inm->inm_timer == 0) {
1970 } else if (--inm->inm_timer == 0) {
1977 switch (inm->inm_state) {
1987 inm->inm_state = IGMP_IDLE_MEMBER;
1988 (void) igmp_v1v2_queue_report(inm,
1992 INM_LOCK_ASSERT_HELD(inm);
1993 IGI_LOCK_ASSERT_HELD(inm->inm_igi);
2011 struct in_multi *inm, const int uri_fasthz)
2016 INM_LOCK_ASSERT_HELD(inm);
2018 VERIFY(igi == inm->inm_igi);
2029 if (inm->inm_timer == 0) {
2031 } else if (--inm->inm_timer == 0) {
2037 if (inm->inm_sctimer == 0) {
2039 } else if (--inm->inm_sctimer == 0) {
2050 switch (inm->inm_state) {
2069 retval = igmp_v3_enqueue_group_record(qrq, inm, 0, 1,
2070 (inm->inm_state == IGMP_SG_QUERY_PENDING_MEMBER));
2073 inm->inm_state = IGMP_REPORTING_MEMBER;
2075 inm_clear_recorded(inm);
2087 if (--inm->inm_scrv > 0) {
2088 inm->inm_sctimer = uri_fasthz;
2098 (void) igmp_v3_merge_state_changes(inm, scq);
2100 inm_commit(inm);
2102 inet_ntoa(inm->inm_addr), inm->inm_ifp->if_name,
2103 inm->inm_ifp->if_unit));
2112 if (inm->inm_state == IGMP_LEAVING_MEMBER &&
2113 inm->inm_scrv == 0) {
2114 inm->inm_state = IGMP_NOT_MEMBER;
2117 * igmp_final_leave() for this inm, so
2124 VERIFY(inm->inm_nrelecnt != 0);
2126 inm, inm_nrele);
2143 igmp_v3_suppress_group_record(struct in_multi *inm)
2146 INM_LOCK_ASSERT_HELD(inm);
2147 IGI_LOCK_ASSERT_HELD(inm->inm_igi);
2149 VERIFY(inm->inm_igi->igi_version == IGMP_VERSION_3);
2151 if (inm->inm_state != IGMP_G_QUERY_PENDING_MEMBER ||
2152 inm->inm_state != IGMP_SG_QUERY_PENDING_MEMBER)
2155 if (inm->inm_state == IGMP_SG_QUERY_PENDING_MEMBER)
2156 inm_clear_recorded(inm);
2158 inm->inm_timer = 0;
2159 inm->inm_state = IGMP_REPORTING_MEMBER;
2222 struct in_multi *inm;
2245 IN_FIRST_MULTI(step, inm);
2246 while (inm != NULL) {
2247 INM_LOCK(inm);
2248 if (inm->inm_ifp != ifp)
2251 switch (inm->inm_state) {
2276 VERIFY(inm->inm_nrelecnt != 0);
2278 SLIST_INSERT_HEAD(&igi->igi_relinmhead, inm, inm_nrele);
2283 inm_clear_recorded(inm);
2286 inm->inm_state = IGMP_REPORTING_MEMBER;
2293 inm->inm_sctimer = 0;
2294 inm->inm_timer = 0;
2295 IF_DRAIN(&inm->inm_scq);
2297 INM_UNLOCK(inm);
2298 IN_NEXT_MULTI(step, inm);
2389 igmp_v1v2_queue_report(struct in_multi *inm, const int type)
2397 INM_LOCK_ASSERT_HELD(inm);
2398 IGI_LOCK_ASSERT_HELD(inm->inm_igi);
2400 ifp = inm->inm_ifp;
2415 igmp->igmp_group = inm->inm_addr;
2432 ip->ip_dst = inm->inm_addr;
2435 if (inm->inm_igi->igi_flags & IGIF_LOOPBACK)
2446 if (IF_QFULL(&inm->inm_igi->igi_v2q)) {
2451 IF_ENQUEUE(&inm->inm_igi->igi_v2q, m);
2475 igmp_change_state(struct in_multi *inm)
2481 INM_LOCK_ASSERT_HELD(inm);
2482 VERIFY(inm->inm_igi != NULL);
2483 IGI_LOCK_ASSERT_NOTHELD(inm->inm_igi);
2489 VERIFY(inm->inm_ifma != NULL);
2490 ifp = inm->inm_ifma->ifma_ifp;
2494 VERIFY(inm->inm_ifp == ifp);
2504 if (inm->inm_st[1].iss_fmode != inm->inm_st[0].iss_fmode) {
2505 IGMP_PRINTF(("%s: inm transition %d -> %d\n", __func__,
2506 inm->inm_st[0].iss_fmode, inm->inm_st[1].iss_fmode));
2507 if (inm->inm_st[0].iss_fmode == MCAST_UNDEFINED) {
2509 error = igmp_initial_join(inm, igi);
2511 } else if (inm->inm_st[1].iss_fmode == MCAST_UNDEFINED) {
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)
2542 INM_LOCK_ASSERT_HELD(inm);
2546 __func__, inet_ntoa(inm->inm_addr), inm->inm_ifp,
2547 inm->inm_ifp->if_name, inm->inm_ifp->if_unit));
2552 ifp = inm->inm_ifp;
2568 !igmp_isgroupreported(inm->inm_addr)) {
2571 inm->inm_state = IGMP_SILENT_MEMBER;
2572 inm->inm_timer = 0;
2583 inm->inm_state == IGMP_LEAVING_MEMBER) {
2584 VERIFY(inm->inm_nrelecnt != 0);
2585 SLIST_INSERT_HEAD(&igi->igi_relinmhead, inm, inm_nrele);
2588 inm->inm_state = IGMP_REPORTING_MEMBER;
2593 inm->inm_state = IGMP_IDLE_MEMBER;
2594 error = igmp_v1v2_queue_report(inm,
2599 INM_LOCK_ASSERT_HELD(inm);
2603 inm->inm_timer = IGMP_RANDOM_DELAY(
2622 ifq = &inm->inm_scq;
2624 retval = igmp_v3_enqueue_group_record(ifq, inm, 1,
2640 inm->inm_scrv = 1;
2643 inm->inm_scrv = igi->igi_rv;
2645 inm->inm_sctimer = 1;
2660 inm_commit(inm);
2662 inet_ntoa(inm->inm_addr), inm->inm_ifp->if_name,
2663 inm->inm_ifp->if_unit));
2673 igmp_handle_state_change(struct in_multi *inm, struct igmp_ifinfo *igi)
2678 INM_LOCK_ASSERT_HELD(inm);
2682 __func__, inet_ntoa(inm->inm_addr), inm->inm_ifp,
2683 inm->inm_ifp->if_name, inm->inm_ifp->if_unit));
2685 ifp = inm->inm_ifp;
2692 !igmp_isgroupreported(inm->inm_addr) ||
2695 if (!igmp_isgroupreported(inm->inm_addr)) {
2700 inm_commit(inm);
2702 inet_ntoa(inm->inm_addr), inm->inm_ifp->if_name));
2706 IF_DRAIN(&inm->inm_scq);
2708 retval = igmp_v3_enqueue_group_record(&inm->inm_scq, inm, 1, 0, 0);
2718 inm->inm_scrv = ((igi->igi_flags & IGIF_LOOPBACK) ? 1 : igi->igi_rv);
2719 inm->inm_sctimer = 1;
2736 igmp_final_leave(struct in_multi *inm, struct igmp_ifinfo *igi)
2740 INM_LOCK_ASSERT_HELD(inm);
2744 __func__, inet_ntoa(inm->inm_addr), inm->inm_ifp,
2745 inm->inm_ifp->if_name, inm->inm_ifp->if_unit));
2747 switch (inm->inm_state) {
2761 if (inm->inm_state == IGMP_G_QUERY_PENDING_MEMBER ||
2762 inm->inm_state == IGMP_SG_QUERY_PENDING_MEMBER) {
2767 igmp_v1v2_queue_report(inm, IGMP_HOST_LEAVE_MESSAGE);
2769 INM_LOCK_ASSERT_HELD(inm);
2772 inm->inm_state = IGMP_NOT_MEMBER;
2780 IF_DRAIN(&inm->inm_scq);
2781 inm->inm_timer = 0;
2783 inm->inm_scrv = 1;
2785 inm->inm_scrv = igi->igi_rv;
2789 inet_ntoa(inm->inm_addr),
2790 inm->inm_ifp->if_name, inm->inm_ifp->if_unit,
2791 inm->inm_scrv));
2792 if (inm->inm_scrv == 0) {
2793 inm->inm_state = IGMP_NOT_MEMBER;
2794 inm->inm_sctimer = 0;
2803 INM_ADDREF_LOCKED(inm);
2804 VERIFY(inm->inm_debug & IFD_ATTACHED);
2805 inm->inm_reqcnt++;
2806 VERIFY(inm->inm_reqcnt >= 1);
2807 inm->inm_nrelecnt++;
2808 VERIFY(inm->inm_nrelecnt != 0);
2811 &inm->inm_scq, inm, 1, 0, 0);
2816 inm->inm_state = IGMP_LEAVING_MEMBER;
2817 inm->inm_sctimer = 1;
2832 inm_commit(inm);
2834 inet_ntoa(inm->inm_addr), inm->inm_ifp->if_name,
2835 inm->inm_ifp->if_unit));
2836 inm->inm_st[1].iss_fmode = MCAST_UNDEFINED;
2838 __func__, inet_ntoa(inm->inm_addr), inm->inm_ifp->if_name,
2839 inm->inm_ifp->if_unit));
2871 igmp_v3_enqueue_group_record(struct ifqueue *ifq, struct in_multi *inm,
2889 INM_LOCK_ASSERT_HELD(inm);
2890 IGI_LOCK_ASSERT_HELD(inm->inm_igi);
2893 ifp = inm->inm_ifp;
2904 mode = inm->inm_st[1].iss_fmode;
2911 if (inm->inm_st[0].iss_asm > 0 && inm->inm_st[1].iss_asm > 0 &&
2912 inm->inm_nsrc == 0)
2926 if (mode != inm->inm_st[0].iss_fmode) {
2953 VERIFY(inm->inm_st[1].iss_asm == 0);
2961 return (igmp_v3_enqueue_filter_change(ifq, inm));
2965 __func__, inet_ntoa(inm->inm_addr),
2966 inm->inm_ifp->if_name, inm->inm_ifp->if_unit));
2980 igmp_rec_type_to_str(type), inet_ntoa(inm->inm_addr),
2981 inm->inm_ifp->if_name, inm->inm_ifp->if_unit));
3032 ig.ig_group = inm->inm_addr;
3065 RB_FOREACH_SAFE(ims, ip_msource_tree, &inm->inm_srcs, nims) {
3068 now = ims_get_mode(inm, ims, 1);
3166 now = ims_get_mode(inm, ims, 1);
3236 igmp_v3_enqueue_filter_change(struct ifqueue *ifq, struct in_multi *inm)
3252 INM_LOCK_ASSERT_HELD(inm);
3254 if (inm->inm_nsrc == 0 ||
3255 (inm->inm_st[0].iss_asm > 0 && inm->inm_st[1].iss_asm > 0))
3258 ifp = inm->inm_ifp; /* interface */
3259 mode = inm->inm_st[1].iss_fmode; /* filter mode at t1 */
3323 ig.ig_group = inm->inm_addr;
3356 nims = RB_MIN(ip_msource_tree, &inm->inm_srcs);
3360 now = ims_get_mode(inm, ims, 1);
3361 then = ims_get_mode(inm, ims, 0);
3442 igmp_v3_merge_state_changes(struct in_multi *inm, struct ifqueue *ifscq)
3452 INM_LOCK_ASSERT_HELD(inm);
3462 if (inm->inm_scrv > 0)
3465 gq = &inm->inm_scq;
3468 IGMP_PRINTF(("%s: WARNING: queue for inm %p is empty\n",
3469 __func__, inm));
3496 (inm->inm_ifp->if_mtu - IGMP_LEADINGSPACE)))
3530 m0->m_pkthdr.rcvif = inm->inm_ifp;
3558 struct in_multi *inm;
3570 IN_FIRST_MULTI(step, inm);
3571 while (inm != NULL) {
3572 INM_LOCK(inm);
3573 if (inm->inm_ifp != ifp)
3576 switch (inm->inm_state) {
3585 inm->inm_state = IGMP_REPORTING_MEMBER;
3588 inm, 0, 0, 0);
3599 INM_UNLOCK(inm);
3600 IN_NEXT_MULTI(step, inm);