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;
    }
Example #2
0
void MeasureNet::FinalizeStatic()
{
	if (c_Table)
	{
		FreeMibTable(c_Table);
	}
	c_Table = nullptr;
	c_NumOfTables = 0;
}
Example #3
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);
}
Example #4
0
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");     
    }
}
Example #8
0
/*
** 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;
	}
}