diff options
author | CrystalP <crystalp@kodi.tv> | 2024-05-04 12:52:54 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-04 12:52:54 -0400 |
commit | 08948981a77af5856b9a6d925e718e2277e75688 (patch) | |
tree | 73fe6d2d9f70b76db3dddbe9622a8148526a8450 | |
parent | 0db97ab49b85b7ea52a59ae20b7cd5e117a64cdc (diff) | |
parent | 3758c6f774c27244f850008738b56218914fb910 (diff) | |
download | xbmc-08948981a77af5856b9a6d925e718e2277e75688.tar.xz |
Merge pull request #25111 from CrystalP/fix-macdiscovery
[Windows] Fix Discovery of MAC Address
-rw-r--r-- | xbmc/platform/win32/network/NetworkWin32.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/xbmc/platform/win32/network/NetworkWin32.cpp b/xbmc/platform/win32/network/NetworkWin32.cpp index f87056134b..2dee878a9d 100644 --- a/xbmc/platform/win32/network/NetworkWin32.cpp +++ b/xbmc/platform/win32/network/NetworkWin32.cpp @@ -248,7 +248,7 @@ bool CNetworkWin32::PingHost(const struct sockaddr& host, unsigned int timeout_m bool CNetworkInterfaceWin32::GetHostMacAddress(unsigned long host, std::string& mac) const { - struct sockaddr sockHost; + sockaddr sockHost{}; sockHost.sa_family = AF_INET; reinterpret_cast<struct sockaddr_in&>(sockHost).sin_addr.S_un.S_addr = host; return GetHostMacAddress(&sockHost, mac); @@ -260,33 +260,38 @@ bool CNetworkInterfaceWin32::GetHostMacAddress(struct sockaddr* host, std::strin if (GetBestInterfaceEx(host, &InterfaceIndex) != NO_ERROR) return false; - NET_LUID luid = {}; + NET_LUID luid{}; if (ConvertInterfaceIndexToLuid(InterfaceIndex, &luid) != NO_ERROR) return false; - MIB_IPNET_ROW2 neighborIp = {}; + MIB_IPNET_ROW2 neighborIp{}; neighborIp.InterfaceLuid = luid; - neighborIp.InterfaceIndex; - neighborIp.Address.si_family = host->sa_family; switch (host->sa_family) { case AF_INET: - neighborIp.Address.Ipv4 = reinterpret_cast<const struct sockaddr_in&>(host); + memcpy(&neighborIp.Address.Ipv4, host, sizeof(sockaddr_in)); break; case AF_INET6: - neighborIp.Address.Ipv6 = reinterpret_cast<const struct sockaddr_in6&>(host); + memcpy(&neighborIp.Address.Ipv6, host, sizeof(sockaddr_in6)); break; default: return false; } - DWORD dwRetVal = ResolveIpNetEntry2(&neighborIp, nullptr); + DWORD dwRetVal = GetIpNetEntry2(&neighborIp); + + if (dwRetVal != NO_ERROR) + { + CLog::LogF(LOGDEBUG, "Host not found in the cache (error {}), resolve the address.", dwRetVal); + dwRetVal = ResolveIpNetEntry2(&neighborIp, nullptr); + } if (dwRetVal != NO_ERROR) { CLog::LogF(LOGERROR, "ResolveIpNetEntry2 failed with error ({})", dwRetVal); return false; } + if (neighborIp.PhysicalAddressLength < MAC_LENGTH) { CLog::LogF(LOGERROR, |