static int dump_domains(int argc, char** argv) { DomainList::Iterator iterator = sDomains.GetIterator(); while (net_domain_private* domain = iterator.Next()) { kprintf("domain: %p, %s, %d\n", domain, domain->name, domain->family); kprintf(" module: %p\n", domain->module); kprintf(" address_module: %p\n", domain->address_module); if (!domain->routes.IsEmpty()) kprintf(" routes:\n"); RouteList::Iterator routeIterator = domain->routes.GetIterator(); while (net_route_private* route = routeIterator.Next()) { kprintf(" %p: dest %s, mask %s, gw %s, flags %" B_PRIx32 ", " "address %p\n", route, AddressString(domain, route->destination ? route->destination : NULL).Data(), AddressString(domain, route->mask ? route->mask : NULL).Data(), AddressString(domain, route->gateway ? route->gateway : NULL).Data(), route->flags, route->interface_address); } if (!domain->route_infos.IsEmpty()) kprintf(" route infos:\n"); RouteInfoList::Iterator infoIterator = domain->route_infos.GetIterator(); while (net_route_info* info = infoIterator.Next()) { kprintf(" %p\n", info); } } return 0; }
/*! Scans the domain list for the specified family. You need to hold the sDomainLock when calling this function. */ static net_domain_private* lookup_domain(int family) { DomainList::Iterator iterator = sDomains.GetIterator(); while (net_domain_private* domain = iterator.Next()) { if (domain->family == family) return domain; } return NULL; }
void domain_removed_device_interface(net_device_interface* deviceInterface) { MutexLocker locker(sDomainLock); DomainList::Iterator iterator = sDomains.GetIterator(); while (net_domain_private* domain = iterator.Next()) { RecursiveLocker locker(domain->lock); net_interface_private* interface = find_interface(domain, deviceInterface->device->name); if (interface == NULL) continue; remove_interface_from_domain(interface); } }
static int dump_domains(int argc, char** argv) { DomainList::Iterator iterator = sDomains.GetIterator(); while (net_domain_private* domain = iterator.Next()) { kprintf("domain: %p, %s, %d\n", domain, domain->name, domain->family); kprintf(" module: %p\n", domain->module); kprintf(" address_module: %p\n", domain->address_module); if (!list_is_empty(&domain->interfaces)) kprintf(" interfaces:\n"); net_interface* interface = NULL; while (true) { interface = (net_interface*)list_get_next_item(&domain->interfaces, interface); if (interface == NULL) break; kprintf(" %p\n", interface); } if (!domain->routes.IsEmpty()) kprintf(" routes:\n"); RouteList::Iterator routeIterator = domain->routes.GetIterator(); while (net_route* route = routeIterator.Next()) { kprintf(" %p\n", route); } if (!domain->route_infos.IsEmpty()) kprintf(" route infos:\n"); RouteInfoList::Iterator infoIterator = domain->route_infos.GetIterator(); while (net_route_info* info = infoIterator.Next()) { kprintf(" %p\n", info); } } return 0; }
uint32 count_domain_interfaces() { MutexLocker locker(sDomainLock); uint32 count = 0; DomainList::Iterator iterator = sDomains.GetIterator(); while (net_domain_private* domain = iterator.Next()) { net_interface* interface = NULL; while (true) { interface = (net_interface*)list_get_next_item(&domain->interfaces, interface); if (interface == NULL) break; count++; } } return count; }
/*! Dumps a list of all interfaces into the supplied userland buffer. If the interfaces don't fit into the buffer, an error (\c ENOBUFS) is returned. */ status_t list_domain_interfaces(void* _buffer, size_t* bufferSize) { MutexLocker locker(sDomainLock); UserBuffer buffer(_buffer, *bufferSize); DomainList::Iterator iterator = sDomains.GetIterator(); while (net_domain_private* domain = iterator.Next()) { RecursiveLocker locker(domain->lock); net_interface* interface = NULL; while (true) { interface = (net_interface*)list_get_next_item(&domain->interfaces, interface); if (interface == NULL) break; ifreq request; strlcpy(request.ifr_name, interface->name, IF_NAMESIZE); if (interface->address != NULL) { memcpy(&request.ifr_addr, interface->address, interface->address->sa_len); } else { // empty address request.ifr_addr.sa_len = 2; request.ifr_addr.sa_family = AF_UNSPEC; } if (buffer.Copy(&request, IF_NAMESIZE + request.ifr_addr.sa_len) == NULL) return buffer.Status(); } } *bufferSize = buffer.ConsumedAmount(); return B_OK; }