• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-13-stable/sys/netinet6/

Lines Matching refs:inm

147 static int	in6m_get_source(struct in6_multi *inm,
201 in6m_is_ifp_detached(const struct in6_multi *inm)
205 KASSERT(inm->in6m_ifma != NULL, ("%s: no ifma", __func__));
206 ifp = inm->in6m_ifma->ifma_ifp;
212 KASSERT(inm->in6m_ifp == ifp, ("%s: bad ifp", __func__));
264 struct in6_multi *inm;
269 inm = imf->im6f_in6m;
270 if (inm == NULL)
272 if ((ifp == NULL || (inm->in6m_ifp == ifp)) &&
273 IN6_ARE_ADDR_EQUAL(&inm->in6m_addr,
363 struct in6_multi *inm;
377 inm = in6m_lookup_locked(ifp, group);
380 if (inm != NULL) {
385 KASSERT(inm->in6m_refcount >= 1,
386 ("%s: bad refcount %d", __func__, inm->in6m_refcount));
387 in6m_acquire_locked(inm);
388 *pinm = inm;
417 inm = (struct in6_multi *)ifma->ifma_protospec;
423 KASSERT(inm != NULL, ("%s: no ifma_protospec", __func__));
424 if (inm->in6m_ifma != ifma || inm->in6m_ifp != ifp ||
425 !IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, group))
427 __func__, ifma, inm, group);
429 in6m_acquire_locked(inm);
430 *pinm = inm;
444 inm = malloc(sizeof(*inm), M_IP6MADDR, M_NOWAIT | M_ZERO);
445 if (inm == NULL) {
451 inm->in6m_addr = *group;
452 inm->in6m_ifp = ifp;
453 inm->in6m_mli = MLD_IFINFO(ifp);
454 inm->in6m_ifma = ifma;
455 inm->in6m_refcount = 1;
456 inm->in6m_state = MLD_NOT_MEMBER;
457 mbufq_init(&inm->in6m_scq, MLD_MAX_STATE_CHANGES);
459 inm->in6m_st[0].iss_fmode = MCAST_UNDEFINED;
460 inm->in6m_st[1].iss_fmode = MCAST_UNDEFINED;
461 RB_INIT(&inm->in6m_srcs);
463 ifma->ifma_protospec = inm;
464 *pinm = inm;
479 in6m_release(struct in6_multi *inm)
484 CTR2(KTR_MLD, "%s: refcount is %d", __func__, inm->in6m_refcount);
486 MPASS(inm->in6m_refcount == 0);
487 CTR2(KTR_MLD, "%s: freeing inm %p", __func__, inm);
489 ifma = inm->in6m_ifma;
490 ifp = inm->in6m_ifp;
502 in6m_purge(inm);
503 free(inm, M_IP6MADDR);
508 in6m_purge(inm);
509 free(inm, M_IP6MADDR);
550 in6m_disconnect_locked(struct in6_multi_head *inmh, struct in6_multi *inm)
560 ifp = inm->in6m_ifp;
564 inm->in6m_ifp = NULL;
566 ifma = inm->in6m_ifma;
596 if (inm == imm->i6mm_maddr) {
599 in6m_rele_locked(inmh, inm);
609 struct in6_multi *inm, *tinm;
616 SLIST_FOREACH_SAFE(inm, &in6m_free_tmp, in6m_nrele, tinm) {
618 in6m_release(inm);
629 in6m_clear_recorded(struct in6_multi *inm)
635 RB_FOREACH(ims, ip6_msource_tree, &inm->in6m_srcs) {
638 --inm->in6m_st[1].iss_rec;
641 KASSERT(inm->in6m_st[1].iss_rec == 0,
642 ("%s: iss_rec %d not 0", __func__, inm->in6m_st[1].iss_rec));
649 * inm is the group descriptor.
668 in6m_record_source(struct in6_multi *inm, const struct in6_addr *addr)
676 ims = RB_FIND(ip6_msource_tree, &inm->in6m_srcs, &find);
680 if (inm->in6m_nsrc == in6_mcast_maxgrpsrc)
687 RB_INSERT(ip6_msource_tree, &inm->in6m_srcs, nims);
688 ++inm->in6m_nsrc;
697 ++inm->in6m_st[1].iss_rec;
904 * inm is the group descriptor to work with.
913 in6m_get_source(struct in6_multi *inm, const struct in6_addr *addr,
923 ims = RB_FIND(ip6_msource_tree, &inm->in6m_srcs, &find);
925 if (inm->in6m_nsrc == in6_mcast_maxgrpsrc)
932 RB_INSERT(ip6_msource_tree, &inm->in6m_srcs, nims);
933 ++inm->in6m_nsrc;
990 in6m_merge(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf)
1014 error = in6m_get_source(inm, &lims->im6s_addr, 0, &nims);
1027 (void)in6m_get_source(inm, &lims->im6s_addr, 1, &bims);
1042 CTR1(KTR_MLD, "%s: --in on inm at t1", __func__);
1043 --inm->in6m_st[1].iss_in;
1053 CTR1(KTR_MLD, "%s: --ex on inm at t1", __func__);
1054 --inm->in6m_st[1].iss_ex;
1056 CTR1(KTR_MLD, "%s: --in on inm at t1", __func__);
1057 --inm->in6m_st[1].iss_in;
1061 CTR1(KTR_MLD, "%s: ex++ on inm at t1", __func__);
1062 inm->in6m_st[1].iss_ex++;
1064 CTR1(KTR_MLD, "%s: in++ on inm at t1", __func__);
1065 inm->in6m_st[1].iss_in++;
1070 * Track inm filter state in terms of listener counts.
1077 if (inm->in6m_st[1].iss_ex > 0) {
1079 inm->in6m_st[1].iss_fmode = MCAST_EXCLUDE;
1080 } else if (inm->in6m_st[1].iss_in > 0) {
1082 inm->in6m_st[1].iss_fmode = MCAST_INCLUDE;
1085 inm->in6m_st[1].iss_fmode = MCAST_UNDEFINED;
1092 CTR1(KTR_MLD, "%s: --asm on inm at t1", __func__);
1093 --inm->in6m_st[1].iss_asm;
1099 CTR1(KTR_MLD, "%s: asm++ on inm at t1", __func__);
1100 inm->in6m_st[1].iss_asm++;
1103 CTR3(KTR_MLD, "%s: merged imf %p to inm %p", __func__, imf, inm);
1104 in6m_print(inm);
1109 in6m_reap(inm);
1119 in6m_commit(struct in6_multi *inm)
1123 CTR2(KTR_MLD, "%s: commit inm %p", __func__, inm);
1125 in6m_print(inm);
1127 RB_FOREACH(ims, ip6_msource_tree, &inm->in6m_srcs) {
1130 inm->in6m_st[0] = inm->in6m_st[1];
1137 in6m_reap(struct in6_multi *inm)
1141 RB_FOREACH_SAFE(ims, ip6_msource_tree, &inm->in6m_srcs, tims) {
1147 RB_REMOVE(ip6_msource_tree, &inm->in6m_srcs, ims);
1149 inm->in6m_nsrc--;
1157 in6m_purge(struct in6_multi *inm)
1161 RB_FOREACH_SAFE(ims, ip6_msource_tree, &inm->in6m_srcs, tims) {
1163 RB_REMOVE(ip6_msource_tree, &inm->in6m_srcs, ims);
1165 inm->in6m_nsrc--;
1168 mbufq_drain(&inm->in6m_scq);
1193 * Only preserves atomicity at inm level.
1206 struct in6_multi *inm;
1232 inm = NULL;
1242 error = in6_getmulti(ifp, mcaddr, &inm);
1249 CTR1(KTR_MLD, "%s: merge inm state", __func__);
1250 error = in6m_merge(inm, imf);
1252 CTR1(KTR_MLD, "%s: failed to merge inm state", __func__);
1257 error = mld_change_state(inm, delay);
1268 CTR2(KTR_MLD, "%s: dropping ref on %p", __func__, inm);
1272 if (ifma->ifma_protospec == inm) {
1277 in6m_disconnect_locked(&inmh, inm);
1278 in6m_rele_locked(&inmh, inm);
1282 *pinm = inm;
1293 in6_leavegroup(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf)
1298 error = in6_leavegroup_locked(inm, imf);
1307 * Only preserves atomicity at inm level.
1317 in6_leavegroup_locked(struct in6_multi *inm, /*const*/ struct in6_mfilter *imf)
1331 CTR5(KTR_MLD, "%s: leave inm %p, %s/%s, imf %p", __func__,
1332 inm, ip6_sprintf(ip6tbuf, &inm->in6m_addr),
1333 (in6m_is_ifp_detached(inm) ? "null" : if_name(inm->in6m_ifp)),
1353 ifp = inm->in6m_ifp;
1355 CTR1(KTR_MLD, "%s: merge inm state", __func__);
1356 error = in6m_merge(inm, imf);
1357 KASSERT(error == 0, ("%s: failed to merge inm state", __func__));
1362 error = mld_change_state(inm, 0);
1366 CTR2(KTR_MLD, "%s: dropping ref on %p", __func__, inm);
1371 if (inm->in6m_refcount == 1)
1372 in6m_disconnect_locked(&inmh, inm);
1373 in6m_rele_locked(&inmh, inm);
1401 struct in6_multi *inm;
1463 inm = imf->im6f_in6m;
1514 CTR1(KTR_MLD, "%s: merge inm state", __func__);
1515 error = in6m_merge(inm, imf);
1517 CTR1(KTR_MLD, "%s: failed to merge inm state", __func__);
1520 error = mld_change_state(inm, 0);
1587 struct in6_multi *inm;
1594 if ((inm = imf->im6f_in6m) != NULL) {
1595 if ((ifp = inm->in6m_ifp) != NULL) {
1597 (void)in6_leavegroup(inm, imf);
1600 (void)in6_leavegroup(inm, imf);
1862 struct in6_multi *inm;
1979 inm = NULL;
1987 inm = imf->im6f_in6m;
2109 CTR1(KTR_MLD, "%s: merge inm state", __func__);
2111 error = in6m_merge(inm, imf);
2113 CTR1(KTR_MLD, "%s: failed to merge inm state",
2121 error = mld_change_state(inm, 0);
2167 struct in6_multi *inm;
2307 inm = imf->im6f_in6m;
2329 (void)in6_leavegroup_locked(inm, imf);
2356 CTR1(KTR_MLD, "%s: merge inm state", __func__);
2358 error = in6m_merge(inm, imf);
2360 CTR1(KTR_MLD, "%s: failed to merge inm state",
2369 error = mld_change_state(inm, 0);
2446 struct in6_multi *inm;
2488 inm = imf->im6f_in6m;
2580 CTR1(KTR_MLD, "%s: merge inm state", __func__);
2581 error = in6m_merge(inm, imf);
2583 CTR1(KTR_MLD, "%s: failed to merge inm state", __func__);
2586 error = mld_change_state(inm, 0);
2732 struct in6_multi *inm;
2789 inm = in6m_ifmultiaddr_get_inm(ifma);
2790 if (inm == NULL)
2792 if (!IN6_ARE_ADDR_EQUAL(&inm->in6m_addr, &mcaddr))
2794 fmode = inm->in6m_st[1].iss_fmode;
2798 RB_FOREACH(ims, ip6_msource_tree, &inm->in6m_srcs) {
2803 if (fmode != im6s_get_mode(inm, ims, 1)) {
2860 in6m_print(const struct in6_multi *inm)
2868 printf("%s: --- begin in6m %p ---\n", __func__, inm);
2870 ip6_sprintf(ip6tbuf, &inm->in6m_addr),
2871 inm->in6m_ifp,
2872 if_name(inm->in6m_ifp),
2873 inm->in6m_ifma);
2875 inm->in6m_timer,
2876 in6m_state_str(inm->in6m_state),
2877 inm->in6m_refcount,
2878 mbufq_len(&inm->in6m_scq));
2880 inm->in6m_mli,
2881 inm->in6m_nsrc,
2882 inm->in6m_sctimer,
2883 inm->in6m_scrv);
2886 in6m_mode_str(inm->in6m_st[t].iss_fmode),
2887 inm->in6m_st[t].iss_asm,
2888 inm->in6m_st[t].iss_ex,
2889 inm->in6m_st[t].iss_in,
2890 inm->in6m_st[t].iss_rec);
2892 printf("%s: --- end in6m %p ---\n", __func__, inm);
2898 in6m_print(const struct in6_multi *inm)