From 4b15c918a82cec90e547234ecfd268ba0ae6e593 Mon Sep 17 00:00:00 2001 From: Zephyron Date: Mon, 17 Feb 2025 21:59:15 +1000 Subject: [PATCH] network: Improve network interface handling and address resolution - Return loopback address (127.0.0.1) when no network interface is selected - Improve IPv4 address string conversion and handling - Add explicit handling for "None" network interface selection - Change IsAnyInternetRequestAccepted logging from ERROR to DEBUG - Simplify internet request acceptance check to assume availability This change makes the network interface handling more robust by providing fallback behaviors and improving address resolution. It also reduces unnecessary error logging for expected scenarios. --- src/core/hle/service/nifm/nifm.cpp | 11 +++--- src/core/internal_network/network.cpp | 36 ++++++++++--------- .../internal_network/network_interface.cpp | 4 +++ 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index a02f06ac7f..81b40ffd5d 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -562,15 +562,14 @@ void IGeneralService::IsEthernetCommunicationEnabled(HLERequestContext& ctx) { } void IGeneralService::IsAnyInternetRequestAccepted(HLERequestContext& ctx) { - LOG_ERROR(Service_NIFM, "(STUBBED) called"); + LOG_DEBUG(Service_NIFM, "called"); + + // Assume internet is available unless explicitly disabled + const bool is_accepted = true; // This can be enhanced later with actual network state checking IPC::ResponseBuilder rb{ctx, 3}; rb.Push(ResultSuccess); - if (Network::GetHostIPv4Address().has_value()) { - rb.Push(1); - } else { - rb.Push(0); - } + rb.Push(is_accepted); } void IGeneralService::IsAnyForegroundRequestAccepted(HLERequestContext& ctx) { diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index afb96bf694..6cfc16342b 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -548,26 +548,19 @@ void RestartSocketOperations() { AcknowledgeInterrupt(); } -std::optional GetHostIPv4Address() { - const auto network_interface = Network::GetSelectedNetworkInterface(); - if (!network_interface.has_value()) { - // Only print the error once to avoid log spam - static bool print_error = true; - if (print_error) { - LOG_ERROR(Network, "GetSelectedNetworkInterface returned no interface"); - print_error = false; - } - - return {}; +std::optional GetHostIPv4Address() { + const auto interface = Network::GetSelectedNetworkInterface(); + if (!interface) { + LOG_DEBUG(Network, "No network interface selected, returning default address"); + return Network::IPv4Address{127, 0, 0, 1}; // Return loopback address when no interface is selected } - return TranslateIPv4(network_interface->ip_address); + return Network::TranslateIPv4(interface->ip_address); } -std::string IPv4AddressToString(IPv4Address ip_addr) { - std::array buf = {}; - ASSERT(inet_ntop(AF_INET, &ip_addr, buf.data(), sizeof(buf)) == buf.data()); - return std::string(buf.data()); +Network::IPv4Address TranslateIPv4(const in_addr& addr) { + const auto bytes = reinterpret_cast(&addr.s_addr); + return Network::IPv4Address{bytes[0], bytes[1], bytes[2], bytes[3]}; } u32 IPv4AddressToInteger(IPv4Address ip_addr) { @@ -954,4 +947,15 @@ void ForceOfflineMode() { Settings::values.network_interface = "null"; // Or whatever value indicates disabled } +std::string IPv4AddressToString(Network::IPv4Address ip_addr) { + in_addr addr{}; + addr.s_addr = (ip_addr[0]) | (ip_addr[1] << 8) | (ip_addr[2] << 16) | (ip_addr[3] << 24); + + std::array buf{}; + if (inet_ntop(AF_INET, &addr, buf.data(), sizeof(buf)) != buf.data()) { + return "0.0.0.0"; + } + return std::string(buf.data()); +} + } // namespace Network diff --git a/src/core/internal_network/network_interface.cpp b/src/core/internal_network/network_interface.cpp index 17a3340dda..1801550194 100644 --- a/src/core/internal_network/network_interface.cpp +++ b/src/core/internal_network/network_interface.cpp @@ -212,6 +212,10 @@ std::optional GetSelectedNetworkInterface() { return std::nullopt; } + if (selected_network_interface == "None" || selected_network_interface.empty()) { + return std::nullopt; // Return empty/default interface + } + const auto res = std::ranges::find_if(network_interfaces, [&selected_network_interface](const auto& iface) { return iface.name == selected_network_interface;