mirror of
https://git.citron-emu.org/Citron/Citron.git
synced 2025-02-23 17:18:47 +01:00
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.
This commit is contained in:
parent
c5e480e55d
commit
43495b6045
3 changed files with 29 additions and 22 deletions
|
@ -562,15 +562,14 @@ void IGeneralService::IsEthernetCommunicationEnabled(HLERequestContext& ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void IGeneralService::IsAnyInternetRequestAccepted(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};
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
if (Network::GetHostIPv4Address().has_value()) {
|
rb.Push<u8>(is_accepted);
|
||||||
rb.Push<u8>(1);
|
|
||||||
} else {
|
|
||||||
rb.Push<u8>(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IGeneralService::IsAnyForegroundRequestAccepted(HLERequestContext& ctx) {
|
void IGeneralService::IsAnyForegroundRequestAccepted(HLERequestContext& ctx) {
|
||||||
|
|
|
@ -548,26 +548,19 @@ void RestartSocketOperations() {
|
||||||
AcknowledgeInterrupt();
|
AcknowledgeInterrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<IPv4Address> GetHostIPv4Address() {
|
std::optional<Network::IPv4Address> GetHostIPv4Address() {
|
||||||
const auto network_interface = Network::GetSelectedNetworkInterface();
|
const auto interface = Network::GetSelectedNetworkInterface();
|
||||||
if (!network_interface.has_value()) {
|
if (!interface) {
|
||||||
// Only print the error once to avoid log spam
|
LOG_DEBUG(Network, "No network interface selected, returning default address");
|
||||||
static bool print_error = true;
|
return Network::IPv4Address{127, 0, 0, 1}; // Return loopback address when no interface is selected
|
||||||
if (print_error) {
|
|
||||||
LOG_ERROR(Network, "GetSelectedNetworkInterface returned no interface");
|
|
||||||
print_error = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TranslateIPv4(network_interface->ip_address);
|
return Network::TranslateIPv4(interface->ip_address);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string IPv4AddressToString(IPv4Address ip_addr) {
|
Network::IPv4Address TranslateIPv4(const in_addr& addr) {
|
||||||
std::array<char, INET_ADDRSTRLEN> buf = {};
|
const auto bytes = reinterpret_cast<const uint8_t*>(&addr.s_addr);
|
||||||
ASSERT(inet_ntop(AF_INET, &ip_addr, buf.data(), sizeof(buf)) == buf.data());
|
return Network::IPv4Address{bytes[0], bytes[1], bytes[2], bytes[3]};
|
||||||
return std::string(buf.data());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 IPv4AddressToInteger(IPv4Address ip_addr) {
|
u32 IPv4AddressToInteger(IPv4Address ip_addr) {
|
||||||
|
@ -954,4 +947,15 @@ void ForceOfflineMode() {
|
||||||
Settings::values.network_interface = "null"; // Or whatever value indicates disabled
|
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<char, INET_ADDRSTRLEN> 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
|
} // namespace Network
|
||||||
|
|
|
@ -212,6 +212,10 @@ std::optional<NetworkInterface> GetSelectedNetworkInterface() {
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (selected_network_interface == "None" || selected_network_interface.empty()) {
|
||||||
|
return std::nullopt; // Return empty/default interface
|
||||||
|
}
|
||||||
|
|
||||||
const auto res =
|
const auto res =
|
||||||
std::ranges::find_if(network_interfaces, [&selected_network_interface](const auto& iface) {
|
std::ranges::find_if(network_interfaces, [&selected_network_interface](const auto& iface) {
|
||||||
return iface.name == selected_network_interface;
|
return iface.name == selected_network_interface;
|
||||||
|
|
Loading…
Reference in a new issue