Lines Matching defs:inm

130 static int	in6m_get_source(struct in6_multi *inm,
268 in6m_is_ifp_detached(const struct in6_multi *inm)
270 VERIFY(inm->in6m_ifma != NULL);
271 VERIFY(inm->in6m_ifp == inm->in6m_ifma->ifma_ifp);
273 return (!ifnet_is_attached(inm->in6m_ifp, 0));
472 struct in6_multi *inm;
478 IN6_LOOKUP_MULTI(group, ifp, inm);
479 if (inm != NULL) {
480 IN6M_LOCK(inm);
481 VERIFY(inm->in6m_reqcnt >= 1);
482 inm->in6m_reqcnt++;
483 VERIFY(inm->in6m_reqcnt != 0);
484 *pinm = inm;
485 IN6M_UNLOCK(inm);
513 if ((inm = ifma->ifma_protospec) != NULL) {
516 IN6M_ADDREF(inm); /* for caller */
518 IN6M_LOCK(inm);
519 VERIFY(inm->in6m_ifma == ifma);
520 VERIFY(inm->in6m_ifp == ifp);
521 VERIFY(IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, group));
522 if (inm->in6m_debug & IFD_ATTACHED) {
523 VERIFY(inm->in6m_reqcnt >= 1);
524 inm->in6m_reqcnt++;
525 VERIFY(inm->in6m_reqcnt != 0);
526 *pinm = inm;
527 IN6M_UNLOCK(inm);
533 * been joined; return the inm with a refcount
540 * the inm referring to the ifma has been detached, thus we
542 * inm with a refcount held for the caller.
544 in6_multi_attach(inm);
545 VERIFY((inm->in6m_debug &
547 *pinm = inm;
548 IN6M_UNLOCK(inm);
563 inm = in6_multi_alloc(M_WAITOK);
564 if (inm == NULL) {
569 IN6M_LOCK(inm);
570 inm->in6m_addr = *group;
571 inm->in6m_ifp = ifp;
572 inm->in6m_mli = MLD_IFINFO(ifp);
573 VERIFY(inm->in6m_mli != NULL);
574 MLI_ADDREF(inm->in6m_mli);
575 inm->in6m_ifma = ifma; /* keep refcount from if_addmulti() */
576 inm->in6m_state = MLD_NOT_MEMBER;
580 inm->in6m_scq.ifq_maxlen = MLD_MAX_STATE_CHANGES;
581 inm->in6m_st[0].iss_fmode = MCAST_UNDEFINED;
582 inm->in6m_st[1].iss_fmode = MCAST_UNDEFINED;
583 RB_INIT(&inm->in6m_srcs);
584 *pinm = inm;
585 in6_multi_attach(inm);
586 VERIFY((inm->in6m_debug &
588 IN6M_ADDREF_LOCKED(inm); /* for caller */
589 IN6M_UNLOCK(inm);
593 ifma->ifma_protospec = inm;
606 in6m_clear_recorded(struct in6_multi *inm)
610 IN6M_LOCK_ASSERT_HELD(inm);
612 RB_FOREACH(ims, ip6_msource_tree, &inm->in6m_srcs) {
615 --inm->in6m_st[1].iss_rec;
618 VERIFY(inm->in6m_st[1].iss_rec == 0);
625 * inm is the group descriptor.
644 in6m_record_source(struct in6_multi *inm, const struct in6_addr *addr)
649 IN6M_LOCK_ASSERT_HELD(inm);
652 ims = RB_FIND(ip6_msource_tree, &inm->in6m_srcs, &find);
656 if (inm->in6m_nsrc == in6_mcast_maxgrpsrc)
662 RB_INSERT(ip6_msource_tree, &inm->in6m_srcs, nims);
663 ++inm->in6m_nsrc;
672 ++inm->in6m_st[1].iss_rec;
891 * inm is the group descriptor to work with.
899 in6m_get_source(struct in6_multi *inm, const struct in6_addr *addr,
905 IN6M_LOCK_ASSERT_HELD(inm);
908 ims = RB_FIND(ip6_msource_tree, &inm->in6m_srcs, &find);
910 if (inm->in6m_nsrc == in6_mcast_maxgrpsrc)
916 RB_INSERT(ip6_msource_tree, &inm->in6m_srcs, nims);
917 ++inm->in6m_nsrc;
936 im6s_get_mode(const struct in6_multi *inm, const struct ip6_msource *ims,
939 IN6M_LOCK_ASSERT_HELD(IN6M_CAST_TO_NONCONST(inm));
942 if (inm->in6m_st[t].iss_ex > 0 &&
943 inm->in6m_st[t].iss_ex == ims->im6s_st[t].ex)
996 in6m_merge(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf)
1003 IN6M_LOCK_ASSERT_HELD(inm);
1021 error = in6m_get_source(inm, &lims->im6s_addr, 0, &nims);
1034 (void) in6m_get_source(inm, &lims->im6s_addr, 1, &bims);
1049 MLD_PRINTF(("%s: --in on inm at t1\n", __func__));
1050 --inm->in6m_st[1].iss_in;
1060 MLD_PRINTF(("%s: --ex on inm at t1\n", __func__));
1061 --inm->in6m_st[1].iss_ex;
1063 MLD_PRINTF(("%s: --in on inm at t1\n", __func__));
1064 --inm->in6m_st[1].iss_in;
1068 MLD_PRINTF(("%s: ex++ on inm at t1\n", __func__));
1069 inm->in6m_st[1].iss_ex++;
1071 MLD_PRINTF(("%s: in++ on inm at t1\n", __func__));
1072 inm->in6m_st[1].iss_in++;
1077 * Track inm filter state in terms of listener counts.
1084 if (inm->in6m_st[1].iss_ex > 0) {
1086 inm->in6m_st[1].iss_fmode = MCAST_EXCLUDE;
1087 } else if (inm->in6m_st[1].iss_in > 0) {
1089 inm->in6m_st[1].iss_fmode = MCAST_INCLUDE;
1092 inm->in6m_st[1].iss_fmode = MCAST_UNDEFINED;
1099 MLD_PRINTF(("%s: --asm on inm at t1\n", __func__));
1100 --inm->in6m_st[1].iss_asm;
1106 MLD_PRINTF(("%s: asm++ on inm at t1\n", __func__));
1107 inm->in6m_st[1].iss_asm++;
1110 MLD_PRINTF(("%s: merged imf %p to inm %p\n", __func__, imf, inm));
1111 in6m_print(inm);
1116 in6m_reap(inm);
1126 in6m_commit(struct in6_multi *inm)
1130 IN6M_LOCK_ASSERT_HELD(inm);
1132 MLD_PRINTF(("%s: commit inm %p\n", __func__, inm));
1134 in6m_print(inm);
1136 RB_FOREACH(ims, ip6_msource_tree, &inm->in6m_srcs) {
1139 inm->in6m_st[0] = inm->in6m_st[1];
1146 in6m_reap(struct in6_multi *inm)
1150 IN6M_LOCK_ASSERT_HELD(inm);
1152 RB_FOREACH_SAFE(ims, ip6_msource_tree, &inm->in6m_srcs, tims) {
1158 RB_REMOVE(ip6_msource_tree, &inm->in6m_srcs, ims);
1160 inm->in6m_nsrc--;
1168 in6m_purge(struct in6_multi *inm)
1172 IN6M_LOCK_ASSERT_HELD(inm);
1174 RB_FOREACH_SAFE(ims, ip6_msource_tree, &inm->in6m_srcs, tims) {
1176 RB_REMOVE(ip6_msource_tree, &inm->in6m_srcs, ims);
1178 inm->in6m_nsrc--;
1233 * Only preserves atomicity at inm level.
1245 struct in6_multi *inm = NULL;
1272 error = in6_mc_get(ifp, mcaddr, &inm);
1278 MLD_PRINTF(("%s: merge inm state\n", __func__));
1280 IN6M_LOCK(inm);
1281 error = in6m_merge(inm, imf);
1283 MLD_PRINTF(("%s: failed to merge inm state\n", __func__));
1288 error = mld_change_state(inm, delay);
1296 MLD_PRINTF(("%s: dropping ref on %p\n", __func__, inm));
1297 IN6M_UNLOCK(inm);
1298 IN6M_REMREF(inm);
1300 IN6M_UNLOCK(inm);
1301 *pinm = inm; /* keep refcount from in6_mc_get() */
1311 * Only preserves atomicity at inm level.
1321 in6_mc_leave(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf)
1328 IN6M_LOCK_ASSERT_NOTHELD(inm);
1331 IN6M_LOCK(inm);
1333 MLD_PRINTF(("%s: leave inm %p, %s/%s%d, imf %p\n", __func__,
1334 inm, ip6_sprintf(&inm->in6m_addr),
1335 (in6m_is_ifp_detached(inm) ? "null" : inm->in6m_ifp->if_name),
1336 inm->in6m_ifp->if_unit, imf));
1354 MLD_PRINTF(("%s: merge inm state\n", __func__));
1356 error = in6m_merge(inm, imf);
1357 KASSERT(error == 0, ("%s: failed to merge inm state\n", __func__));
1360 error = mld_change_state(inm, 0);
1365 lastref = in6_multi_detach(inm);
1366 VERIFY(!lastref || (!(inm->in6m_debug & IFD_ATTACHED) &&
1367 inm->in6m_reqcnt == 0));
1368 IN6M_UNLOCK(inm);
1372 IN6M_REMREF(inm); /* for in6_multihead list */
1395 struct in6_multi *inm;
1470 inm = imo->im6o_membership[idx];
1518 IN6M_LOCK(inm);
1519 MLD_PRINTF(("%s: merge inm state\n", __func__));
1520 error = in6m_merge(inm, imf);
1522 MLD_PRINTF(("%s: failed to merge inm state\n", __func__));
1523 IN6M_UNLOCK(inm);
1528 error = mld_change_state(inm, 0);
1529 IN6M_UNLOCK(inm);
1939 struct in6_multi *inm = NULL;
2103 inm = imo->im6o_membership[idx];
2222 VERIFY(inm == NULL);
2223 error = in6_mc_join(ifp, &gsa->sin6.sin6_addr, imf, &inm, 0);
2224 VERIFY(inm != NULL || error != 0);
2227 imo->im6o_membership[idx] = inm; /* from in6_mc_join() */
2229 MLD_PRINTF(("%s: merge inm state\n", __func__));
2230 IN6M_LOCK(inm);
2231 error = in6m_merge(inm, imf);
2233 MLD_PRINTF(("%s: failed to merge inm state\n",
2235 IN6M_UNLOCK(inm);
2239 error = mld_change_state(inm, 0);
2240 IN6M_UNLOCK(inm);
2261 VERIFY(inm == NULL);
2285 struct in6_multi *inm = NULL;
2458 inm = imo->im6o_membership[idx];
2506 (void) in6_mc_leave(inm, imf);
2508 MLD_PRINTF(("%s: merge inm state\n", __func__));
2509 IN6M_LOCK(inm);
2510 error = in6m_merge(inm, imf);
2512 MLD_PRINTF(("%s: failed to merge inm state\n",
2514 IN6M_UNLOCK(inm);
2519 error = mld_change_state(inm, 0);
2523 IN6M_UNLOCK(inm);
2536 VERIFY(inm == imo->im6o_membership[idx]);
2538 IN6M_REMREF(inm);
2611 struct in6_multi *inm;
2681 inm = imo->im6o_membership[idx];
2776 IN6M_LOCK(inm);
2777 MLD_PRINTF(("%s: merge inm state\n", __func__));
2778 error = in6m_merge(inm, imf);
2780 MLD_PRINTF(("%s: failed to merge inm state\n", __func__));
2781 IN6M_UNLOCK(inm);
2786 error = mld_change_state(inm, 0);
2787 IN6M_UNLOCK(inm);
2941 struct in6_multi *inm;
2988 IN6_FIRST_MULTI(step, inm);
2989 while (inm != NULL) {
2990 IN6M_LOCK(inm);
2991 if (inm->in6m_ifp != ifp)
2994 if (!IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, &mcaddr))
2997 fmode = inm->in6m_st[1].iss_fmode;
3000 IN6M_UNLOCK(inm);
3003 RB_FOREACH(ims, ip6_msource_tree, &inm->in6m_srcs) {
3008 if (fmode != im6s_get_mode(inm, ims, 1)) {
3016 break; /* process next inm */
3019 IN6M_UNLOCK(inm);
3020 IN6_NEXT_MULTI(step, inm);
3454 in6m_print(const struct in6_multi *inm)
3458 IN6M_LOCK_ASSERT_HELD(IN6M_CAST_TO_NONCONST(inm));
3463 printf("%s: --- begin in6m %p ---\n", __func__, inm);
3465 ip6_sprintf(&inm->in6m_addr),
3466 inm->in6m_ifp,
3467 inm->in6m_ifp->if_name,
3468 inm->in6m_ifp->if_unit,
3469 inm->in6m_ifma);
3471 inm->in6m_timer,
3472 in6m_state_str(inm->in6m_state),
3473 inm->in6m_refcount,
3474 inm->in6m_scq.ifq_len);
3476 inm->in6m_mli,
3477 inm->in6m_nsrc,
3478 inm->in6m_sctimer,
3479 inm->in6m_scrv);
3482 in6m_mode_str(inm->in6m_st[t].iss_fmode),
3483 inm->in6m_st[t].iss_asm,
3484 inm->in6m_st[t].iss_ex,
3485 inm->in6m_st[t].iss_in,
3486 inm->in6m_st[t].iss_rec);
3488 printf("%s: --- end in6m %p ---\n", __func__, inm);
3494 in6m_print(__unused const struct in6_multi *inm)