Lines Matching refs:inm

678 	struct in_multi		*inm;
694 inm = (struct in_multi *)ifma->ifma_protospec;
695 if (inm->inm_state == IGMP_LEAVING_MEMBER)
696 inm_rele_locked(&inm_free_tmp, inm);
697 inm_clear_recorded(inm);
761 struct in_multi *inm;
806 inm = (struct in_multi *)ifma->ifma_protospec;
807 if (inm->inm_timer != 0)
809 switch (inm->inm_state) {
820 inm->inm_state = IGMP_REPORTING_MEMBER;
821 inm->inm_timer = IGMP_RANDOM_DELAY(
846 struct in_multi *inm;
907 inm = (struct in_multi *)ifma->ifma_protospec;
908 igmp_v2_update_group(inm, timer);
915 inm = inm_lookup(ifp, igmp->igmp_group);
916 if (inm != NULL) {
920 igmp_v2_update_group(inm, timer);
947 igmp_v2_update_group(struct in_multi *inm, const int timer)
951 ntohl(inm->inm_addr.s_addr), inm->inm_ifp->if_xname, timer);
955 switch (inm->inm_state) {
960 if (inm->inm_timer != 0 &&
961 inm->inm_timer <= timer) {
973 inm->inm_state = IGMP_REPORTING_MEMBER;
974 inm->inm_timer = IGMP_RANDOM_DELAY(timer);
979 inm->inm_state = IGMP_AWAKENING_MEMBER;
997 struct in_multi *inm;
1119 inm = inm_lookup(ifp, igmpv3->igmp_group);
1120 if (inm == NULL)
1123 if (!ratecheck(&inm->inm_lastgsrtv,
1141 igmp_input_v3_group_query(inm, igi, timer, igmpv3);
1157 igmp_input_v3_group_query(struct in_multi *inm, struct igmp_ifsoftc *igi,
1168 switch (inm->inm_state) {
1193 if (inm->inm_state == IGMP_G_QUERY_PENDING_MEMBER ||
1194 inm->inm_state == IGMP_SG_QUERY_PENDING_MEMBER) {
1195 inm_clear_recorded(inm);
1196 timer = min(inm->inm_timer, timer);
1198 inm->inm_state = IGMP_G_QUERY_PENDING_MEMBER;
1199 inm->inm_timer = IGMP_RANDOM_DELAY(timer);
1208 if (inm->inm_state == IGMP_G_QUERY_PENDING_MEMBER) {
1209 timer = min(inm->inm_timer, timer);
1210 inm->inm_timer = IGMP_RANDOM_DELAY(timer);
1229 if (inm->inm_nsrc > 0) {
1236 retval = inm_record_source(inm, ap->s_addr);
1244 inm->inm_state = IGMP_SG_QUERY_PENDING_MEMBER;
1245 inm->inm_timer = IGMP_RANDOM_DELAY(timer);
1264 struct in_multi *inm;
1299 inm = inm_lookup(ifp, igmp->igmp_group);
1300 if (inm != NULL) {
1303 igi = inm->inm_igi;
1319 igmp_v3_suppress_group_record(inm);
1323 inm->inm_timer = 0;
1325 switch (inm->inm_state) {
1337 inm->inm_state = IGMP_SLEEPING_MEMBER;
1345 inm->inm_state = IGMP_LAZY_MEMBER;
1347 inm->inm_state = IGMP_SLEEPING_MEMBER;
1373 struct in_multi *inm;
1419 inm = inm_lookup(ifp, igmp->igmp_group);
1420 if (inm != NULL) {
1423 igi = inm->inm_igi;
1435 igmp_v3_suppress_group_record(inm);
1439 inm->inm_timer = 0;
1441 switch (inm->inm_state) {
1453 inm->inm_state = IGMP_LAZY_MEMBER;
1691 struct in_multi *inm;
1760 inm = (struct in_multi *)ifma->ifma_protospec;
1764 igmp_v1v2_process_group_timer(inm,
1769 &scq, inm, uri_fasthz);
1801 igmp_v1v2_process_group_timer(struct in_multi *inm, const int version)
1808 if (inm->inm_timer == 0) {
1810 } else if (--inm->inm_timer == 0) {
1817 switch (inm->inm_state) {
1827 inm->inm_state = IGMP_IDLE_MEMBER;
1828 (void)igmp_v1v2_queue_report(inm,
1849 struct in_multi *inm, const int uri_fasthz)
1866 if (inm->inm_timer == 0) {
1868 } else if (--inm->inm_timer == 0) {
1874 if (inm->inm_sctimer == 0) {
1876 } else if (--inm->inm_sctimer == 0) {
1887 switch (inm->inm_state) {
1906 retval = igmp_v3_enqueue_group_record(qrq, inm, 0, 1,
1907 (inm->inm_state == IGMP_SG_QUERY_PENDING_MEMBER));
1910 inm->inm_state = IGMP_REPORTING_MEMBER;
1912 inm_clear_recorded(inm);
1924 if (--inm->inm_scrv > 0) {
1925 inm->inm_sctimer = uri_fasthz;
1935 (void)igmp_v3_merge_state_changes(inm, scq);
1937 inm_commit(inm);
1939 ntohl(inm->inm_addr.s_addr),
1940 inm->inm_ifp->if_xname);
1949 if (inm->inm_state == IGMP_LEAVING_MEMBER &&
1950 inm->inm_scrv == 0) {
1951 inm->inm_state = IGMP_NOT_MEMBER;
1952 inm_rele_locked(inmh, inm);
1969 igmp_v3_suppress_group_record(struct in_multi *inm)
1974 KASSERT(inm->inm_igi->igi_version == IGMP_VERSION_3,
1977 if (inm->inm_state != IGMP_G_QUERY_PENDING_MEMBER ||
1978 inm->inm_state != IGMP_SG_QUERY_PENDING_MEMBER)
1981 if (inm->inm_state == IGMP_SG_QUERY_PENDING_MEMBER)
1982 inm_clear_recorded(inm);
1984 inm->inm_timer = 0;
1985 inm->inm_state = IGMP_REPORTING_MEMBER;
2046 struct in_multi *inm;
2075 inm = (struct in_multi *)ifma->ifma_protospec;
2076 switch (inm->inm_state) {
2097 inm_rele_locked(&inm_free_tmp, inm);
2101 inm_clear_recorded(inm);
2104 inm->inm_state = IGMP_REPORTING_MEMBER;
2111 inm->inm_sctimer = 0;
2112 inm->inm_timer = 0;
2113 mbufq_drain(&inm->inm_scq);
2237 igmp_v1v2_queue_report(struct in_multi *inm, const int type)
2248 ifp = inm->inm_ifp;
2263 igmp->igmp_group = inm->inm_addr;
2280 ip->ip_dst = inm->inm_addr;
2285 if (inm->inm_igi->igi_flags & IGIF_LOOPBACK)
2318 igmp_change_state(struct in_multi *inm)
2330 KASSERT(inm->inm_ifma != NULL, ("%s: no ifma", __func__));
2331 ifp = inm->inm_ifma->ifma_ifp;
2336 KASSERT(inm->inm_ifp == ifp, ("%s: bad ifp", __func__));
2348 if (inm->inm_st[1].iss_fmode != inm->inm_st[0].iss_fmode) {
2349 CTR3(KTR_IGMPV3, "%s: inm transition %d -> %d", __func__,
2350 inm->inm_st[0].iss_fmode, inm->inm_st[1].iss_fmode);
2351 if (inm->inm_st[0].iss_fmode == MCAST_UNDEFINED) {
2353 error = igmp_initial_join(inm, igi);
2355 } else if (inm->inm_st[1].iss_fmode == MCAST_UNDEFINED) {
2357 igmp_final_leave(inm, igi);
2364 error = igmp_handle_state_change(inm, igi);
2382 igmp_initial_join(struct in_multi *inm, struct igmp_ifsoftc *igi)
2389 ntohl(inm->inm_addr.s_addr), inm->inm_ifp, inm->inm_ifp->if_xname);
2394 ifp = inm->inm_ifp;
2412 !igmp_isgroupreported(inm->inm_addr)) {
2415 inm->inm_state = IGMP_SILENT_MEMBER;
2416 inm->inm_timer = 0;
2425 inm->inm_state == IGMP_LEAVING_MEMBER) {
2426 MPASS(inm->inm_refcount > 1);
2427 inm_rele_locked(NULL, inm);
2429 inm->inm_state = IGMP_REPORTING_MEMBER;
2434 inm->inm_state = IGMP_IDLE_MEMBER;
2435 error = igmp_v1v2_queue_report(inm,
2440 inm->inm_timer = IGMP_RANDOM_DELAY(
2459 mq = &inm->inm_scq;
2461 retval = igmp_v3_enqueue_group_record(mq, inm, 1,
2477 inm->inm_scrv = 1;
2482 inm->inm_scrv = igi->igi_rv;
2484 inm->inm_sctimer = 1;
2498 inm_commit(inm);
2500 ntohl(inm->inm_addr.s_addr), inm->inm_ifp->if_xname);
2510 igmp_handle_state_change(struct in_multi *inm, struct igmp_ifsoftc *igi)
2516 ntohl(inm->inm_addr.s_addr), inm->inm_ifp, inm->inm_ifp->if_xname);
2518 ifp = inm->inm_ifp;
2527 !igmp_isgroupreported(inm->inm_addr) ||
2529 if (!igmp_isgroupreported(inm->inm_addr)) {
2534 inm_commit(inm);
2536 ntohl(inm->inm_addr.s_addr), inm->inm_ifp->if_xname);
2540 mbufq_drain(&inm->inm_scq);
2542 retval = igmp_v3_enqueue_group_record(&inm->inm_scq, inm, 1, 0, 0);
2551 inm->inm_scrv = ((igi->igi_flags & IGIF_LOOPBACK) ? 1 : igi->igi_rv);
2552 inm->inm_sctimer = 1;
2568 igmp_final_leave(struct in_multi *inm, struct igmp_ifsoftc *igi)
2575 __func__, ntohl(inm->inm_addr.s_addr), inm->inm_ifp,
2576 inm->inm_ifp->if_xname);
2581 switch (inm->inm_state) {
2595 if (inm->inm_state == IGMP_G_QUERY_PENDING_MEMBER ||
2596 inm->inm_state == IGMP_SG_QUERY_PENDING_MEMBER)
2600 igmp_v1v2_queue_report(inm, IGMP_HOST_LEAVE_MESSAGE);
2601 inm->inm_state = IGMP_NOT_MEMBER;
2609 mbufq_drain(&inm->inm_scq);
2610 inm->inm_timer = 0;
2612 inm->inm_scrv = 1;
2614 inm->inm_scrv = igi->igi_rv;
2618 ntohl(inm->inm_addr.s_addr),
2619 inm->inm_ifp->if_xname, inm->inm_scrv);
2620 if (inm->inm_scrv == 0) {
2621 inm->inm_state = IGMP_NOT_MEMBER;
2622 inm->inm_sctimer = 0;
2626 inm_acquire_locked(inm);
2629 &inm->inm_scq, inm, 1, 0, 0);
2634 inm->inm_state = IGMP_LEAVING_MEMBER;
2635 inm->inm_sctimer = 1;
2650 inm_commit(inm);
2652 ntohl(inm->inm_addr.s_addr), inm->inm_ifp->if_xname);
2653 inm->inm_st[1].iss_fmode = MCAST_UNDEFINED;
2655 __func__, ntohl(inm->inm_addr.s_addr),
2656 inm->inm_ifp->if_xname);
2688 igmp_v3_enqueue_group_record(struct mbufq *mq, struct in_multi *inm,
2707 ifp = inm->inm_ifp;
2718 mode = inm->inm_st[1].iss_fmode;
2725 if (inm->inm_st[0].iss_asm > 0 && inm->inm_st[1].iss_asm > 0 &&
2726 inm->inm_nsrc == 0)
2740 if (mode != inm->inm_st[0].iss_fmode) {
2767 KASSERT(inm->inm_st[1].iss_asm == 0,
2768 ("%s: inm %p is INCLUDE but ASM count is %d",
2769 __func__, inm, inm->inm_st[1].iss_asm));
2777 return (igmp_v3_enqueue_filter_change(mq, inm));
2781 ntohl(inm->inm_addr.s_addr), inm->inm_ifp->if_xname);
2795 igmp_rec_type_to_str(type), ntohl(inm->inm_addr.s_addr),
2796 inm->inm_ifp->if_xname);
2849 ig.ig_group = inm->inm_addr;
2882 RB_FOREACH_SAFE(ims, ip_msource_tree, &inm->inm_srcs, nims) {
2885 now = ims_get_mode(inm, ims, 1);
2981 now = ims_get_mode(inm, ims, 1);
3049 igmp_v3_enqueue_filter_change(struct mbufq *mq, struct in_multi *inm)
3066 if (inm->inm_nsrc == 0 ||
3067 (inm->inm_st[0].iss_asm > 0 && inm->inm_st[1].iss_asm > 0))
3070 ifp = inm->inm_ifp; /* interface */
3071 mode = inm->inm_st[1].iss_fmode; /* filter mode at t1 */
3136 ig.ig_group = inm->inm_addr;
3169 nims = RB_MIN(ip_msource_tree, &inm->inm_srcs);
3173 now = ims_get_mode(inm, ims, 1);
3174 then = ims_get_mode(inm, ims, 0);
3254 igmp_v3_merge_state_changes(struct in_multi *inm, struct mbufq *scq)
3274 if (inm->inm_scrv > 0)
3277 gq = &inm->inm_scq;
3280 CTR2(KTR_IGMPV3, "%s: WARNING: queue for inm %p is empty",
3281 __func__, inm);
3304 (inm->inm_ifp->if_mtu - IGMP_LEADINGSPACE)))
3363 struct in_multi *inm;
3389 inm = (struct in_multi *)ifma->ifma_protospec;
3390 KASSERT(ifp == inm->inm_ifp,
3393 switch (inm->inm_state) {
3402 inm->inm_state = IGMP_REPORTING_MEMBER;
3404 inm, 0, 0, 0);