QString NetworkHelperImplWindows::getDefaultGatewayAsString() { QString ret; MIB_IPFORWARD_TABLE2 *table = NULL; NETIO_STATUS status; status = GetIpForwardTable2(AF_INET, &table); if (!NETIO_SUCCESS(status)) { qDebug() << "GetIpForwardTable2 failed:" << status; return 1; } for (ULONG i = 0; i < table->NumEntries; i++) { MIB_IPFORWARD_ROW2 *row = table->Table + i; IP_ADDRESS_PREFIX *prefix = &row->DestinationPrefix; SOCKADDR_INET *destAddr = &prefix->Prefix; if (destAddr->Ipv4.sin_addr.S_un.S_addr == 0) { ret = QHostAddress(ntohl(row->NextHop.Ipv4.sin_addr.S_un.S_addr)).toString(); break; } } FreeMibTable(table); return ret; }
void MeasureNet::FinalizeStatic() { if (c_Table) { FreeMibTable(c_Table); } c_Table = nullptr; c_NumOfTables = 0; }
void c_tun_device_windows::set_ipv6_address (const std::array<uint8_t, 16> &binary_address, int prefixLen) { _fact("Setting IPv6 address, prefixLen="<<prefixLen); std::wstring human_name = get_human_name(m_guid); NET_LUID luid = get_luid(human_name); _fact("Setting address on human_name " << to_string(human_name));// << " luid=" << to_string(luid)); // remove old address MIB_UNICASTIPADDRESS_TABLE *table = nullptr; NETIOAPI_API status = GetUnicastIpAddressTable(AF_INET6, &table); if (status != NO_ERROR) throw std::runtime_error("GetUnicastIpAddressTable error, code"); for (int i = 0; i < static_cast<int>(table->NumEntries); ++i) { _info("Removing old addresses, i="<<i); if (table->Table[i].InterfaceLuid.Value == luid.Value) { _info("Removing old addresses, entry i="<<i<<" - will remove"); if (DeleteUnicastIpAddressEntry(&table->Table[i]) != NO_ERROR) { FreeMibTable(table); throw std::runtime_error("DeleteUnicastIpAddressEntry error"); } } } FreeMibTable(table); // set new address _fact("Setting new IP address"); MIB_UNICASTIPADDRESS_ROW iprow; std::memset(&iprow, 0, sizeof(iprow)); iprow.PrefixOrigin = IpPrefixOriginUnchanged; iprow.SuffixOrigin = IpSuffixOriginUnchanged; iprow.ValidLifetime = 0xFFFFFFFF; iprow.PreferredLifetime = 0xFFFFFFFF; iprow.OnLinkPrefixLength = 0xFF; iprow.InterfaceLuid = luid; iprow.Address.si_family = AF_INET6; std::memcpy(&iprow.Address.Ipv6.sin6_addr, binary_address.data(), binary_address.size()); iprow.OnLinkPrefixLength = prefixLen; _fact("Creating unicast IP"); status = CreateUnicastIpAddressEntry(&iprow); if (status != NO_ERROR) throw std::runtime_error("CreateUnicastIpAddressEntry error"); _goal("Created unicast IP, status=" << status); }
void NetPlatform_flushAddresses(const char* deviceName, struct Except* eh) { NET_LUID luid = getLuid(deviceName, eh); MIB_UNICASTIPADDRESS_TABLE* table; WinFail_check(eh, GetUnicastIpAddressTable(AF_INET, &table)); LONG ret = flushAddresses(luid, table); FreeMibTable(table); if (ret) { WinFail_fail(eh, "DeleteUnicastIpAddressEntry(&table->Table[i])", ret); } WinFail_check(eh, GetUnicastIpAddressTable(AF_INET6, &table)); ret = flushAddresses(luid, table); FreeMibTable(table); if (ret) { WinFail_fail(eh, "DeleteUnicastIpAddressEntry(&table->Table[i])", ret); } }
int NetworkHelperImplWindows::queryRoutingTable() { MIB_IPFORWARD_TABLE2 *table = NULL; NETIO_STATUS status; status = GetIpForwardTable2(AF_INET, &table); if (!NETIO_SUCCESS(status)) { qDebug() << "GetIpForwardTable2 failed:" << status; return 1; } for (ULONG i = 0; i < table->NumEntries; i++) { MIB_IPFORWARD_ROW2 *row = table->Table + i; IP_ADDRESS_PREFIX *prefix = &row->DestinationPrefix; QHostAddress destAddr(ntohl(prefix->Prefix.Ipv4.sin_addr.S_un.S_addr)); QHostAddress nextHop(ntohl(row->NextHop.Ipv4.sin_addr.S_un.S_addr)); #ifdef _DEBUG const QString debugLineFormat("%1/%2 via %3 metric %4 dev %5 # %6proto=%7, origin=%8"); QString debugLine = debugLineFormat.arg( destAddr.toString(), QString::number(prefix->PrefixLength), nextHop.toString(), QString::number(row->Metric), (row->Loopback ? "lo" : QString::number(row->InterfaceIndex)), (row->Immortal ? "immortal, " : ""), QString::number(row->Protocol), QString::number(row->Origin) ); qDebug() << debugLine; #endif } FreeMibTable(table); return 0; }
VOID IpInterfaceDemo( VOID ) { ULONG InterfaceCount = 0, Index = 0, i; ULONG Status; PMIB_IPINTERFACE_TABLE InterfaceTable = NULL; Status = GetIpInterfaceTable(AF_UNSPEC, &InterfaceTable); if (!WIN_SUCCESS(Status)) { printf("Get IpInterfaceTable failed. Error %d\n", Status); } else { printf("Get IpInterfaceTable succeeded.\n"); InterfaceCount = InterfaceTable->NumEntries; printf( "Total number of Interfaces: %d\n", InterfaceTable->NumEntries); for (i = 0; i < InterfaceCount; i++) { printf("\n"); printf( "Interface Index: %d\n", InterfaceTable->Table[i].InterfaceIndex); printf( "Address Family: %ws\n", (InterfaceTable->Table[i].Family == AF_INET) ? L"IPv4" : L"IPv6"); printf( "AdvertisingEnabled: %ws\n", InterfaceTable->Table[i].AdvertisingEnabled ? L"TRUE" : L"FALSE"); printf( "UseAutomaticMetric: %ws\n", InterfaceTable->Table[i].UseAutomaticMetric ? L"TRUE" : L"FALSE"); printf( "ForwardingEnabled: %ws\n", InterfaceTable->Table[i].ForwardingEnabled ? L"TRUE" : L"FALSE"); printf( "WeakHostSend: %ws\n", InterfaceTable->Table[i].WeakHostSend ? L"TRUE" : L"FALSE"); printf( "WeakHostReceive: %ws\n", InterfaceTable->Table[i].WeakHostReceive ? L"TRUE" : L"FALSE"); printf( "UseNeighborUnreachabilityDetection: %ws\n", InterfaceTable->Table[i].UseNeighborUnreachabilityDetection ? L"TRUE" : L"FALSE"); printf( "AdvertiseDefaultRoute: %ws\n", InterfaceTable->Table[i].AdvertiseDefaultRoute ? L"TRUE" : L"FALSE"); } FreeMibTable(InterfaceTable); } }
VOID AddressDemo( VOID ) { NETIO_STATUS Status; PMIB_UNICASTIPADDRESS_TABLE UnicastTable = NULL; MIB_UNICASTIPADDRESS_ROW Row; ULONG i; IN6_ADDR Ipv6Address = {0xfe,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0x20,0x00}; HANDLE Handle; NET_IFINDEX InterfaceIndex = 0; // // Retrieve all the IP addresses. // Status = GetUnicastIpAddressTable( AF_UNSPEC, &UnicastTable); if (!WIN_SUCCESS(Status)) { printf( "GetUnicastAddressTable Failed. Error %d\n", Status); } else { printf( "GetUnicastAddressTable Succeeded.\n"); printf( "Total Number of all IP Address Entries: %d.\n", UnicastTable->NumEntries); for (i = 0; i < UnicastTable->NumEntries; i++) { printf("Address %2d: ", i); PrintIpAddress(&UnicastTable->Table[i].Address); printf("\n"); } FreeMibTable(UnicastTable); printf("\n\n"); } // // Retrieve IPv6 Only Addresses. // Status = GetUnicastIpAddressTable( AF_INET6, &UnicastTable); if (!WIN_SUCCESS(Status)) { printf( "GetUnicastAddressTable Failed. Error %d\n", Status); } else { printf( "GetUnicastAddressTable Succeeded.\n"); printf( "Total Number of IPv6 Address Entries: %d.\n", UnicastTable->NumEntries); for (i = 0; i < UnicastTable->NumEntries; i++) { printf("Address %2d: ", i); PrintIpAddress(&UnicastTable->Table[i].Address); printf("\n"); } InterfaceIndex = UnicastTable->Table[i - 1].InterfaceIndex; FreeMibTable(UnicastTable); } Status = NotifyUnicastIpAddressChange( AF_UNSPEC, //(PUNICAST_IPADDRESS_CHANGE_CALLBACK)AddressCallbackDemo, &AddressCallbackDemo, NULL, FALSE, &Handle); if (!WIN_SUCCESS(Status)) { printf( "\nRegister address change failed. Error %d\n", Status); } else { printf( "\nRegister address change succeeded.\n"); } InitializeUnicastIpAddressEntry(&Row); Row.Address.si_family = AF_INET6; INETADDR_SET_ADDRESS((PSOCKADDR)&Row.Address, (PUCHAR)&Ipv6Address); Row.InterfaceIndex = InterfaceIndex; Status = CreateUnicastIpAddressEntry(&Row); if (!WIN_SUCCESS(Status)) { printf("Create IPv6 unicast address entry failed. Error %d\n", Status); } else { printf("Create IPv6 unicast address entry succeeded.\n"); } Status = GetUnicastIpAddressEntry(&Row); if (!WIN_SUCCESS(Status)) { printf("Get IPv6 unicast address failed. Error %d\n", Status); } else { printf("Get IPv6 unicast address entry succeeded.\n"); } Row.PreferredLifetime = 500000; Status = SetUnicastIpAddressEntry(&Row); if (!WIN_SUCCESS(Status)) { printf("Set IPv6 unicast address entry failed. Error %d\n", Status); } else { printf("Set IPv6 unicast address entry succeeded.\n"); } Status = DeleteUnicastIpAddressEntry(&Row); if (!WIN_SUCCESS(Status)) { printf("Delete Ipv6 Unicast Address Failed. Error %d\n", Status); } else { printf("Delete Ipv6 Unicast Address Succeeded.\n"); } Sleep(2000); Status = CancelMibChangeNotify2(Handle); if (!WIN_SUCCESS(Status)) { printf( "Deregister address change failed. Error %d\n\n", Status); } else { printf( "Deregister address change succeeded.\n\n"); } }
/* ** Reads the tables for all net interfaces ** */ void MeasureNet::UpdateIFTable() { bool logging = false; if (c_Table) { FreeMibTable(c_Table); c_Table = nullptr; } if (GetIfTable2(&c_Table) == NO_ERROR) { if (c_NumOfTables != c_Table->NumEntries) { c_NumOfTables = c_Table->NumEntries; logging = true; } if (GetRainmeter().GetDebug() && logging) { LogDebug(L"------------------------------"); LogDebugF(L"* NETWORK-INTERFACE: Count=%i", c_NumOfTables); for (size_t i = 0; i < c_NumOfTables; ++i) { const WCHAR* type = L"Other"; switch (c_Table->Table[i].Type) { case IF_TYPE_ETHERNET_CSMACD: type = L"Ethernet"; break; case IF_TYPE_PPP: type = L"PPP"; break; case IF_TYPE_SOFTWARE_LOOPBACK: type = L"Loopback"; break; case IF_TYPE_IEEE80211: type = L"IEEE802.11"; break; case IF_TYPE_TUNNEL: type = L"Tunnel"; break; case IF_TYPE_IEEE1394: type = L"IEEE1394"; break; } LogDebugF(L"%i: %s", (int)i + 1, c_Table->Table[i].Description); LogDebugF(L" Alias: %s", c_Table->Table[i].Alias); LogDebugF(L" Type=%s(%i), Hardware=%s, Filter=%s", type, c_Table->Table[i].Type, (c_Table->Table[i].InterfaceAndOperStatusFlags.HardwareInterface == 1) ? L"Yes" : L"No", (c_Table->Table[i].InterfaceAndOperStatusFlags.FilterInterface == 1) ? L"Yes" : L"No"); } LogDebug(L"------------------------------"); } } else { // Something's wrong. Unable to get the table. c_Table = nullptr; c_NumOfTables = 0; } }