Lines Matching defs:ilm

77 static void	igmp_sendpkt(ilm_t *ilm, uchar_t type, ipaddr_t addr);
78 static void mld_sendpkt(ilm_t *ilm, uchar_t type, const in6_addr_t *v6addr);
85 static mrec_t *mcast_merge_rtx(ilm_t *ilm, mrec_t *rp, slist_t *flist);
316 ilm_t *ilm;
454 for (ilm = ill->ill_ilm; ilm; ilm = ilm->ilm_next) {
455 if (!IN6_ARE_ADDR_EQUAL(&ilm->ilm_v6addr, &v6group))
459 ilm->ilm_timer = INFINITY;
460 ilm->ilm_state = IGMP_OTHERMEMBER;
488 ilm_t *ilm;
501 * In Delaying Member state, our timer is running (ilm->ilm_timer
503 * (ilm->ilm_timer == INFINITY).
505 * The flag is ilm->ilm_state, it is set to IGMP_OTHERMEMBER if
589 for (ilm = ill->ill_ilm; ilm; ilm = ilm->ilm_next) {
597 if (!IN6_IS_ADDR_V4MAPPED(&ilm->ilm_v6addr))
599 if (ilm->ilm_addr == htonl(INADDR_ANY))
601 if (ilm->ilm_addr != htonl(INADDR_ALLHOSTS_GROUP) &&
603 (igmpa->igmpa_group == ilm->ilm_addr)) {
604 if (ilm->ilm_timer > timer) {
605 MCAST_RANDOM_DELAY(ilm->ilm_timer, timer);
606 if (ilm->ilm_timer < next)
607 next = ilm->ilm_timer;
608 ilm->ilm_timer += current;
627 ilm_t *ilm;
699 for (ilm = ill->ill_ilm; ilm; ilm = ilm->ilm_next) {
700 if (!IN6_IS_ADDR_V4MAPPED(&ilm->ilm_v6addr) ||
701 (ilm->ilm_addr == htonl(INADDR_ANY)) ||
702 (ilm->ilm_addr == htonl(INADDR_ALLHOSTS_GROUP)) ||
703 (igmp3qa->igmp3qa_group != ilm->ilm_addr))
713 if (numsrc == 0 || (ilm->ilm_timer < INFINITY &&
714 SLIST_IS_EMPTY(ilm->ilm_pendsrcs))) {
716 FREE_SLIST(ilm->ilm_pendsrcs);
717 ilm->ilm_pendsrcs = NULL;
722 (ilm->ilm_pendsrcs == NULL &&
723 (ilm->ilm_pendsrcs = l_alloc()) == NULL)) {
738 l_union_in_a(ilm->ilm_pendsrcs, pktl,
745 ilm->ilm_timer = (ilm->ilm_timer == INFINITY) ?
746 INFINITY : (ilm->ilm_timer - current);
748 ilm->ilm_timer = MIN(ilm->ilm_timer, delay);
749 if (ilm->ilm_timer < next)
750 next = ilm->ilm_timer;
751 ilm->ilm_timer += current;
769 igmp_joingroup(ilm_t *ilm)
773 ip_stack_t *ipst = ilm->ilm_ipst;
775 ill = ilm->ilm_ill;
780 if (ilm->ilm_addr == htonl(INADDR_ALLHOSTS_GROUP)) {
781 ilm->ilm_rtx.rtx_timer = INFINITY;
782 ilm->ilm_state = IGMP_OTHERMEMBER;
785 ill->ill_mcast_type, htonl(ilm->ilm_addr)));
787 igmp_sendpkt(ilm, IGMP_V1_MEMBERSHIP_REPORT, 0);
789 igmp_sendpkt(ilm, IGMP_V2_MEMBERSHIP_REPORT, 0);
803 rtype = (ilm->ilm_fmode == MODE_IS_INCLUDE) ?
805 rp = mcast_bldmrec(rtype, &ilm->ilm_v6addr,
806 ilm->ilm_filter, NULL);
812 mcast_init_rtx(ill, &ilm->ilm_rtx, rtype,
813 ilm->ilm_filter);
816 /* Set the ilm timer value */
817 ilm->ilm_rtx.rtx_cnt = ill->ill_mcast_rv;
818 MCAST_RANDOM_DELAY(ilm->ilm_rtx.rtx_timer,
820 timer = ilm->ilm_rtx.rtx_timer;
821 ilm->ilm_rtx.rtx_timer += CURRENT_MSTIME;
822 ilm->ilm_state = IGMP_IREPORTEDLAST;
839 (void) mi_strlog(ilm->ilm_ill->ill_rq, 1, SL_TRACE,
841 (ilm->ilm_ill->ill_mcast_type),
851 mld_joingroup(ilm_t *ilm)
855 ip_stack_t *ipst = ilm->ilm_ipst;
857 ill = ilm->ilm_ill;
863 if (IN6_ARE_ADDR_EQUAL(&ipv6_all_hosts_mcast, &ilm->ilm_v6addr)) {
864 ilm->ilm_rtx.rtx_timer = INFINITY;
865 ilm->ilm_state = IGMP_OTHERMEMBER;
868 mld_sendpkt(ilm, MLD_LISTENER_REPORT, NULL);
882 rtype = (ilm->ilm_fmode == MODE_IS_INCLUDE) ?
884 rp = mcast_bldmrec(rtype, &ilm->ilm_v6addr,
885 ilm->ilm_filter, NULL);
891 mcast_init_rtx(ill, &ilm->ilm_rtx, rtype,
892 ilm->ilm_filter);
895 /* Set the ilm timer value */
897 ilm->ilm_rtx.rtx_cnt > 0);
899 ilm->ilm_rtx.rtx_cnt = ill->ill_mcast_rv;
900 MCAST_RANDOM_DELAY(ilm->ilm_rtx.rtx_timer,
902 timer = ilm->ilm_rtx.rtx_timer;
903 ilm->ilm_rtx.rtx_timer += CURRENT_MSTIME;
904 ilm->ilm_state = IGMP_IREPORTEDLAST;
921 (void) mi_strlog(ilm->ilm_ill->ill_rq, 1, SL_TRACE,
923 (ilm->ilm_ill->ill_mcast_type),
933 igmp_leavegroup(ilm_t *ilm)
935 ill_t *ill = ilm->ilm_ill;
940 if (ilm->ilm_state == IGMP_IREPORTEDLAST &&
942 (ilm->ilm_addr != htonl(INADDR_ALLHOSTS_GROUP))) {
943 igmp_sendpkt(ilm, IGMP_V2_LEAVE_GROUP,
948 (ilm->ilm_addr != htonl(INADDR_ALLHOSTS_GROUP))) {
959 if (ilm->ilm_fmode == MODE_IS_INCLUDE) {
960 rp = mcast_bldmrec(BLOCK_OLD_SOURCES, &ilm->ilm_v6addr,
961 ilm->ilm_filter, NULL);
963 rp = mcast_bldmrec(CHANGE_TO_INCLUDE, &ilm->ilm_v6addr,
976 mld_leavegroup(ilm_t *ilm)
978 ill_t *ill = ilm->ilm_ill;
983 if (ilm->ilm_state == IGMP_IREPORTEDLAST &&
985 (!IN6_ARE_ADDR_EQUAL(&ipv6_all_hosts_mcast, &ilm->ilm_v6addr))) {
986 mld_sendpkt(ilm, MLD_LISTENER_REDUCTION, &ipv6_all_rtrs_mcast);
990 (!IN6_ARE_ADDR_EQUAL(&ipv6_all_hosts_mcast, &ilm->ilm_v6addr))) {
1001 if (ilm->ilm_fmode == MODE_IS_INCLUDE) {
1002 rp = mcast_bldmrec(BLOCK_OLD_SOURCES, &ilm->ilm_v6addr,
1003 ilm->ilm_filter, NULL);
1005 rp = mcast_bldmrec(CHANGE_TO_INCLUDE, &ilm->ilm_v6addr,
1018 igmp_statechange(ilm_t *ilm, mcast_record_t fmode, slist_t *flist)
1022 ip_stack_t *ipst = ilm->ilm_ipst;
1024 ASSERT(ilm != NULL);
1027 if (ilm->ilm_ill->ill_mcast_type != IGMP_V3_ROUTER)
1030 ill = ilm->ilm_ill;
1045 if (ilm->ilm_fmode == fmode) {
1051 if (ilm->ilm_fmode == MODE_IS_INCLUDE)
1056 l_difference(ilm->ilm_filter, flist, a_minus_b);
1057 l_difference(flist, ilm->ilm_filter, b_minus_a);
1058 if (ilm->ilm_fmode == MODE_IS_INCLUDE) {
1067 rp = mcast_bldmrec(ALLOW_NEW_SOURCES, &ilm->ilm_v6addr,
1070 rp = mcast_bldmrec(BLOCK_OLD_SOURCES, &ilm->ilm_v6addr,
1074 } else if (ilm->ilm_fmode == MODE_IS_INCLUDE) {
1076 rp = mcast_bldmrec(CHANGE_TO_EXCLUDE, &ilm->ilm_v6addr, flist,
1080 rp = mcast_bldmrec(CHANGE_TO_INCLUDE, &ilm->ilm_v6addr, flist,
1089 rp = mcast_merge_rtx(ilm, rp, flist);
1090 if (ilm->ilm_rtx.rtx_timer == INFINITY) {
1091 ilm->ilm_rtx.rtx_cnt = ill->ill_mcast_rv;
1092 MCAST_RANDOM_DELAY(ilm->ilm_rtx.rtx_timer,
1096 ilm->ilm_rtx.rtx_timer);
1097 ilm->ilm_rtx.rtx_timer += CURRENT_MSTIME;
1109 mld_statechange(ilm_t *ilm, mcast_record_t fmode, slist_t *flist)
1113 ip_stack_t *ipst = ilm->ilm_ipst;
1115 ASSERT(ilm != NULL);
1117 ill = ilm->ilm_ill;
1136 if (ilm->ilm_fmode == fmode) {
1142 if (ilm->ilm_fmode == MODE_IS_INCLUDE)
1147 l_difference(ilm->ilm_filter, flist, a_minus_b);
1148 l_difference(flist, ilm->ilm_filter, b_minus_a);
1149 if (ilm->ilm_fmode == MODE_IS_INCLUDE) {
1157 rp = mcast_bldmrec(ALLOW_NEW_SOURCES, &ilm->ilm_v6addr,
1160 rp = mcast_bldmrec(BLOCK_OLD_SOURCES, &ilm->ilm_v6addr,
1164 } else if (ilm->ilm_fmode == MODE_IS_INCLUDE) {
1166 rp = mcast_bldmrec(CHANGE_TO_EXCLUDE, &ilm->ilm_v6addr, flist,
1170 rp = mcast_bldmrec(CHANGE_TO_INCLUDE, &ilm->ilm_v6addr, flist,
1179 rp = mcast_merge_rtx(ilm, rp, flist);
1180 ASSERT(ilm->ilm_rtx.rtx_cnt > 0);
1181 if (ilm->ilm_rtx.rtx_timer == INFINITY) {
1182 ilm->ilm_rtx.rtx_cnt = ill->ill_mcast_rv;
1183 MCAST_RANDOM_DELAY(ilm->ilm_rtx.rtx_timer,
1187 MIN(ipst->ips_mld_deferred_next, ilm->ilm_rtx.rtx_timer);
1188 ilm->ilm_rtx.rtx_timer += CURRENT_MSTIME;
1199 ilm_t *ilm;
1219 for (ilm = ill->ill_ilm; ilm != NULL; ilm = ilm->ilm_next) {
1220 if (ilm->ilm_addr == htonl(INADDR_ALLHOSTS_GROUP))
1222 rp = mcast_bldmrec(ilm->ilm_fmode, &ilm->ilm_v6addr,
1223 ilm->ilm_filter, rp);
1230 ilm->ilm_timer = INFINITY;
1231 ilm->ilm_state = IGMP_IREPORTEDLAST;
1232 FREE_SLIST(ilm->ilm_pendsrcs);
1233 ilm->ilm_pendsrcs = NULL;
1243 for (ilm = ill->ill_ilm; ilm != NULL; ilm = ilm->ilm_next) {
1244 if (ilm->ilm_timer == INFINITY)
1247 if (ilm->ilm_timer > (current + CURRENT_OFFSET)) {
1248 if ((ilm->ilm_timer - current) < next)
1249 next = ilm->ilm_timer - current;
1255 (int)ntohl(ilm->ilm_timer - current),
1263 ilm->ilm_timer = INFINITY;
1264 ilm->ilm_state = IGMP_IREPORTEDLAST;
1266 igmp_sendpkt(ilm, IGMP_V1_MEMBERSHIP_REPORT, 0);
1268 igmp_sendpkt(ilm, IGMP_V2_MEMBERSHIP_REPORT, 0);
1271 if (!SLIST_IS_EMPTY(ilm->ilm_pendsrcs) &&
1277 if (ilm->ilm_fmode == MODE_IS_INCLUDE) {
1278 l_intersection(ilm->ilm_filter,
1279 ilm->ilm_pendsrcs, rsp);
1281 l_difference(ilm->ilm_pendsrcs,
1282 ilm->ilm_filter, rsp);
1284 FREE_SLIST(ilm->ilm_pendsrcs);
1285 ilm->ilm_pendsrcs = NULL;
1288 &ilm->ilm_v6addr, rsp, rp);
1296 rp = mcast_bldmrec(ilm->ilm_fmode,
1297 &ilm->ilm_v6addr, ilm->ilm_filter, rp);
1304 rtxp = &ilm->ilm_rtx;
1315 ilm->ilm_state = IGMP_IREPORTEDLAST;
1317 igmp_sendpkt(ilm, IGMP_V1_MEMBERSHIP_REPORT, 0);
1321 igmp_sendpkt(ilm, IGMP_V2_MEMBERSHIP_REPORT, 0);
1328 * stored in the ilm.
1332 * mode change report with the ilm's source list.
1341 rtype = (ilm->ilm_fmode == MODE_IS_INCLUDE) ?
1343 rtxrp = mcast_bldmrec(rtype, &ilm->ilm_v6addr,
1344 ilm->ilm_filter, rtxrp);
1347 &ilm->ilm_v6addr, rtxp->rtx_allow, rtxrp);
1349 &ilm->ilm_v6addr, rtxp->rtx_block, rtxrp);
1380 * igmp request. The igmp related state variables in the ilm are protected
1438 ilm_t *ilm;
1462 for (ilm = ill->ill_ilm; ilm != NULL; ilm = ilm->ilm_next) {
1463 if (IN6_ARE_ADDR_EQUAL(&ilm->ilm_v6addr,
1466 rp = mcast_bldmrec(ilm->ilm_fmode, &ilm->ilm_v6addr,
1467 ilm->ilm_filter, rp);
1474 ilm->ilm_timer = INFINITY;
1475 ilm->ilm_state = IGMP_IREPORTEDLAST;
1476 FREE_SLIST(ilm->ilm_pendsrcs);
1477 ilm->ilm_pendsrcs = NULL;
1487 for (ilm = ill->ill_ilm; ilm != NULL; ilm = ilm->ilm_next) {
1488 if (ilm->ilm_timer == INFINITY)
1491 if (ilm->ilm_timer > (current + CURRENT_OFFSET)) {
1492 if ((ilm->ilm_timer - current) < next)
1493 next = ilm->ilm_timer - current;
1499 (int)ntohl(ilm->ilm_timer - current),
1507 ilm->ilm_timer = INFINITY;
1508 ilm->ilm_state = IGMP_IREPORTEDLAST;
1510 mld_sendpkt(ilm, MLD_LISTENER_REPORT, NULL);
1513 if (!SLIST_IS_EMPTY(ilm->ilm_pendsrcs) &&
1519 if (ilm->ilm_fmode == MODE_IS_INCLUDE) {
1520 l_intersection(ilm->ilm_filter,
1521 ilm->ilm_pendsrcs, rsp);
1523 l_difference(ilm->ilm_pendsrcs,
1524 ilm->ilm_filter, rsp);
1526 FREE_SLIST(ilm->ilm_pendsrcs);
1527 ilm->ilm_pendsrcs = NULL;
1530 &ilm->ilm_v6addr, rsp, rp);
1533 rp = mcast_bldmrec(ilm->ilm_fmode,
1534 &ilm->ilm_v6addr, ilm->ilm_filter, rp);
1539 rtxp = &ilm->ilm_rtx;
1550 ilm->ilm_state = IGMP_IREPORTEDLAST;
1552 mld_sendpkt(ilm, MLD_LISTENER_REPORT, NULL);
1559 * stored in the ilm.
1563 * mode change report with the ilm's source list.
1572 rtype = (ilm->ilm_fmode == MODE_IS_INCLUDE) ?
1574 rtxrp = mcast_bldmrec(rtype, &ilm->ilm_v6addr,
1575 ilm->ilm_filter, rtxrp);
1578 &ilm->ilm_v6addr, rtxp->rtx_allow, rtxrp);
1580 &ilm->ilm_v6addr, rtxp->rtx_block, rtxrp);
1827 igmp_sendpkt(ilm_t *ilm, uchar_t type, ipaddr_t addr)
1835 ill_t *ill = ilm->ilm_ill;
1851 igmpa->igmpa_group = ilm->ilm_addr;
2062 ilm_t *ilm;
2173 for (ilm = ill->ill_ilm; ilm != NULL; ilm = ilm->ilm_next) {
2174 if (!IN6_ARE_ADDR_EQUAL(&ilm->ilm_v6addr, v6group_ptr))
2179 ilm->ilm_timer = INFINITY;
2180 ilm->ilm_state = IGMP_OTHERMEMBER;
2204 ilm_t *ilm;
2215 * In Delaying state, our timer is running (ilm->ilm_timer < INFINITY)
2216 * In Idle Member state, our timer is not running (ilm->ilm_timer ==
2219 * The flag is ilm->ilm_state, it is set to IGMP_OTHERMEMBER if
2263 for (ilm = ill->ill_ilm; ilm != NULL; ilm = ilm->ilm_next) {
2264 ASSERT(!IN6_IS_ADDR_V4MAPPED(&ilm->ilm_v6addr));
2266 if (IN6_IS_ADDR_UNSPECIFIED(&ilm->ilm_v6addr) ||
2267 IN6_IS_ADDR_MC_NODELOCAL(&ilm->ilm_v6addr) ||
2268 IN6_IS_ADDR_MC_RESERVED(&ilm->ilm_v6addr))
2270 if ((!IN6_ARE_ADDR_EQUAL(&ilm->ilm_v6addr,
2273 (IN6_ARE_ADDR_EQUAL(v6group, &ilm->ilm_v6addr))) {
2276 ilm->ilm_timer = INFINITY;
2277 ilm->ilm_state = IGMP_IREPORTEDLAST;
2278 mld_sendpkt(ilm, MLD_LISTENER_REPORT, NULL);
2281 if (ilm->ilm_timer > timer) {
2282 MCAST_RANDOM_DELAY(ilm->ilm_timer, timer);
2283 if (ilm->ilm_timer < next)
2284 next = ilm->ilm_timer;
2285 ilm->ilm_timer += current;
2306 ilm_t *ilm;
2378 for (ilm = ill->ill_ilm; ilm != NULL; ilm = ilm->ilm_next) {
2379 if (IN6_IS_ADDR_UNSPECIFIED(&ilm->ilm_v6addr) ||
2380 IN6_IS_ADDR_MC_NODELOCAL(&ilm->ilm_v6addr) ||
2381 IN6_IS_ADDR_MC_RESERVED(&ilm->ilm_v6addr) ||
2382 !IN6_ARE_ADDR_EQUAL(v6group, &ilm->ilm_v6addr))
2393 if (numsrc == 0 || (ilm->ilm_timer < INFINITY &&
2394 SLIST_IS_EMPTY(ilm->ilm_pendsrcs))) {
2396 FREE_SLIST(ilm->ilm_pendsrcs);
2397 ilm->ilm_pendsrcs = NULL;
2402 (ilm->ilm_pendsrcs == NULL &&
2403 (ilm->ilm_pendsrcs = l_alloc()) == NULL)) {
2417 l_union_in_a(ilm->ilm_pendsrcs, pktl,
2423 ilm->ilm_timer = (ilm->ilm_timer == INFINITY) ?
2424 INFINITY : (ilm->ilm_timer - current);
2426 ilm->ilm_timer = MIN(ilm->ilm_timer, delay);
2427 if (ilm->ilm_timer < next)
2428 next = ilm->ilm_timer;
2429 ilm->ilm_timer += current;
2447 mld_sendpkt(ilm_t *ilm, uchar_t type, const in6_addr_t *v6addr)
2455 ill_t *ill = ilm->ilm_ill;
2486 mldh->mld_addr = ilm->ilm_v6addr;
2501 ip6h->ip6_dst = ilm->ilm_v6addr;
2800 mcast_merge_rtx(ilm_t *ilm, mrec_t *mreclist, slist_t *flist)
2803 rtx_state_t *rtxp = &ilm->ilm_rtx;
2808 ill = ilm->ilm_ill;
2833 if (ilm->ilm_fmode == MODE_IS_INCLUDE) {
2899 &ilm->ilm_v6addr, rtxp->rtx_block, allow_mrec);
2905 &ilm->ilm_v6addr, rtxp->rtx_allow, block_mrec);