bool operator() (const IP_ADAPTER_ADDRESSES *iface) { using Tins::IPv4Address; using Tins::Endian::host_to_be; if(iface_id == uint32_t(iface->IfIndex)) { std::copy(iface->PhysicalAddress, iface->PhysicalAddress + 6, info->hw_addr.begin()); const IP_ADAPTER_UNICAST_ADDRESS *unicast = iface->FirstUnicastAddress; if(unicast) { info->ip_addr = IPv4Address(((const struct sockaddr_in *)unicast->Address.lpSockaddr)->sin_addr.s_addr); info->netmask = IPv4Address(host_to_be<uint32_t>(0xffffffff << (32 - unicast->OnLinkPrefixLength))); info->bcast_addr = IPv4Address((info->ip_addr & info->netmask) | ~info->netmask); found = true; } } return found; }
bool operator() (const struct ifaddrs *addr) { using Tins::Endian::host_to_be; using Tins::IPv4Address; #if defined(BSD) || defined(__FreeBSD_kernel__) const struct sockaddr_dl* addr_ptr = ((struct sockaddr_dl*)addr->ifa_addr); if(addr->ifa_addr->sa_family == AF_LINK && addr_ptr->sdl_index == iface_id) { info->hw_addr = (const uint8_t*)LLADDR(addr_ptr); // mmmm found_hw = true; } else if(addr->ifa_addr->sa_family == AF_INET && !std::strcmp(addr->ifa_name, iface_name)) { info->ip_addr = IPv4Address(((struct sockaddr_in *)addr->ifa_addr)->sin_addr.s_addr); info->netmask = IPv4Address(((struct sockaddr_in *)addr->ifa_netmask)->sin_addr.s_addr); if((addr->ifa_flags & (IFF_BROADCAST | IFF_POINTOPOINT))) info->bcast_addr = IPv4Address(((struct sockaddr_in *)addr->ifa_dstaddr)->sin_addr.s_addr); else info->bcast_addr = 0; info->is_up = (addr->ifa_flags & IFF_UP); found_ip = true; } #else const struct sockaddr_ll* addr_ptr = ((struct sockaddr_ll*)addr->ifa_addr); if(addr->ifa_addr) { if(addr->ifa_addr->sa_family == AF_PACKET && addr_ptr->sll_ifindex == iface_id) { info->hw_addr = addr_ptr->sll_addr; found_hw = true; } else if(addr->ifa_addr->sa_family == AF_INET && !std::strcmp(addr->ifa_name, iface_name)) { info->ip_addr = IPv4Address(((struct sockaddr_in *)addr->ifa_addr)->sin_addr.s_addr); info->netmask = IPv4Address(((struct sockaddr_in *)addr->ifa_netmask)->sin_addr.s_addr); if((addr->ifa_flags & (IFF_BROADCAST | IFF_POINTOPOINT))) info->bcast_addr = IPv4Address(((struct sockaddr_in *)addr->ifa_ifu.ifu_broadaddr)->sin_addr.s_addr); else info->bcast_addr = 0; info->is_up = (addr->ifa_flags & IFF_UP); found_ip = true; } } #endif return found_ip && found_hw; }
// static NetworkInterface NetworkInterface::default_interface() { return NetworkInterface(IPv4Address(uint32_t(0))); }