aboutsummaryrefslogtreecommitdiff
path: root/src/core/internal_network
diff options
context:
space:
mode:
authorBriar <205427297+icy-briar@users.noreply.github.com>2025-04-10 00:40:07 +0200
committerGitHub <noreply@github.com>2025-04-10 00:40:07 +0200
commit216ded699791dcbfbfc122b6fc2b12d1252f15bb (patch)
tree365ab97c70a035f46f62d5bf153990b7859b7e06 /src/core/internal_network
parent5f0542c2bf2edb3481ca042e6ad3367b68634bf0 (diff)
android: Improve network gateway handling
Diffstat (limited to 'src/core/internal_network')
-rw-r--r--src/core/internal_network/network_interface.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/core/internal_network/network_interface.cpp b/src/core/internal_network/network_interface.cpp
index 7c37f660bb..3d99bdf5ce 100644
--- a/src/core/internal_network/network_interface.cpp
+++ b/src/core/internal_network/network_interface.cpp
@@ -1,5 +1,5 @@
-// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
+// SPDX-FileCopyrightText: Copyright yuzu/Citra Emulator Project / Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
#include <algorithm>
#include <fstream>
@@ -117,6 +117,16 @@ std::vector<NetworkInterface> GetAvailableNetworkInterfaces() {
continue;
}
+#ifdef ANDROID
+ // On Android, we can't reliably get gateway info from /proc/net/route
+ // Just use 0 as the gateway address
+ result.emplace_back(NetworkInterface{
+ .name{ifa->ifa_name},
+ .ip_address{Common::BitCast<struct sockaddr_in>(*ifa->ifa_addr).sin_addr},
+ .subnet_mask{Common::BitCast<struct sockaddr_in>(*ifa->ifa_netmask).sin_addr},
+ .gateway{in_addr{.s_addr = 0}}
+ });
+#else
u32 gateway{};
std::ifstream file{"/proc/net/route"};
@@ -177,14 +187,14 @@ std::vector<NetworkInterface> GetAvailableNetworkInterfaces() {
.ip_address{Common::BitCast<struct sockaddr_in>(*ifa->ifa_addr).sin_addr},
.subnet_mask{Common::BitCast<struct sockaddr_in>(*ifa->ifa_netmask).sin_addr},
.gateway{in_addr{.s_addr = gateway}}});
+#endif // ANDROID
}
freeifaddrs(ifaddr);
-
return result;
}
-#endif
+#endif // _WIN32
std::optional<NetworkInterface> GetSelectedNetworkInterface() {
const auto& selected_network_interface = Settings::values.network_interface.GetValue();
@@ -194,6 +204,12 @@ std::optional<NetworkInterface> GetSelectedNetworkInterface() {
return std::nullopt;
}
+ #ifdef __ANDROID__
+ if (selected_network_interface.empty()) {
+ return network_interfaces[0];
+ }
+ #endif
+
const auto res =
std::ranges::find_if(network_interfaces, [&selected_network_interface](const auto& iface) {
return iface.name == selected_network_interface;