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;
 }
Beispiel #2
0
 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)));
}