Lines Matching refs:ilm

65 static void	ilm_gen_filter(ilm_t *ilm, mcast_record_t *fmode,
71 static void ilm_delete(ilm_t *ilm);
274 ilm_t *ilm = fbld->fbld_ilm; in ilm_bld_flists() local
275 in6_addr_t *v6group = &ilm->ilm_v6addr; in ilm_bld_flists()
298 ASSERT(MUTEX_HELD(&ilm->ilm_ill->ill_mcast_serializer)); in ilm_bld_flists()
313 if ((ilg->ilg_ill == ilm->ilm_ill) && in ilm_bld_flists()
352 ilm_gen_filter(ilm_t *ilm, mcast_record_t *fmode, slist_t *flist) in ilm_gen_filter() argument
355 ip_stack_t *ipst = ilm->ilm_ipst; in ilm_gen_filter()
357 fbld.fbld_ilm = ilm; in ilm_gen_filter()
400 ilm_update_add(ilm_t *ilm, ilg_stat_t ilgstat, slist_t *ilg_flist) in ilm_update_add() argument
406 ill_t *ill = ilm->ilm_ill; in ilm_update_add()
415 fdefault = (ilm->ilm_no_ilg_cnt > 0) || in ilm_update_add()
421 if (!fdefault && ilm->ilm_filter == NULL) { in ilm_update_add()
422 ilm->ilm_filter = l_alloc(); in ilm_update_add()
423 if (ilm->ilm_filter == NULL) { in ilm_update_add()
430 ilm->ilm_refcnt++; in ilm_update_add()
433 ilm->ilm_no_ilg_cnt++; in ilm_update_add()
445 ilm_gen_filter(ilm, &fmode, flist); in ilm_update_add()
449 if ((ilm->ilm_fmode == fmode) && in ilm_update_add()
450 !lists_are_different(ilm->ilm_filter, flist)) { in ilm_update_add()
458 mld_statechange(ilm, fmode, flist); in ilm_update_add()
460 igmp_statechange(ilm, fmode, flist); in ilm_update_add()
464 ilm->ilm_fmode = fmode; in ilm_update_add()
466 l_copy(flist, ilm->ilm_filter); in ilm_update_add()
468 CLEAR_SLIST(ilm->ilm_filter); in ilm_update_add()
470 ip1dbg(("ilm_update: new if filter mode %d, group %s\n", ilm->ilm_fmode, in ilm_update_add()
471 inet_ntop(AF_INET6, &ilm->ilm_v6addr, buf, sizeof (buf)))); in ilm_update_add()
481 ilm_update_del(ilm_t *ilm) in ilm_update_del() argument
485 ill_t *ill = ilm->ilm_ill; in ilm_update_del()
488 ilm->ilm_refcnt)); in ilm_update_del()
501 if (ilm->ilm_no_ilg_cnt != 0) { in ilm_update_del()
505 ilm_gen_filter(ilm, &fmode, flist); in ilm_update_del()
509 if ((ilm->ilm_fmode == fmode) && in ilm_update_del()
510 (!lists_are_different(ilm->ilm_filter, flist))) { in ilm_update_del()
517 mld_statechange(ilm, fmode, flist); in ilm_update_del()
519 igmp_statechange(ilm, fmode, flist); in ilm_update_del()
522 ilm->ilm_fmode = fmode; in ilm_update_del()
524 if (ilm->ilm_filter == NULL) { in ilm_update_del()
525 ilm->ilm_filter = l_alloc(); in ilm_update_del()
526 if (ilm->ilm_filter == NULL) { in ilm_update_del()
530 inet_ntop(AF_INET6, &ilm->ilm_v6addr, in ilm_update_del()
532 ilm->ilm_fmode = MODE_IS_EXCLUDE; in ilm_update_del()
537 l_copy(flist, ilm->ilm_filter); in ilm_update_del()
539 CLEAR_SLIST(ilm->ilm_filter); in ilm_update_del()
560 ilm_t *ilm; in ip_addmulti() local
564 ilm = ip_addmulti_serial(v6group, ill, zoneid, ILGSTAT_NONE, in ip_addmulti()
573 return (ilm); in ip_addmulti()
599 ilm_t *ilm; in ip_addmulti_serial() local
642 ilm = ip_addmulti_impl(v6group, ill, zoneid, ilgstat, ilg_fmode, in ip_addmulti_serial()
647 return (ilm); in ip_addmulti_serial()
655 ilm_t *ilm; in ip_addmulti_impl() local
667 ilm = ilm_lookup(ill, v6group, zoneid); in ip_addmulti_impl()
668 if (ilm != NULL) { in ip_addmulti_impl()
670 ret = ilm_update_add(ilm, ilgstat, ilg_flist); in ip_addmulti_impl()
672 return (ilm); in ip_addmulti_impl()
684 ilm = ilm_add(ill, v6group, ilgstat, ilg_fmode, ilg_flist, zoneid); in ip_addmulti_impl()
685 if (ilm == NULL) { in ip_addmulti_impl()
701 mld_joingroup(ilm); in ip_addmulti_impl()
703 igmp_joingroup(ilm); in ip_addmulti_impl()
719 inet_ntop(AF_INET6, &ilm->ilm_v6addr, in ip_addmulti_impl()
722 ilm_delete(ilm); in ip_addmulti_impl()
726 return (ilm); in ip_addmulti_impl()
912 ip_delmulti(ilm_t *ilm) in ip_delmulti() argument
914 ill_t *ill = ilm->ilm_ill; in ip_delmulti()
919 error = ip_delmulti_serial(ilm, B_TRUE, B_TRUE); in ip_delmulti()
938 ip_delmulti_serial(ilm_t *ilm, boolean_t no_ilg, boolean_t leaving) in ip_delmulti_serial() argument
940 ill_t *ill = ilm->ilm_ill; in ip_delmulti_serial()
947 ret = ip_delmulti_impl(ilm, no_ilg, leaving); in ip_delmulti_serial()
954 ip_delmulti_impl(ilm_t *ilm, boolean_t no_ilg, boolean_t leaving) in ip_delmulti_impl() argument
956 ill_t *ill = ilm->ilm_ill; in ip_delmulti_impl()
964 ilm->ilm_no_ilg_cnt--; in ip_delmulti_impl()
967 ilm->ilm_refcnt--; in ip_delmulti_impl()
969 if (ilm->ilm_refcnt > 0) in ip_delmulti_impl()
970 return (ilm_update_del(ilm)); in ip_delmulti_impl()
972 v6group = ilm->ilm_v6addr; in ip_delmulti_impl()
974 if (IN6_IS_ADDR_UNSPECIFIED(&ilm->ilm_v6addr)) { in ip_delmulti_impl()
975 ilm_delete(ilm); in ip_delmulti_impl()
990 mld_leavegroup(ilm); in ip_delmulti_impl()
992 igmp_leavegroup(ilm); in ip_delmulti_impl()
995 ilm_delete(ilm); in ip_delmulti_impl()
1150 ilm_t *ilm; in ip_join_allmulti() local
1177 ilm = ip_addmulti(&ipv6_all_zeros, ill, ill->ill_zoneid, &ret); in ip_join_allmulti()
1178 if (ilm == NULL) { in ip_join_allmulti()
1187 (void) ip_delmulti(ilm); in ip_join_allmulti()
1192 ill->ill_ipallmulti_ilm = ilm; in ip_join_allmulti()
1204 ilm_t *ilm; in ip_leave_allmulti() local
1224 ilm = ill->ill_ipallmulti_ilm; in ip_leave_allmulti()
1227 ilm = NULL; in ip_leave_allmulti()
1230 if (ilm != NULL) in ip_leave_allmulti()
1231 (void) ip_delmulti(ilm); in ip_leave_allmulti()
1245 ilm_t *ilm; in ip_purge_allmulti() local
1250 ilm = ill->ill_ipallmulti_ilm; in ip_purge_allmulti()
1255 if (ilm != NULL) in ip_purge_allmulti()
1256 (void) ip_delmulti(ilm); in ip_purge_allmulti()
1351 ilm_t *ilm; in ill_recover_multicast() local
1357 for (ilm = ill->ill_ilm; ilm; ilm = ilm->ilm_next) { in ill_recover_multicast()
1363 if (ilm_numentries(ill, &ilm->ilm_v6addr) > 1 && in ill_recover_multicast()
1364 ilm_lookup(ill, &ilm->ilm_v6addr, ALL_ZONES) != ilm) { in ill_recover_multicast()
1369 &ilm->ilm_v6addr, addrbuf, sizeof (addrbuf)))); in ill_recover_multicast()
1371 if (IN6_IS_ADDR_UNSPECIFIED(&ilm->ilm_v6addr)) { in ill_recover_multicast()
1375 mld_joingroup(ilm); in ill_recover_multicast()
1377 igmp_joingroup(ilm); in ill_recover_multicast()
1379 (void) ip_ll_multireq(ill, &ilm->ilm_v6addr, in ill_recover_multicast()
1401 ilm_t *ilm; in ill_leave_multicast() local
1407 for (ilm = ill->ill_ilm; ilm; ilm = ilm->ilm_next) { in ill_leave_multicast()
1413 if (ilm_numentries(ill, &ilm->ilm_v6addr) > 1 && in ill_leave_multicast()
1414 ilm_lookup(ill, &ilm->ilm_v6addr, ALL_ZONES) != ilm) { in ill_leave_multicast()
1419 &ilm->ilm_v6addr, addrbuf, sizeof (addrbuf)))); in ill_leave_multicast()
1421 if (IN6_IS_ADDR_UNSPECIFIED(&ilm->ilm_v6addr)) { in ill_leave_multicast()
1425 mld_leavegroup(ilm); in ill_leave_multicast()
1427 igmp_leavegroup(ilm); in ill_leave_multicast()
1429 (void) ip_ll_multireq(ill, &ilm->ilm_v6addr, in ill_leave_multicast()
1447 ilm_t *ilm; in ill_hasmembers_v6() local
1450 ilm = ilm_lookup(ill, v6group, ALL_ZONES); in ill_hasmembers_v6()
1452 return (ilm != NULL); in ill_hasmembers_v6()
1479 ilm_t *ilm; in ill_hasmembers_otherzones_v6() local
1482 for (ilm = ill->ill_ilm; ilm; ilm = ilm->ilm_next) { in ill_hasmembers_otherzones_v6()
1483 if (IN6_ARE_ADDR_EQUAL(&ilm->ilm_v6addr, v6group) && in ill_hasmembers_otherzones_v6()
1484 ilm->ilm_zoneid != skipzone) { in ill_hasmembers_otherzones_v6()
1524 ilm_t *ilm; in ill_hasmembers_nextzone_v6() local
1527 for (ilm = ill->ill_ilm; ilm; ilm = ilm->ilm_next) { in ill_hasmembers_nextzone_v6()
1528 if (IN6_ARE_ADDR_EQUAL(&ilm->ilm_v6addr, v6group) && in ill_hasmembers_nextzone_v6()
1529 ilm->ilm_zoneid > zoneid) { in ill_hasmembers_nextzone_v6()
1530 zoneid = ilm->ilm_zoneid; in ill_hasmembers_nextzone_v6()
1563 ilm_t *ilm; in ilm_lookup() local
1567 for (ilm = ill->ill_ilm; ilm; ilm = ilm->ilm_next) { in ilm_lookup()
1568 if (!IN6_ARE_ADDR_EQUAL(&ilm->ilm_v6addr, v6group)) in ilm_lookup()
1570 if (zoneid != ALL_ZONES && zoneid != ilm->ilm_zoneid) in ilm_lookup()
1573 ASSERT(ilm->ilm_ill == ill); in ilm_lookup()
1574 return (ilm); in ilm_lookup()
1587 ilm_t *ilm; in ilm_numentries() local
1591 for (ilm = ill->ill_ilm; ilm; ilm = ilm->ilm_next) { in ilm_numentries()
1592 if (IN6_ARE_ADDR_EQUAL(&ilm->ilm_v6addr, v6group)) { in ilm_numentries()
1604 ilm_t *ilm; in ilm_add() local
1609 ilm = GETSTRUCT(ilm_t, 1); in ilm_add()
1610 if (ilm == NULL) in ilm_add()
1613 ilm->ilm_filter = l_alloc(); in ilm_add()
1614 if (ilm->ilm_filter == NULL) { in ilm_add()
1615 mi_free(ilm); in ilm_add()
1619 ilm->ilm_v6addr = *v6group; in ilm_add()
1620 ilm->ilm_refcnt = 1; in ilm_add()
1621 ilm->ilm_zoneid = zoneid; in ilm_add()
1622 ilm->ilm_timer = INFINITY; in ilm_add()
1623 ilm->ilm_rtx.rtx_timer = INFINITY; in ilm_add()
1625 ilm->ilm_ill = ill; in ilm_add()
1627 (char *), "ilm", (void *), ilm); in ilm_add()
1631 ilm->ilm_ipst = ill->ill_ipst; /* No netstack_hold */ in ilm_add()
1641 while (ilm_cur != NULL && ilm_cur->ilm_zoneid < ilm->ilm_zoneid) { in ilm_add()
1645 ilm->ilm_next = ilm_cur; in ilm_add()
1646 *ilm_ptpn = ilm; in ilm_add()
1654 l_copy(ilg_flist, ilm->ilm_filter); in ilm_add()
1655 ilm->ilm_fmode = ilg_fmode; in ilm_add()
1657 ilm->ilm_no_ilg_cnt = 1; in ilm_add()
1658 ilm->ilm_fmode = MODE_IS_EXCLUDE; in ilm_add()
1661 return (ilm); in ilm_add()
1665 ilm_inactive(ilm_t *ilm) in ilm_inactive() argument
1667 FREE_SLIST(ilm->ilm_filter); in ilm_inactive()
1668 FREE_SLIST(ilm->ilm_pendsrcs); in ilm_inactive()
1669 FREE_SLIST(ilm->ilm_rtx.rtx_allow); in ilm_inactive()
1670 FREE_SLIST(ilm->ilm_rtx.rtx_block); in ilm_inactive()
1671 ilm->ilm_ipst = NULL; in ilm_inactive()
1672 mi_free((char *)ilm); in ilm_inactive()
1679 ilm_delete(ilm_t *ilm) in ilm_delete() argument
1681 ill_t *ill = ilm->ilm_ill; in ilm_delete()
1691 for (ilmp = &ill->ill_ilm; *ilmp != ilm; ilmp = &(*ilmp)->ilm_next) in ilm_delete()
1694 *ilmp = ilm->ilm_next; in ilm_delete()
1704 (char *), "ilm", (void *), ilm); in ilm_delete()
1710 ilm_inactive(ilm); /* frees this ilm */ in ilm_delete()
1933 ilm_t *ilm; in ip_set_srcfilter() local
2000 ilm = ilg->ilg_ilm; in ip_set_srcfilter()
2005 if (ilm != NULL) in ip_set_srcfilter()
2006 (void) ip_delmulti_serial(ilm, B_FALSE, B_TRUE); in ip_set_srcfilter()
2098 ilm = ip_addmulti_serial(group, ill, connp->conn_zoneid, ilgstat, in ip_set_srcfilter()
2111 if (ilm != NULL) { in ip_set_srcfilter()
2112 (void) ip_delmulti_serial(ilm, B_FALSE, in ip_set_srcfilter()
2119 if (ilm != NULL) { in ip_set_srcfilter()
2123 (void) ip_delmulti_serial(ilm, B_FALSE, in ip_set_srcfilter()
2131 ilg->ilg_ilm = ilm; in ip_set_srcfilter()
2132 ilm->ilm_ifaddr = ifaddr; /* For netstat */ in ip_set_srcfilter()
2136 (void) ip_delmulti_serial(ilm, B_FALSE, B_TRUE); in ip_set_srcfilter()
2145 ASSERT(ilg->ilg_ilm == ilm); in ip_set_srcfilter()
2524 ilm_t *ilm; in ip_opt_delete_group_excl() local
2595 ilm = ilg->ilg_ilm; in ip_opt_delete_group_excl()
2604 if (ilm != NULL) { in ip_opt_delete_group_excl()
2606 (void) ip_delmulti_serial(ilm, B_FALSE, leaving); in ip_opt_delete_group_excl()
2704 ilm_t *ilm; in ilg_add() local
2814 ilm = ip_addmulti_serial(v6group, ill, connp->conn_zoneid, ilgstat, in ilg_add()
2827 if (ilm != NULL) { in ilg_add()
2828 (void) ip_delmulti_serial(ilm, B_FALSE, in ilg_add()
2834 if (ilm != NULL) { in ilg_add()
2838 (void) ip_delmulti_serial(ilm, B_FALSE, in ilg_add()
2846 ilg->ilg_ilm = ilm; in ilg_add()
2847 ilm->ilm_ifaddr = ifaddr; /* For netstat */ in ilg_add()
2851 (void) ip_delmulti_serial(ilm, B_FALSE, B_TRUE); in ilg_add()
2860 ASSERT(ilg->ilg_ilm == ilm); in ilg_add()
3081 ilm_t *ilm; in ilg_delete_all() local
3134 ilm = ilg->ilg_ilm; in ilg_delete_all()
3141 if (ilm != NULL) in ilg_delete_all()
3142 (void) ip_delmulti_serial(ilm, B_FALSE, B_TRUE); in ilg_delete_all()
3176 ilm_t *ilm; in ilg_attach() local
3203 ilm = ip_addmulti_serial(&v6group, ill, connp->conn_zoneid, ilgstat, in ilg_attach()
3217 if (ilm != NULL) { in ilg_attach()
3219 (void) ip_delmulti_serial(ilm, B_FALSE, in ilg_attach()
3225 if (ilm == NULL) { in ilg_attach()
3229 ilg->ilg_ilm = ilm; in ilg_attach()
3230 ilm->ilm_ifaddr = ifaddr; /* For netstat */ in ilg_attach()
3305 ilm_t *ilm; in ilg_check_detach() local
3324 ilm = ilg->ilg_ilm; in ilg_check_detach()
3327 if (ilm == NULL) in ilg_check_detach()
3335 (void) ip_delmulti_serial(ilm, B_FALSE, B_TRUE); in ilg_check_detach()
3362 ilm_t *ilm; in ilg_check_reattach() local
3441 ilm = ilg->ilg_ilm; in ilg_check_reattach()
3445 ilm = NULL; in ilg_check_reattach()
3450 if (ilm != NULL) in ilg_check_reattach()
3451 (void) ip_delmulti_serial(ilm, B_FALSE, B_TRUE); in ilg_check_reattach()