Lines Matching defs:ipnetif
85 * avoid holding the lock protecting the avl tree of ipnetif's over the
392 ipnetif_t *ipnetif;
422 if ((ipnetif = ipnetif_getby_index(phyif, ips)) == NULL) {
423 ipnetif = ipnetif_create(name, phyif, ips, ifflags);
424 if (ipnetif == NULL) {
430 ipnetif->if_flags |=
443 if (ipnet_match_lif(ipnetif, lif, isv6) != NULL)
445 ipnet_add_ifaddr(lif, ipnetif, nd);
448 ipnetif_refrele(ipnetif);
914 ipnet_join_allmulti(ipnetif_t *ipnetif, ipnet_stack_t *ips)
918 uint64_t index = ipnetif->if_index;
921 if (ipnetif->if_multicnt == 0) {
922 ASSERT((ipnetif->if_flags &
924 if (ipnetif->if_flags & IPNETIF_IPV4PLUMBED) {
928 ipnetif->if_flags |= IPNETIF_IPV4ALLMULTI;
930 if (ipnetif->if_flags & IPNETIF_IPV6PLUMBED) {
933 (ipnetif->if_flags & IPNETIF_IPV4ALLMULTI)) {
935 ipnetif->if_flags &= ~IPNETIF_IPV4ALLMULTI;
938 ipnetif->if_flags |= IPNETIF_IPV6ALLMULTI;
941 ipnetif->if_multicnt++;
949 ipnet_leave_allmulti(ipnetif_t *ipnetif, ipnet_stack_t *ips)
953 uint64_t index = ipnetif->if_index;
956 ASSERT(ipnetif->if_multicnt != 0);
957 if (--ipnetif->if_multicnt == 0) {
958 if (ipnetif->if_flags & IPNETIF_IPV4ALLMULTI) {
961 ipnetif->if_flags &= ~IPNETIF_IPV4ALLMULTI;
963 if (ipnetif->if_flags & IPNETIF_IPV6ALLMULTI) {
966 ipnetif->if_flags &= ~IPNETIF_IPV6ALLMULTI;
1007 ipnetif_t *ipnetif = ipnet->ipnet_if;
1028 mutex_enter(&ipnetif->if_addr_lock);
1030 &ipnetif->if_ip4addr_list : &ipnetif->if_ip6addr_list;
1057 mutex_exit(&ipnetif->if_addr_lock);
1260 ipnetif_t *ipnetif;
1262 if ((ipnetif = kmem_zalloc(sizeof (*ipnetif), KM_NOSLEEP)) == NULL)
1265 mutex_init(&ipnetif->if_addr_lock, NULL, MUTEX_DEFAULT, 0);
1266 list_create(&ipnetif->if_ip4addr_list, sizeof (ipnetif_addr_t),
1268 list_create(&ipnetif->if_ip6addr_list, sizeof (ipnetif_addr_t),
1270 mutex_init(&ipnetif->if_reflock, NULL, MUTEX_DEFAULT, 0);
1272 ipnetif->if_stackp = ips;
1274 return (ipnetif);
1280 * containing ipnetif's for this stack instance.
1286 ipnetif_t *ipnetif;
1297 if ((ipnetif = ipnet_alloc_if(ips)) == NULL) {
1302 (void) strlcpy(ipnetif->if_name, name, LIFNAMSIZ);
1303 ipnetif->if_index = (uint_t)index;
1304 ipnetif->if_zoneid = netstack_get_zoneid(ips->ips_netstack);
1305 ipnetif->if_dev = makedevice(ipnet_major, ifminor);
1307 ipnetif->if_refcnt = 1;
1309 ipnetif->if_flags = IPNETIF_LOOPBACK;
1313 avl_insert(&ips->ips_avl_by_index, ipnetif, where);
1315 avl_insert(&ips->ips_avl_by_name, ipnetif, where);
1318 return (ipnetif);
1322 ipnetif_remove(ipnetif_t *ipnetif, ipnet_stack_t *ips)
1327 /* Send a SIGHUP to all open streams associated with this ipnetif. */
1330 if (ipnet->ipnet_if == ipnetif)
1335 avl_remove(&ips->ips_avl_by_index, ipnetif);
1336 avl_remove(&ips->ips_avl_by_name, ipnetif);
1341 ipnetif_refrele(ipnetif);
1358 ipnetif_free(ipnetif_t *ipnetif)
1360 ASSERT(ipnetif->if_refcnt == 0);
1361 ASSERT(ipnetif->if_sharecnt == 0);
1363 /* Remove IPv4/v6 address lists from the ipnetif */
1364 ipnet_purge_addrlist(&ipnetif->if_ip4addr_list);
1365 list_destroy(&ipnetif->if_ip4addr_list);
1366 ipnet_purge_addrlist(&ipnetif->if_ip6addr_list);
1367 list_destroy(&ipnetif->if_ip6addr_list);
1368 mutex_destroy(&ipnetif->if_addr_lock);
1369 mutex_destroy(&ipnetif->if_reflock);
1370 if (ipnetif->if_dev != 0)
1371 id_free(ipnet_minor_space, getminor(ipnetif->if_dev));
1372 kmem_free(ipnetif, sizeof (*ipnetif));
1377 * and add it to the supplied ipnetif. The lif is the netinfo
1382 ipnet_add_ifaddr(uint64_t lif, ipnetif_t *ipnetif, net_handle_t nd)
1389 uint64_t phyif = ipnetif->if_index;
1427 mutex_enter(&ipnetif->if_addr_lock);
1428 if (zoneid != ipnetif->if_zoneid) {
1431 ifp2 = ipnetif_clone_create(ipnetif, zoneid);
1435 &ipnetif->if_ip4addr_list : &ipnetif->if_ip6addr_list, ifaddr);
1436 mutex_exit(&ipnetif->if_addr_lock);
1440 ipnet_delete_ifaddr(ipnetif_addr_t *ifaddr, ipnetif_t *ipnetif, boolean_t isv6)
1442 mutex_enter(&ipnetif->if_addr_lock);
1447 &ipnetif->if_ip6addr_list : &ipnetif->if_ip4addr_list, ifaddr);
1448 mutex_exit(&ipnetif->if_addr_lock);
1455 ipnetif_t *ipnetif;
1467 if ((ipnetif = ipnetif_getby_index(ifindex, ips)) == NULL) {
1468 ipnetif = ipnetif_create(ifname, ifindex, ips, ifflags);
1471 if (ipnetif != NULL) {
1472 ipnetif->if_flags |=
1476 if (ipnetif->if_multicnt != 0) {
1479 ipnetif->if_flags |=
1485 ipnetif_refrele(ipnetif);
1491 ipnetif_t *ipnetif;
1493 if ((ipnetif = ipnetif_getby_index(ifindex, ips)) == NULL)
1496 mutex_enter(&ipnetif->if_addr_lock);
1498 &ipnetif->if_ip6addr_list : &ipnetif->if_ip4addr_list);
1499 mutex_exit(&ipnetif->if_addr_lock);
1502 * Note that we have one ipnetif for both IPv4 and IPv6, but we receive
1503 * separate NE_UNPLUMB events for IPv4 and IPv6. We remove the ipnetif
1506 ipnetif->if_flags &= isv6 ? ~IPNETIF_IPV6PLUMBED : ~IPNETIF_IPV4PLUMBED;
1507 if (!(ipnetif->if_flags & (IPNETIF_IPV4PLUMBED | IPNETIF_IPV6PLUMBED)))
1508 ipnetif_remove(ipnetif, ips);
1509 ipnetif_refrele(ipnetif);
1516 ipnetif_t *ipnetif;
1519 if ((ipnetif = ipnetif_getby_index(ifindex, ips)) == NULL)
1521 if ((ifaddr = ipnet_match_lif(ipnetif, lifindex, isv6)) != NULL) {
1526 ipnet_delete_ifaddr(ifaddr, ipnetif, isv6);
1529 ipnet_add_ifaddr(lifindex, ipnetif, nd);
1530 ipnetif_refrele(ipnetif);
1537 ipnetif_t *ipnetif;
1540 if ((ipnetif = ipnetif_getby_index(ifindex, ips)) == NULL)
1542 if ((ifaddr = ipnet_match_lif(ipnetif, lifindex, isv6)) != NULL)
1543 ipnet_delete_ifaddr(ifaddr, ipnetif, isv6);
1544 ipnetif_refrele(ipnetif);
1546 * Make sure that open streams on this ipnetif are still allowed to
1549 ipnetif_zonecheck(ipnetif, ips);
1624 ipnetif_t *ipnetif;
1634 if ((ipnetif = avl_find(&ips->ips_avl_by_name, name, NULL)) != NULL) {
1635 if (ipnetif_in_zone(ipnetif, zoneid, ips))
1636 dev = ipnetif->if_dev;
1647 ipnetif_t *ipnetif;
1650 if ((ipnetif = avl_find(&ips->ips_avl_by_index, &id, NULL)) != NULL)
1651 ipnetif_refhold(ipnetif);
1653 return (ipnetif);
1659 ipnetif_t *ipnetif;
1664 for (ipnetif = avl_first(tree); ipnetif != NULL;
1665 ipnetif = avl_walk(tree, ipnetif, AVL_AFTER)) {
1666 if (ipnetif->if_dev == dev) {
1667 ipnetif_refhold(ipnetif);
1672 return (ipnetif);
1676 ipnet_match_lif(ipnetif_t *ipnetif, lif_if_t lid, boolean_t isv6)
1681 mutex_enter(&ipnetif->if_addr_lock);
1682 list = isv6 ? &ipnetif->if_ip6addr_list : &ipnetif->if_ip4addr_list;
1688 mutex_exit(&ipnetif->if_addr_lock);
1720 ipnetif_t *ipnetif, *nipnetif;
1740 for (ipnetif = avl_first(&ips->ips_avl_by_index); ipnetif != NULL;
1741 ipnetif = nipnetif) {
1742 nipnetif = AVL_NEXT(&ips->ips_avl_by_index, ipnetif);
1743 ipnetif_remove(ipnetif, ips);
1769 /* Should the supplied ipnetif be visible from the supplied zoneid? */
1771 ipnetif_in_zone(ipnetif_t *ipnetif, zoneid_t zoneid, ipnet_stack_t *ips)
1788 mutex_enter(&ipnetif->if_addr_lock);
1789 ret = ipnet_addrs_in_zone(&ipnetif->if_ip4addr_list, zoneid) ||
1790 ipnet_addrs_in_zone(&ipnetif->if_ip6addr_list, zoneid);
1791 mutex_exit(&ipnetif->if_addr_lock);
1796 * Verify that any ipnet_t that has a reference to the supplied ipnetif should
1798 * to have an ipnetif open if there are no longer any addresses that belong to
1799 * the ipnetif in the ipnet_t's non-global shared-stack zoneid. If that's the
1803 ipnetif_zonecheck(ipnetif_t *ipnetif, ipnet_stack_t *ips)
1811 if (ipnet->ipnet_if != ipnetif)
1813 if (!ipnetif_in_zone(ipnetif, ipnet->ipnet_zoneid, ips))
1822 ipnetif_t *ipnetif;
1843 for (ipnetif = avl_first(&ips->ips_avl_by_index); ipnetif != NULL;
1844 ipnetif = avl_walk(&ips->ips_avl_by_index, ipnetif, AVL_AFTER)) {
1845 if (!ipnetif_in_zone(ipnetif, zoneid, ips))
1848 (void) strlcpy(cbnode->ic_ifname, ipnetif->if_name, LIFNAMSIZ);
1849 cbnode->ic_dev = ipnetif->if_dev;
1897 ipnetif_refhold(ipnetif_t *ipnetif)
1899 mutex_enter(&ipnetif->if_reflock);
1900 ipnetif->if_refcnt++;
1901 mutex_exit(&ipnetif->if_reflock);
1905 ipnetif_refrele(ipnetif_t *ipnetif)
1907 mutex_enter(&ipnetif->if_reflock);
1908 ASSERT(ipnetif->if_refcnt > 0);
1909 if (--ipnetif->if_refcnt == 0)
1910 ipnetif_free(ipnetif);
1912 mutex_exit(&ipnetif->if_reflock);
2047 ipnetif_t *ipnetif;
2060 ipnetif = avl_find(&ips->ips_avl_by_shared, (void *)key, NULL);
2062 ipnetif = avl_find(&ips->ips_avl_by_name, (void *)name, NULL);
2064 if (ipnetif != NULL)
2065 ipnetif_refhold(ipnetif);
2068 *ptr = ipnetif;
2071 if (ipnetif == NULL)
2372 ipnetif_clone_release(ipnetif_t *ipnetif)
2376 ipnet_stack_t *ips = ipnetif->if_stackp;
2378 mutex_enter(&ipnetif->if_reflock);
2379 ASSERT(ipnetif->if_refcnt > 0);
2380 if (--ipnetif->if_refcnt == 0)
2382 ASSERT(ipnetif->if_sharecnt > 0);
2383 if (--ipnetif->if_sharecnt == 0)
2385 mutex_exit(&ipnetif->if_reflock);
2388 avl_remove(&ips->ips_avl_by_shared, ipnetif);
2392 ASSERT(ipnetif->if_sharecnt == 0);
2393 ipnetif_free(ipnetif);