From df587e1a95d76e3d2699ad3be27441a3dd6ad147 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 15 Aug 2026 01:25:58 +0000 Subject: [PATCH] more gymnastics to give fake results? --- src/core/hle/service/sockets/bsd.cpp | 4 +- src/core/internal_network/network.cpp | 100 +++++++++++----------- src/core/internal_network/network.h | 4 + src/core/internal_network/socket_icmp.cpp | 41 ++++----- src/core/internal_network/socket_icmp.h | 2 - 5 files changed, 76 insertions(+), 75 deletions(-) diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index ecaa970996..4eff91a2d3 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -553,7 +553,9 @@ std::pair BSD::SocketImpl(Network::Domain domain, Network:: auto room_member = Network::GetRoomMember().lock(); if (room_member && room_member->IsConnected()) { descriptor.socket = std::make_shared(); - } else if (protocol == Network::Protocol::ICMP || protocol == Network::Protocol::ICMPV6) { + } else if ((type == Network::Type::RAW || type == Network::Type::DGRAM) + && (domain == Network::Domain::INET && protocol == Network::Protocol::ICMP) + && (domain == Network::Domain::INET6 && protocol == Network::Protocol::ICMPV6)) { descriptor.socket = std::make_shared(); } else { descriptor.socket = std::make_shared(); diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index bcb2c60e75..5d6efc1928 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -677,55 +677,6 @@ int TranslateTypeToNative(Type type) { } #undef NETWORK_PROTOCOL_TRANSLATE_LIST -#ifdef _WIN32 -sockaddr_in TranslateFromSockAddrIn(Network::SockAddrIn input) { - sockaddr_in result{}; -#ifdef __unix__ - result.sin_len = sizeof(result); -#endif - result.sin_family = AF_INET; - switch (Domain(input.family)) { - case Domain::INET: - result.sin_family = AF_INET; - break; - default: - UNIMPLEMENTED_MSG("Unhandled sockaddr family={}", input.family); - break; - } - - result.sin_port = input.portno; //no need to translate - - auto& ip = result.sin_addr.S_un.S_un_b; - ip.s_b1 = input.ip[0]; - ip.s_b2 = input.ip[1]; - ip.s_b3 = input.ip[2]; - ip.s_b4 = input.ip[3]; - return result; -} -#else -sockaddr_in TranslateFromSockAddrIn(Network::SockAddrIn input) { - sockaddr_in result{}; - result.sin_family = sa_family_t(TranslateDomainToNative(Domain(input.family))); - //result.sin_len = sizeof(result); - result.sin_port = htons(input.portno); //needs no conversion - result.sin_addr.s_addr = htonl((u32(input.ip[0]) << 24) - | (u32(input.ip[1]) << 16) - | (u32(input.ip[2]) << 8) - | (u32(input.ip[3]) << 0)); - return result; -} -#endif - -Network::SockAddrIn TranslateToSockAddrIn(sockaddr_in input) { - Network::SockAddrIn result{}; - result.len = 16; - result.family = u8(TranslateDomainFromNative(input.sin_family)); - result.portno = input.sin_port; //needs no conversion - result.ip = TranslateIPv4(input.sin_addr); - result.zeroes = {}; - return result; -} - static s16 TranslatePollEvents(Network::PollEvents events) noexcept { s16 result = 0; const auto translate = [&result, &events](Network::PollEvents guest, s16 host) { @@ -784,6 +735,55 @@ static Network::PollEvents TranslatePollRevents(s16 revents) { } // Anonymous namespace +#ifdef _WIN32 +sockaddr_in TranslateFromSockAddrIn(Network::SockAddrIn input) { + sockaddr_in result{}; +#ifdef __unix__ + result.sin_len = sizeof(result); +#endif + result.sin_family = AF_INET; + switch (Domain(input.family)) { + case Domain::INET: + result.sin_family = AF_INET; + break; + default: + UNIMPLEMENTED_MSG("Unhandled sockaddr family={}", input.family); + break; + } + + result.sin_port = input.portno; //no need to translate + + auto& ip = result.sin_addr.S_un.S_un_b; + ip.s_b1 = input.ip[0]; + ip.s_b2 = input.ip[1]; + ip.s_b3 = input.ip[2]; + ip.s_b4 = input.ip[3]; + return result; +} +#else +sockaddr_in TranslateFromSockAddrIn(Network::SockAddrIn input) { + sockaddr_in result{}; + result.sin_family = sa_family_t(TranslateDomainToNative(Domain(input.family))); + //result.sin_len = sizeof(result); + result.sin_port = htons(input.portno); //needs no conversion + result.sin_addr.s_addr = htonl((u32(input.ip[0]) << 24) + | (u32(input.ip[1]) << 16) + | (u32(input.ip[2]) << 8) + | (u32(input.ip[3]) << 0)); + return result; +} +#endif + +Network::SockAddrIn TranslateToSockAddrIn(sockaddr_in input) { + Network::SockAddrIn result{}; + result.len = 16; + result.family = u8(TranslateDomainFromNative(input.sin_family)); + result.portno = input.sin_port; //needs no conversion + result.ip = TranslateIPv4(input.sin_addr); + result.zeroes = {}; + return result; +} + NetworkInstance::NetworkInstance() { Initialize(); } @@ -1163,7 +1163,7 @@ Errno Socket::Shutdown(ShutdownHow how) { return GetAndLogLastError(); } -static s32 TranslateMsgOptToNative(s32 flags) { +s32 TranslateMsgOptToNative(s32 flags) { s32 r = 0; #ifdef MSG_OOB if (0 != (flags & s32(MsgOpt::OOB))) r |= MSG_OOB; diff --git a/src/core/internal_network/network.h b/src/core/internal_network/network.h index 5ed9b9bbd7..5c3641f18b 100644 --- a/src/core/internal_network/network.h +++ b/src/core/internal_network/network.h @@ -43,6 +43,10 @@ public: ~NetworkInstance(); }; +sockaddr_in TranslateFromSockAddrIn(Network::SockAddrIn input); +Network::SockAddrIn TranslateToSockAddrIn(sockaddr_in input); +s32 TranslateMsgOptToNative(s32 flags); + void CancelPendingSocketOperations(); void RestartSocketOperations(); diff --git a/src/core/internal_network/socket_icmp.cpp b/src/core/internal_network/socket_icmp.cpp index 3985596c04..724625cfae 100644 --- a/src/core/internal_network/socket_icmp.cpp +++ b/src/core/internal_network/socket_icmp.cpp @@ -91,12 +91,21 @@ std::pair IcmpSocket::RecvFrom(int flags, std::span message, Net LOG_DEBUG(Network, "(stubbed) called"); ASSERT(flags == 0); ASSERT(message.size() < std::size_t((std::numeric_limits::max)())); - if (!data.empty()) { - auto const n = (std::max)(data.size(), message.size()); - std::copy(data.begin(), data.begin() + n, message.begin()); - return {n, Errno::SUCCESS}; - } - return {-1, Errno::TIMEDOUT}; + std::vector data; + data.push_back(8); + data.push_back(0); + data.push_back(0); //checksum (placeholder 0) + data.push_back(0); + data.push_back(message[4]); //ident + data.push_back(message[5]); + data.push_back(message[6]); //seq + data.push_back(message[7]); + auto const csum = ComputeChecksum(std::span{data.begin(), data.end()}); + data[2] = u8(csum >> 8); //hi + data[3] = u8(csum); //lo + auto const n = (std::max)(data.size(), message.size()); + std::copy(data.begin(), data.begin() + n, message.begin()); + return {n, Errno::SUCCESS}; } std::pair IcmpSocket::Send(std::span message, int flags) { @@ -106,27 +115,15 @@ std::pair IcmpSocket::Send(std::span message, int flags) { std::pair IcmpSocket::SendTo(u32 flags, std::span message, const Network::SockAddrIn* addr) { LOG_DEBUG(Network, "(stubbed) called"); + ASSERT(message.size() < size_t((std::numeric_limits::max)())); // 0 -> 8 (IPv4), 128 (IPv6) // 1 -> 0 // 2..4 -> checksum // 4..6 -> ident // 6..8 -> seq - if (message.size() >= 8) { - ASSERT(message[0] == 0); - auto const csum_pos = data.size(); - data.push_back(8); - data.push_back(0); - data.push_back(0); //checksum (placeholder 0) - data.push_back(0); - data.push_back(message[4]); //ident - data.push_back(message[5]); - data.push_back(message[6]); //seq - data.push_back(message[7]); - auto const csum = ComputeChecksum(std::span{data.begin() + csum_pos, data.end()}); - data[csum_pos + 2] = u8(csum >> 8); //hi - data[csum_pos + 3] = u8(csum); //lo - } - return {s32(message.size()), Errno::SUCCESS}; + if (!message.empty()) + return {s32(message.size()), Errno::SUCCESS}; + return {s32(0), Errno::NETDOWN}; } Errno IcmpSocket::Close() { diff --git a/src/core/internal_network/socket_icmp.h b/src/core/internal_network/socket_icmp.h index 1c8c00d9dd..3126e718b3 100644 --- a/src/core/internal_network/socket_icmp.h +++ b/src/core/internal_network/socket_icmp.h @@ -30,8 +30,6 @@ public: bool IsOpened() const override; void HandleProxyPacket(const ProxyPacket& packet) override; Errno SetNonBlock(bool enable) override; - - std::vector data; }; } // namespace Network