static boolean_t dlpi_walk_cb(const char *name, void *arg) { NOTE(ARGUNUSED(arg)) dlpi_handle_t dlh; link_t *link; int rc; dlpi_info_t info; boolean_t keep; size_t len; rc = dlpi_open(name, &dlh, DLPI_PASSIVE|DLPI_NATIVE); if (rc != DLPI_SUCCESS) { DMSG(D_NET, "dlpi_open(%s) failed: %s; skipping.", name, dlpi_strerror(rc)); return (B_TRUE); } rc = dlpi_info(dlh, &info, 0); if (rc != DLPI_SUCCESS) { DMSG(D_NET, "dlpi_info(%s) failed: %s; skipping.", name, dlpi_strerror(rc)); dlpi_close(dlh); return (B_TRUE); } keep = !!(info.di_mactype == DL_ETHER); DMSG(D_NET, "found link %s, mactype = %s (%d)%s.", name, dlpi_mactype(info.di_mactype), info.di_mactype, (keep) ? "" : "; discarding"); dlpi_close(dlh); if (!keep) return (B_TRUE); VERIFY((link = link_alloc(name)) != NULL); list_insert_tail(&links, (void *)link); num_links++; if ((len = strlen(name)) > link_max_len) link_max_len = len; return (B_TRUE); }
static void hwaddr_libdlpi_lookup(sigar_t *sigar, sigar_net_interface_config_t *ifconfig) { dlpi_handle_t handle; dlpi_info_t linkinfo; uchar_t addr[DLPI_PHYSADDR_MAX]; uint_t alen = sizeof(addr); if (dlpi_open(ifconfig->name, &handle, 0) != DLPI_SUCCESS) { return; } if (dlpi_get_physaddr(handle, DL_CURR_PHYS_ADDR, addr, &alen) == DLPI_SUCCESS && dlpi_info(handle, &linkinfo, 0) == DLPI_SUCCESS) { if (alen < sizeof(ifconfig->hwaddr.addr.mac)) { sigar_net_address_mac_set(ifconfig->hwaddr, addr, alen); SIGAR_SSTRCPY(ifconfig->type, dlpi_mactype(linkinfo.di_mactype)); } } dlpi_close(handle); }