Lines Matching defs:inm

567  * responses and record releases; all remaining inm records and their source
743 struct in6_multi *inm;
815 IN6_FIRST_MULTI(step, inm);
816 while (inm != NULL) {
817 IN6M_LOCK(inm);
818 if (inm->in6m_ifp == ifp)
819 mld_v1_update_group(inm, timer);
820 IN6M_UNLOCK(inm);
821 IN6_NEXT_MULTI(step, inm);
831 IN6_LOOKUP_MULTI(&mld->mld_addr, ifp, inm);
834 if (inm != NULL) {
835 IN6M_LOCK(inm);
839 mld_v1_update_group(inm, timer);
840 IN6M_UNLOCK(inm);
841 IN6M_REMREF(inm); /* from IN6_LOOKUP_MULTI */
866 mld_v1_update_group(struct in6_multi *inm, const int timer)
868 IN6M_LOCK_ASSERT_HELD(inm);
871 ip6_sprintf(&inm->in6m_addr),
872 inm->in6m_ifp->if_name, inm->in6m_ifp->if_unit, timer));
874 switch (inm->in6m_state) {
879 if (inm->in6m_timer != 0 &&
880 inm->in6m_timer <= timer) {
892 inm->in6m_state = MLD_REPORTING_MEMBER;
893 inm->in6m_timer = MLD_RANDOM_DELAY(timer);
898 inm->in6m_state = MLD_AWAKENING_MEMBER;
919 struct in6_multi *inm;
1051 IN6_LOOKUP_MULTI(&mld->mld_addr, ifp, inm);
1053 if (inm == NULL)
1056 IN6M_LOCK(inm);
1060 if (!ratecheck(&inm->in6m_lastgsrtv,
1064 IN6M_UNLOCK(inm);
1065 IN6M_REMREF(inm); /* from IN6_LOOKUP_MULTI */
1082 mld_v2_process_group_query(inm, timer, m, off);
1086 IN6M_UNLOCK(inm);
1087 IN6M_REMREF(inm); /* from IN6_LOOKUP_MULTI */
1101 mld_v2_process_group_query(struct in6_multi *inm, int timer, struct mbuf *m0,
1108 IN6M_LOCK_ASSERT_HELD(inm);
1113 switch (inm->in6m_state) {
1138 if (inm->in6m_state == MLD_G_QUERY_PENDING_MEMBER ||
1139 inm->in6m_state == MLD_SG_QUERY_PENDING_MEMBER) {
1140 in6m_clear_recorded(inm);
1141 timer = min(inm->in6m_timer, timer);
1143 inm->in6m_state = MLD_G_QUERY_PENDING_MEMBER;
1144 inm->in6m_timer = MLD_RANDOM_DELAY(timer);
1153 if (inm->in6m_state == MLD_G_QUERY_PENDING_MEMBER) {
1154 timer = min(inm->in6m_timer, timer);
1155 inm->in6m_timer = MLD_RANDOM_DELAY(timer);
1171 if (inm->in6m_nsrc > 0) {
1182 retval = in6m_record_source(inm,
1198 inm->in6m_state = MLD_SG_QUERY_PENDING_MEMBER;
1199 inm->in6m_timer = MLD_RANDOM_DELAY(timer);
1220 struct in6_multi *inm;
1300 IN6_LOOKUP_MULTI(&mld->mld_addr, ifp, inm);
1303 if (inm != NULL) {
1306 IN6M_LOCK(inm);
1307 mli = inm->in6m_mli;
1317 IN6M_UNLOCK(inm);
1318 IN6M_REMREF(inm); /* from IN6_LOOKUP_MULTI */
1323 inm->in6m_timer = 0;
1325 switch (inm->in6m_state) {
1337 inm->in6m_state = MLD_LAZY_MEMBER;
1344 IN6M_UNLOCK(inm);
1345 IN6M_REMREF(inm); /* from IN6_LOOKUP_MULTI */
1440 struct in6_multi *inm;
1515 IN6_FIRST_MULTI(step, inm);
1516 while (inm != NULL) {
1517 IN6M_LOCK(inm);
1518 if (inm->in6m_ifp != ifp)
1524 mld_v1_process_group_timer(inm,
1529 &scq, inm, uri_fasthz);
1534 IN6M_UNLOCK(inm);
1535 IN6_NEXT_MULTI(step, inm);
1556 * Release all deferred inm records, and drain any locally
1584 struct in6_multi *inm;
1588 inm = SLIST_FIRST(&mli->mli_relinmhead);
1589 if (inm != NULL) {
1596 IN6M_LOCK(inm);
1597 VERIFY(inm->in6m_nrelecnt != 0);
1598 inm->in6m_nrelecnt--;
1599 lastref = in6_multi_detach(inm);
1600 VERIFY(!lastref || (!(inm->in6m_debug & IFD_ATTACHED) &&
1601 inm->in6m_reqcnt == 0));
1602 IN6M_UNLOCK(inm);
1605 IN6M_REMREF(inm);
1616 MLD_ADD_DETACHED_IN6M(in6m_dthead, inm);
1628 mld_v1_process_group_timer(struct in6_multi *inm, const int mld_version)
1633 IN6M_LOCK_ASSERT_HELD(inm);
1634 MLI_LOCK_ASSERT_HELD(inm->in6m_mli);
1636 if (inm->in6m_timer == 0) {
1638 } else if (--inm->in6m_timer == 0) {
1645 switch (inm->in6m_state) {
1655 inm->in6m_state = MLD_IDLE_MEMBER;
1656 (void) mld_v1_transmit_report(inm,
1658 IN6M_LOCK_ASSERT_HELD(inm);
1659 MLI_LOCK_ASSERT_HELD(inm->in6m_mli);
1677 struct in6_multi *inm, const int uri_fasthz)
1682 IN6M_LOCK_ASSERT_HELD(inm);
1684 VERIFY(mli == inm->in6m_mli);
1695 if (inm->in6m_timer == 0) {
1697 } else if (--inm->in6m_timer == 0) {
1703 if (inm->in6m_sctimer == 0) {
1705 } else if (--inm->in6m_sctimer == 0) {
1716 switch (inm->in6m_state) {
1735 retval = mld_v2_enqueue_group_record(qrq, inm, 0, 1,
1736 (inm->in6m_state == MLD_SG_QUERY_PENDING_MEMBER),
1740 inm->in6m_state = MLD_REPORTING_MEMBER;
1741 in6m_clear_recorded(inm);
1753 if (--inm->in6m_scrv > 0) {
1754 inm->in6m_sctimer = uri_fasthz;
1764 (void) mld_v2_merge_state_changes(inm, scq);
1766 in6m_commit(inm);
1768 ip6_sprintf(&inm->in6m_addr),
1769 inm->in6m_ifp->if_name, inm->in6m_ifp->if_unit));
1778 if (inm->in6m_state == MLD_LEAVING_MEMBER &&
1779 inm->in6m_scrv == 0) {
1780 inm->in6m_state = MLD_NOT_MEMBER;
1783 * mld_final_leave() for this inm, so
1790 VERIFY(inm->in6m_nrelecnt != 0);
1792 inm, in6m_nrele);
1840 struct in6_multi *inm;
1862 IN6_FIRST_MULTI(step, inm);
1863 while (inm != NULL) {
1864 IN6M_LOCK(inm);
1865 if (inm->in6m_ifp != ifp)
1868 switch (inm->in6m_state) {
1886 VERIFY(inm->in6m_nrelecnt != 0);
1888 SLIST_INSERT_HEAD(&mli->mli_relinmhead, inm,
1894 in6m_clear_recorded(inm);
1897 inm->in6m_sctimer = 0;
1898 inm->in6m_timer = 0;
1899 inm->in6m_state = MLD_REPORTING_MEMBER;
1903 IF_DRAIN(&inm->in6m_scq);
1907 IN6M_UNLOCK(inm);
1908 IN6_NEXT_MULTI(step, inm);
2048 mld_change_state(struct in6_multi *inm, const int delay)
2054 IN6M_LOCK_ASSERT_HELD(inm);
2055 VERIFY(inm->in6m_mli != NULL);
2056 MLI_LOCK_ASSERT_NOTHELD(inm->in6m_mli);
2062 VERIFY(inm->in6m_ifma != NULL);
2063 ifp = inm->in6m_ifma->ifma_ifp;
2067 VERIFY(inm->in6m_ifp == ifp);
2077 if (inm->in6m_st[1].iss_fmode != inm->in6m_st[0].iss_fmode) {
2078 MLD_PRINTF(("%s: inm transition %d -> %d\n", __func__,
2079 inm->in6m_st[0].iss_fmode, inm->in6m_st[1].iss_fmode));
2080 if (inm->in6m_st[0].iss_fmode == MCAST_UNDEFINED) {
2082 error = mld_initial_join(inm, mli, delay);
2084 } else if (inm->in6m_st[1].iss_fmode == MCAST_UNDEFINED) {
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,
2120 IN6M_LOCK_ASSERT_HELD(inm);
2124 __func__, ip6_sprintf(&inm->in6m_addr),
2125 inm->in6m_ifp, inm->in6m_ifp->if_name, inm->in6m_ifp->if_unit));
2130 ifp = inm->in6m_ifp;
2146 !mld_is_addr_reported(&inm->in6m_addr)) {
2149 inm->in6m_state = MLD_SILENT_MEMBER;
2150 inm->in6m_timer = 0;
2161 inm->in6m_state == MLD_LEAVING_MEMBER) {
2162 VERIFY(inm->in6m_nrelecnt != 0);
2163 SLIST_INSERT_HEAD(&mli->mli_relinmhead, inm,
2167 inm->in6m_state = MLD_REPORTING_MEMBER;
2180 inm->in6m_timer = max(delay, odelay);
2183 inm->in6m_state = MLD_IDLE_MEMBER;
2184 error = mld_v1_transmit_report(inm,
2187 IN6M_LOCK_ASSERT_HELD(inm);
2191 inm->in6m_timer = odelay;
2210 ifq = &inm->in6m_scq;
2212 retval = mld_v2_enqueue_group_record(ifq, inm, 1,
2231 inm->in6m_scrv = mli->mli_rv;
2233 if (inm->in6m_sctimer > 1) {
2234 inm->in6m_sctimer =
2235 min(inm->in6m_sctimer, delay);
2237 inm->in6m_sctimer = delay;
2239 inm->in6m_sctimer = 1;
2254 in6m_commit(inm);
2256 ip6_sprintf(&inm->in6m_addr),
2257 inm->in6m_ifp->if_name, ifp->if_unit));
2267 mld_handle_state_change(struct in6_multi *inm, struct mld_ifinfo *mli)
2272 IN6M_LOCK_ASSERT_HELD(inm);
2276 __func__, ip6_sprintf(&inm->in6m_addr),
2277 inm->in6m_ifp, inm->in6m_ifp->if_name, inm->in6m_ifp->if_unit));
2279 ifp = inm->in6m_ifp;
2286 !mld_is_addr_reported(&inm->in6m_addr) ||
2289 if (!mld_is_addr_reported(&inm->in6m_addr)) {
2294 in6m_commit(inm);
2296 ip6_sprintf(&inm->in6m_addr),
2297 inm->in6m_ifp->if_name, inm->in6m_ifp->if_unit));
2301 IF_DRAIN(&inm->in6m_scq);
2303 retval = mld_v2_enqueue_group_record(&inm->in6m_scq, inm, 1, 0, 0,
2314 inm->in6m_scrv = mli->mli_rv;
2315 inm->in6m_sctimer = 1;
2331 mld_final_leave(struct in6_multi *inm, struct mld_ifinfo *mli)
2335 IN6M_LOCK_ASSERT_HELD(inm);
2339 __func__, ip6_sprintf(&inm->in6m_addr),
2340 inm->in6m_ifp, inm->in6m_ifp->if_name, inm->in6m_ifp->if_unit));
2342 switch (inm->in6m_state) {
2356 if (inm->in6m_state == MLD_G_QUERY_PENDING_MEMBER ||
2357 inm->in6m_state == MLD_SG_QUERY_PENDING_MEMBER) {
2362 mld_v1_transmit_report(inm, MLD_LISTENER_DONE);
2364 IN6M_LOCK_ASSERT_HELD(inm);
2367 inm->in6m_state = MLD_NOT_MEMBER;
2375 IF_DRAIN(&inm->in6m_scq);
2376 inm->in6m_timer = 0;
2377 inm->in6m_scrv = mli->mli_rv;
2380 ip6_sprintf(&inm->in6m_addr),
2381 inm->in6m_ifp->if_name, inm->in6m_ifp->if_unit,
2382 inm->in6m_scrv));
2383 if (inm->in6m_scrv == 0) {
2384 inm->in6m_state = MLD_NOT_MEMBER;
2385 inm->in6m_sctimer = 0;
2394 IN6M_ADDREF_LOCKED(inm);
2395 VERIFY(inm->in6m_debug & IFD_ATTACHED);
2396 inm->in6m_reqcnt++;
2397 VERIFY(inm->in6m_reqcnt >= 1);
2398 inm->in6m_nrelecnt++;
2399 VERIFY(inm->in6m_nrelecnt != 0);
2402 &inm->in6m_scq, inm, 1, 0, 0,
2408 inm->in6m_state = MLD_LEAVING_MEMBER;
2409 inm->in6m_sctimer = 1;
2424 in6m_commit(inm);
2426 ip6_sprintf(&inm->in6m_addr),
2427 inm->in6m_ifp->if_name, inm->in6m_ifp->if_unit));
2428 inm->in6m_st[1].iss_fmode = MCAST_UNDEFINED;
2430 __func__, &inm->in6m_addr, inm->in6m_ifp->if_name,
2431 inm->in6m_ifp->if_unit));
2463 mld_v2_enqueue_group_record(struct ifqueue *ifq, struct in6_multi *inm,
2479 IN6M_LOCK_ASSERT_HELD(inm);
2480 MLI_LOCK_ASSERT_HELD(inm->in6m_mli);
2483 ifp = inm->in6m_ifp;
2494 mode = inm->in6m_st[1].iss_fmode;
2501 if (inm->in6m_st[0].iss_asm > 0 && inm->in6m_st[1].iss_asm > 0 &&
2502 inm->in6m_nsrc == 0)
2522 if (mode != inm->in6m_st[0].iss_fmode) {
2566 VERIFY(inm->in6m_st[1].iss_asm == 0);
2574 return (mld_v2_enqueue_filter_change(ifq, inm));
2578 __func__, ip6_sprintf(&inm->in6m_addr),
2579 inm->in6m_ifp->if_name, inm->in6m_ifp->if_unit));
2593 ip6_sprintf(&inm->in6m_addr),
2594 inm->in6m_ifp->if_name, inm->in6m_ifp->if_unit));
2640 mr.mr_addr = inm->in6m_addr;
2677 RB_FOREACH_SAFE(ims, ip6_msource_tree, &inm->in6m_srcs,
2681 now = im6s_get_mode(inm, ims, 1);
2773 now = im6s_get_mode(inm, ims, 1);
2843 mld_v2_enqueue_filter_change(struct ifqueue *ifq, struct in6_multi *inm)
2857 IN6M_LOCK_ASSERT_HELD(inm);
2859 if (inm->in6m_nsrc == 0 ||
2860 (inm->in6m_st[0].iss_asm > 0 && inm->in6m_st[1].iss_asm > 0))
2863 ifp = inm->in6m_ifp; /* interface */
2864 mode = inm->in6m_st[1].iss_fmode; /* filter mode at t1 */
2923 mr.mr_addr = inm->in6m_addr;
2958 &inm->in6m_srcs);
2963 now = im6s_get_mode(inm, ims, 1);
2964 then = im6s_get_mode(inm, ims, 0);
3043 mld_v2_merge_state_changes(struct in6_multi *inm, struct ifqueue *ifscq)
3053 IN6M_LOCK_ASSERT_HELD(inm);
3063 if (inm->in6m_scrv > 0)
3066 gq = &inm->in6m_scq;
3069 MLD_PRINTF(("%s: WARNING: queue for inm %p is empty\n",
3070 __func__, inm));
3097 (inm->in6m_ifp->if_mtu - MLD_MTUSPACE)))
3131 m0->m_pkthdr.rcvif = inm->in6m_ifp;
3159 struct in6_multi *inm;
3171 IN6_FIRST_MULTI(step, inm);
3172 while (inm != NULL) {
3173 IN6M_LOCK(inm);
3174 if (inm->in6m_ifp != ifp)
3177 switch (inm->in6m_state) {
3186 inm->in6m_state = MLD_REPORTING_MEMBER;
3189 inm, 0, 0, 0, 0);
3200 IN6M_UNLOCK(inm);
3201 IN6_NEXT_MULTI(step, inm);