From 0dcbd7d5495b6593261b55d70c983399ce2f313d Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 5 Jan 2025 10:31:53 +0200 Subject: [PATCH 01/25] restarted implementation - draft work --- src/core/libraries/network/net.cpp | 21 +++++++++++++-------- src/core/libraries/network/net.h | 9 +++++---- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 161fc521476..7322583e4e2 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -550,12 +550,12 @@ int PS4_SYSV_ABI sceNetEpollControl() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetEpollCreate() { +int PS4_SYSV_ABI sceNetEpollCreate(const char* name, int flags) { LOG_ERROR(Lib_Net, "(STUBBED) called"); return ORBIS_OK; } -int PS4_SYSV_ABI sceNetEpollDestroy() { +int PS4_SYSV_ABI sceNetEpollDestroy(int eid) { LOG_ERROR(Lib_Net, "(STUBBED) called"); return ORBIS_OK; } @@ -870,9 +870,9 @@ int PS4_SYSV_ABI sceNetResolverConnectDestroy() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetResolverCreate() { - LOG_ERROR(Lib_Net, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI sceNetResolverCreate(const char* name, int memid, int flags) { + LOG_ERROR(Lib_Net, "(DUMMY) name = {} memid ={} flags={}", std::string(name), memid, flags); + return 100; // return a fake resolver id } int PS4_SYSV_ABI sceNetResolverDestroy() { @@ -885,8 +885,12 @@ int PS4_SYSV_ABI sceNetResolverGetError() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetResolverStartAton() { - LOG_ERROR(Lib_Net, "(STUBBED) called"); +int PS4_SYSV_ABI sceNetResolverStartAton(int rid, const u32* addr, char* hostname, int hostname_len, + int timeout, int retry, int flags) { + LOG_ERROR(Lib_Net, "rid = {} , hostname_len ={} timeout={} retry={} flags={}", rid, + hostname_len, timeout, retry, flags); + struct hostent* resolved = gethostbyaddr((const char*)addr, hostname_len, AF_INET); + strcpy(hostname, resolved->h_name); return ORBIS_OK; } @@ -1041,7 +1045,8 @@ int PS4_SYSV_ABI sceNetShutdown() { } int PS4_SYSV_ABI sceNetSocket(const char* name, int family, int type, int protocol) { - LOG_ERROR(Lib_Net, "(STUBBED) called"); + LOG_ERROR(Lib_Net, "(STUBBED) name = {} family = {} type = {} protocol = {}", std::string(name), + family, type, protocol); return ORBIS_OK; } diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index beef38b5619..b38c5193616 100644 --- a/src/core/libraries/network/net.h +++ b/src/core/libraries/network/net.h @@ -133,8 +133,8 @@ int PS4_SYSV_ABI sceNetDuplicateIpStart(); int PS4_SYSV_ABI sceNetDuplicateIpStop(); int PS4_SYSV_ABI sceNetEpollAbort(); int PS4_SYSV_ABI sceNetEpollControl(); -int PS4_SYSV_ABI sceNetEpollCreate(); -int PS4_SYSV_ABI sceNetEpollDestroy(); +int PS4_SYSV_ABI sceNetEpollCreate(const char* name, int flags); +int PS4_SYSV_ABI sceNetEpollDestroy(int eid); int PS4_SYSV_ABI sceNetEpollWait(); int* PS4_SYSV_ABI sceNetErrnoLoc(); int PS4_SYSV_ABI sceNetEtherNtostr(); @@ -196,10 +196,11 @@ int PS4_SYSV_ABI sceNetResolverConnect(); int PS4_SYSV_ABI sceNetResolverConnectAbort(); int PS4_SYSV_ABI sceNetResolverConnectCreate(); int PS4_SYSV_ABI sceNetResolverConnectDestroy(); -int PS4_SYSV_ABI sceNetResolverCreate(); +int PS4_SYSV_ABI sceNetResolverCreate(const char* name, int memid, int flags); int PS4_SYSV_ABI sceNetResolverDestroy(); int PS4_SYSV_ABI sceNetResolverGetError(); -int PS4_SYSV_ABI sceNetResolverStartAton(); +int PS4_SYSV_ABI sceNetResolverStartAton(int rid, const u32* addr, char* hostname, int hostname_len, + int timeout, int retry, int flags); int PS4_SYSV_ABI sceNetResolverStartAton6(); int PS4_SYSV_ABI sceNetResolverStartNtoa(); int PS4_SYSV_ABI sceNetResolverStartNtoa6(); From 9bc8c099c42f3094b3f36120b77c780764a42787 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 5 Jan 2025 11:18:07 +0200 Subject: [PATCH 02/25] abstract socket implementation (initial) --- CMakeLists.txt | 2 + src/core/libraries/network/net.cpp | 25 +++++++-- src/core/libraries/network/net.h | 19 ++++++- src/core/libraries/network/posix_sockets.cpp | 0 src/core/libraries/network/sockets.h | 56 ++++++++++++++++++++ src/emulator.cpp | 7 +++ 6 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 src/core/libraries/network/posix_sockets.cpp create mode 100644 src/core/libraries/network/sockets.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c1ec7b7b951..3ef14ddad16 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -310,6 +310,8 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/ssl.h src/core/libraries/network/ssl2.cpp src/core/libraries/network/ssl2.h + src/core/libraries/network/posix_sockets.cpp + src/core/libraries/network/sockets.h ) set(AVPLAYER_LIB src/core/libraries/avplayer/avplayer_common.cpp diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 7322583e4e2..557b8fdb4dd 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -12,9 +12,11 @@ #include "common/assert.h" #include "common/logging/log.h" +#include "common/singleton.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/network/net.h" +#include "sockets.h" namespace Libraries::Net { @@ -1044,10 +1046,27 @@ int PS4_SYSV_ABI sceNetShutdown() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetSocket(const char* name, int family, int type, int protocol) { - LOG_ERROR(Lib_Net, "(STUBBED) name = {} family = {} type = {} protocol = {}", std::string(name), +OrbisNetId PS4_SYSV_ABI sceNetSocket(const char* name, int family, int type, int protocol) { + LOG_ERROR(Lib_Net, "name = {} family = {} type = {} protocol = {}", std::string(name), family, type, protocol); - return ORBIS_OK; + SocketPtr sock; + switch (type) { + case ORBIS_NET_SOCK_STREAM: + case ORBIS_NET_SOCK_DGRAM: + case ORBIS_NET_SOCK_RAW: + sock = std::make_shared(family, type, protocol); + break; + case ORBIS_NET_SOCK_DGRAM_P2P: + case ORBIS_NET_SOCK_STREAM_P2P: + UNREACHABLE_MSG("we don't support P2P"); + break; + default: + UNREACHABLE_MSG("Unknown type {}", type); + } + auto* netcall = Common::Singleton::Instance(); + auto id = ++netcall->next_sock_id; + netcall->socks.emplace(id, sock); + return id; } int PS4_SYSV_ABI sceNetSocketAbort() { diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index b38c5193616..93bb3c087b2 100644 --- a/src/core/libraries/network/net.h +++ b/src/core/libraries/network/net.h @@ -21,6 +21,23 @@ namespace Libraries::Net { using OrbisNetId = s32; +enum OrbisNetProtocol : u32 { + ORBIS_NET_IPPROTO_IP = 0, + ORBIS_NET_IPPROTO_ICMP = 1, + ORBIS_NET_IPPROTO_IGMP = 2, + ORBIS_NET_IPPROTO_TCP = 6, + ORBIS_NET_IPPROTO_UDP = 17, + ORBIS_NET_SOL_SOCKET = 0xFFFF +}; + +enum OrbisNetSocketType : u32 { + ORBIS_NET_SOCK_STREAM = 1, + ORBIS_NET_SOCK_DGRAM = 2, + ORBIS_NET_SOCK_RAW = 3, + ORBIS_NET_SOCK_DGRAM_P2P = 6, + ORBIS_NET_SOCK_STREAM_P2P = 10 +}; + struct OrbisNetSockaddr { u8 sa_len; u8 sa_family; @@ -231,7 +248,7 @@ int PS4_SYSV_ABI sceNetShowRoute6WithMemory(); int PS4_SYSV_ABI sceNetShowRouteForBuffer(); int PS4_SYSV_ABI sceNetShowRouteWithMemory(); int PS4_SYSV_ABI sceNetShutdown(); -int PS4_SYSV_ABI sceNetSocket(const char* name, int family, int type, int protocol); +OrbisNetId PS4_SYSV_ABI sceNetSocket(const char* name, int family, int type, int protocol); int PS4_SYSV_ABI sceNetSocketAbort(); int PS4_SYSV_ABI sceNetSocketClose(); int PS4_SYSV_ABI sceNetSyncCreate(); diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h new file mode 100644 index 00000000000..6ef2da3e7dc --- /dev/null +++ b/src/core/libraries/network/sockets.h @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#ifdef _WIN32 +#define _WINSOCK_DEPRECATED_NO_WARNINGS +#include +#include +#include +typedef SOCKET net_socket; +typedef int socklen_t; +#else +#include +#include +#include +#include +#include +#include +#include +#include +typedef int net_socket; +#endif +#include +#include + +namespace Libraries::Net { + +struct Socket; + +typedef std::shared_ptr SocketPtr; + +struct Socket { + explicit Socket(int domain, int type, int protocol) {} + + virtual ~Socket() = default; +}; + +struct PosixSocket : public Socket { + net_socket sock; + explicit PosixSocket(int domain, int type, int protocol) + : Socket(domain, type, protocol), sock(socket(domain, type, protocol)) {} +}; + +class NetInternal { +public: + explicit NetInternal() = default; + ~NetInternal() = default; + +public: + std::mutex m_mutex; + typedef std::map NetSockets; + NetSockets socks; + int next_sock_id = 0; +}; +} // namespace Libraries::Net \ No newline at end of file diff --git a/src/emulator.cpp b/src/emulator.cpp index cd981add2ae..a2926131e18 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -16,6 +16,9 @@ #ifdef ENABLE_DISCORD_RPC #include "common/discord_rpc_handler.h" #endif +#ifdef _WIN32 +#include +#endif #include "common/elf_info.h" #include "common/ntapi.h" #include "common/path_util.h" @@ -48,6 +51,10 @@ Emulator::Emulator() { #ifdef _WIN32 Common::NtApi::Initialize(); SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS); + // need to init this in order for winsock2 to work + WORD versionWanted = MAKEWORD(2, 2); + WSADATA wsaData; + WSAStartup(versionWanted, &wsaData); #endif // Start logger. From 9462467d57cd5dbba887e3fd72c233874354bc13 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 5 Jan 2025 12:06:17 +0200 Subject: [PATCH 03/25] clang fix --- src/core/libraries/network/net.cpp | 9 +++--- src/core/libraries/network/net.h | 42 +++++++++++++++++++++++++- src/core/libraries/network/net_obj.cpp | 0 src/core/libraries/network/net_obj.h | 0 4 files changed, 46 insertions(+), 5 deletions(-) delete mode 100644 src/core/libraries/network/net_obj.cpp delete mode 100644 src/core/libraries/network/net_obj.h diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 557b8fdb4dd..3137268c07d 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -956,8 +956,9 @@ int PS4_SYSV_ABI sceNetSetDnsInfoToKernel() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetSetsockopt() { - LOG_ERROR(Lib_Net, "(STUBBED) called"); +int PS4_SYSV_ABI sceNetSetsockopt(OrbisNetId s, int level, int optname, const void* optval, + u32 optlen) { + LOG_ERROR(Lib_Net, "s = {} level = {} optname = {} optlen = {}", s, level, optname, optlen); return ORBIS_OK; } @@ -1047,8 +1048,8 @@ int PS4_SYSV_ABI sceNetShutdown() { } OrbisNetId PS4_SYSV_ABI sceNetSocket(const char* name, int family, int type, int protocol) { - LOG_ERROR(Lib_Net, "name = {} family = {} type = {} protocol = {}", std::string(name), - family, type, protocol); + LOG_ERROR(Lib_Net, "name = {} family = {} type = {} protocol = {}", std::string(name), family, + type, protocol); SocketPtr sock; switch (type) { case ORBIS_NET_SOCK_STREAM: diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index 93bb3c087b2..6df45a8658a 100644 --- a/src/core/libraries/network/net.h +++ b/src/core/libraries/network/net.h @@ -38,6 +38,45 @@ enum OrbisNetSocketType : u32 { ORBIS_NET_SOCK_STREAM_P2P = 10 }; +enum OrbisNetSocketOption : u32 { + /* IP */ + ORBIS_NET_IP_HDRINCL = 2, + ORBIS_NET_IP_TOS = 3, + ORBIS_NET_IP_TTL = 4, + ORBIS_NET_IP_MULTICAST_IF = 9, + ORBIS_NET_IP_MULTICAST_TTL = 10, + ORBIS_NET_IP_MULTICAST_LOOP = 11, + ORBIS_NET_IP_ADD_MEMBERSHIP = 12, + ORBIS_NET_IP_DROP_MEMBERSHIP = 13, + ORBIS_NET_IP_TTLCHK = 23, + ORBIS_NET_IP_MAXTTL = 24, + /* TCP */ + ORBIS_NET_TCP_NODELAY = 1, + ORBIS_NET_TCP_MAXSEG = 2, + ORBIS_NET_TCP_MSS_TO_ADVERTISE = 3, + /* SOCKET */ + ORBIS_NET_SO_REUSEADDR = 0x00000004, + ORBIS_NET_SO_KEEPALIVE = 0x00000008, + ORBIS_NET_SO_BROADCAST = 0x00000020, + ORBIS_NET_SO_LINGER = 0x00000080, + ORBIS_NET_SO_OOBINLINE = 0x00000100, + ORBIS_NET_SO_REUSEPORT = 0x00000200, + ORBIS_NET_SO_ONESBCAST = 0x00000800, + ORBIS_NET_SO_USECRYPTO = 0x00001000, + ORBIS_NET_SO_USESIGNATURE = 0x00002000, + ORBIS_NET_SO_SNDBUF = 0x1001, + ORBIS_NET_SO_RCVBUF = 0x1002, + ORBIS_NET_SO_SNDLOWAT = 0x1003, + ORBIS_NET_SO_RCVLOWAT = 0x1004, + ORBIS_NET_SO_SNDTIMEO = 0x1005, + ORBIS_NET_SO_RCVTIMEO = 0x1006, + ORBIS_NET_SO_ERROR = 0x1007, + ORBIS_NET_SO_TYPE = 0x1008, + ORBIS_NET_SO_NBIO = 0x1100, + ORBIS_NET_SO_TPPOLICY = 0x1101, + ORBIS_NET_SO_NAME = 0x1102 +}; + struct OrbisNetSockaddr { u8 sa_len; u8 sa_family; @@ -230,7 +269,8 @@ int PS4_SYSV_ABI sceNetSetDns6Info(); int PS4_SYSV_ABI sceNetSetDns6InfoToKernel(); int PS4_SYSV_ABI sceNetSetDnsInfo(); int PS4_SYSV_ABI sceNetSetDnsInfoToKernel(); -int PS4_SYSV_ABI sceNetSetsockopt(); +int PS4_SYSV_ABI sceNetSetsockopt(OrbisNetId s, int level, int optname, const void* optval, + u32 optlen); int PS4_SYSV_ABI sceNetShowIfconfig(); int PS4_SYSV_ABI sceNetShowIfconfigForBuffer(); int PS4_SYSV_ABI sceNetShowIfconfigWithMemory(); diff --git a/src/core/libraries/network/net_obj.cpp b/src/core/libraries/network/net_obj.cpp deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/core/libraries/network/net_obj.h b/src/core/libraries/network/net_obj.h deleted file mode 100644 index e69de29bb2d..00000000000 From d47066574fbc9230cac08f0fd7dfd108daaf6b0d Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 5 Jan 2025 16:57:44 +0200 Subject: [PATCH 04/25] intial sceNetSetsockopt --- CMakeLists.txt | 1 + src/core/libraries/network/net.cpp | 10 +++++- src/core/libraries/network/net_error.h | 11 +++++++ src/core/libraries/network/posix_sockets.cpp | 33 ++++++++++++++++++++ src/core/libraries/network/sockets.h | 12 ++++++- 5 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/core/libraries/network/net_error.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ef14ddad16..b1521b5ff48 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -312,6 +312,7 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/ssl2.h src/core/libraries/network/posix_sockets.cpp src/core/libraries/network/sockets.h + src/core/libraries/network/net_error.h ) set(AVPLAYER_LIB src/core/libraries/avplayer/avplayer_common.cpp diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 3137268c07d..a83f6ef8afe 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -16,6 +16,7 @@ #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/network/net.h" +#include "net_error.h" #include "sockets.h" namespace Libraries::Net { @@ -959,7 +960,14 @@ int PS4_SYSV_ABI sceNetSetDnsInfoToKernel() { int PS4_SYSV_ABI sceNetSetsockopt(OrbisNetId s, int level, int optname, const void* optval, u32 optlen) { LOG_ERROR(Lib_Net, "s = {} level = {} optname = {} optlen = {}", s, level, optname, optlen); - return ORBIS_OK; + auto* netcall = Common::Singleton::Instance(); + auto sock = netcall->FindSocket(s); + if (!sock) { + net_errno = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); + return ORBIS_NET_ERROR_EBADF; + } + return sock->SetSocketOptions(level, optname, optval, optlen); } int PS4_SYSV_ABI sceNetShowIfconfig() { diff --git a/src/core/libraries/network/net_error.h b/src/core/libraries/network/net_error.h new file mode 100644 index 00000000000..74059047231 --- /dev/null +++ b/src/core/libraries/network/net_error.h @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// net errno codes + +constexpr int ORBIS_NET_EBADF = 9; + +// error codes +constexpr int ORBIS_NET_ERROR_EBADF = 0x80410109; diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index e69de29bb2d..36a6aba5c7e 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include "net.h" +#include "sockets.h" + +namespace Libraries::Net { + +static int ConvertLevels(int level) { + switch (level) { + case ORBIS_NET_SOL_SOCKET: + return SOL_SOCKET; + case ORBIS_NET_IPPROTO_IP: + return IPPROTO_IP; + case ORBIS_NET_IPPROTO_TCP: + return IPPROTO_TCP; + } + return -1; +} + +int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) { + level = ConvertLevels(level); + if (level == SOL_SOCKET) { + switch (optname) { + case ORBIS_NET_SO_REUSEADDR: + return setsockopt(sock, level, SO_REUSEADDR, (const char*)optval, optlen); + } + } + UNREACHABLE_MSG("Unknown level ={} optname ={}", level, optname); + return 0; +} +} // namespace Libraries::Net \ No newline at end of file diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index 6ef2da3e7dc..1369451a850 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -32,20 +32,30 @@ typedef std::shared_ptr SocketPtr; struct Socket { explicit Socket(int domain, int type, int protocol) {} - virtual ~Socket() = default; + virtual int SetSocketOptions(int level, int optname, const void* optval, + unsigned int optlen) = 0; }; struct PosixSocket : public Socket { net_socket sock; explicit PosixSocket(int domain, int type, int protocol) : Socket(domain, type, protocol), sock(socket(domain, type, protocol)) {} + int SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) override; }; class NetInternal { public: explicit NetInternal() = default; ~NetInternal() = default; + SocketPtr FindSocket(int sockid) { + std::scoped_lock lock{m_mutex}; + const auto it = socks.find(sockid); + if (it != socks.end()) { + return it->second; + } + return nullptr; + } public: std::mutex m_mutex; From b0b3bc9bc9b12a4575ef750670e5a4eaddef1006 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 5 Jan 2025 17:31:11 +0200 Subject: [PATCH 05/25] added sceNetBind,sceNetListen --- src/core/libraries/network/net.cpp | 22 +++++++++++--- src/core/libraries/network/net.h | 11 ++++++- src/core/libraries/network/posix_sockets.cpp | 32 +++++++++++++++++++- src/core/libraries/network/sockets.h | 7 ++++- 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index a83f6ef8afe..8892252db51 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -124,8 +124,14 @@ int PS4_SYSV_ABI sceNetBandwidthControlSetPolicy() { } int PS4_SYSV_ABI sceNetBind(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addrlen) { - LOG_ERROR(Lib_Net, "(STUBBED) called"); - return ORBIS_OK; + auto* netcall = Common::Singleton::Instance(); + auto sock = netcall->FindSocket(s); + if (!sock) { + net_errno = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); + return ORBIS_NET_ERROR_EBADF; + } + return sock->Bind(addr, addrlen); } int PS4_SYSV_ABI sceNetClearDnsCache() { @@ -784,9 +790,15 @@ int PS4_SYSV_ABI sceNetIoctl() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetListen() { - LOG_ERROR(Lib_Net, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI sceNetListen(OrbisNetId s, int backlog) { + auto* netcall = Common::Singleton::Instance(); + auto sock = netcall->FindSocket(s); + if (!sock) { + net_errno = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); + return ORBIS_NET_ERROR_EBADF; + } + return sock->Listen(backlog); } int PS4_SYSV_ABI sceNetMemoryAllocate() { diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index 6df45a8658a..3dfe6b32888 100644 --- a/src/core/libraries/network/net.h +++ b/src/core/libraries/network/net.h @@ -83,6 +83,15 @@ struct OrbisNetSockaddr { char sa_data[14]; }; +struct OrbisNetSockaddrIn { + u8 sin_len; + u8 sin_family; + u16 sin_port; + u32 sin_addr; + u16 sin_vport; + char sin_zero[6]; +}; + int PS4_SYSV_ABI in6addr_any(); int PS4_SYSV_ABI in6addr_loopback(); int PS4_SYSV_ABI sce_net_dummy(); @@ -233,7 +242,7 @@ int PS4_SYSV_ABI sceNetInfoDumpStop(); int PS4_SYSV_ABI sceNetInit(); int PS4_SYSV_ABI sceNetInitParam(); int PS4_SYSV_ABI sceNetIoctl(); -int PS4_SYSV_ABI sceNetListen(); +int PS4_SYSV_ABI sceNetListen(OrbisNetId s, int backlog); int PS4_SYSV_ABI sceNetMemoryAllocate(); int PS4_SYSV_ABI sceNetMemoryFree(); u32 PS4_SYSV_ABI sceNetNtohl(u32 net32); diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index 36a6aba5c7e..06c6a255c9f 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -19,15 +19,45 @@ static int ConvertLevels(int level) { return -1; } +static int ConvertReturnErrorCode(int retval) { + if (retval < 0) { + UNREACHABLE_MSG("Function returned an errorCode = {}", retval); + } + // if it is 0 or positive return it as it is + return retval; +} + +static void convertOrbisNetSockaddrToPosix(const OrbisNetSockaddr* src, sockaddr* dst) { + if (src == nullptr || dst == nullptr) + return; + memset(dst, 0, sizeof(sockaddr)); + const OrbisNetSockaddrIn* src_in = (const OrbisNetSockaddrIn*)src; + sockaddr_in* dst_in = (sockaddr_in*)dst; + dst_in->sin_family = src_in->sin_family; + dst_in->sin_port = src_in->sin_port; + memcpy(&dst_in->sin_addr, &src_in->sin_addr, 4); +} + int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) { level = ConvertLevels(level); if (level == SOL_SOCKET) { switch (optname) { case ORBIS_NET_SO_REUSEADDR: - return setsockopt(sock, level, SO_REUSEADDR, (const char*)optval, optlen); + return ConvertReturnErrorCode( + setsockopt(sock, level, SO_REUSEADDR, (const char*)optval, optlen)); } } UNREACHABLE_MSG("Unknown level ={} optname ={}", level, optname); return 0; } +int PosixSocket::Bind(const OrbisNetSockaddr* addr, unsigned int addrlen) { + sockaddr addr2; + convertOrbisNetSockaddrToPosix(addr, &addr2); + return ConvertReturnErrorCode(::bind(sock, &addr2, sizeof(sockaddr_in))); +} + +int PosixSocket::Listen(int backlog) { + return ConvertReturnErrorCode(::listen(sock, backlog)); +} + } // namespace Libraries::Net \ No newline at end of file diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index 1369451a850..de2b61e85a4 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -22,6 +22,7 @@ typedef int socklen_t; typedef int net_socket; #endif #include +#include #include namespace Libraries::Net { @@ -35,6 +36,8 @@ struct Socket { virtual ~Socket() = default; virtual int SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) = 0; + virtual int Bind(const OrbisNetSockaddr* addr, unsigned int addrlen) = 0; + virtual int Listen(int backlog) = 0; }; struct PosixSocket : public Socket { @@ -42,6 +45,8 @@ struct PosixSocket : public Socket { explicit PosixSocket(int domain, int type, int protocol) : Socket(domain, type, protocol), sock(socket(domain, type, protocol)) {} int SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) override; + int Bind(const OrbisNetSockaddr* addr, unsigned int addrlen) override; + int Listen(int backlog) override; }; class NetInternal { @@ -54,7 +59,7 @@ class NetInternal { if (it != socks.end()) { return it->second; } - return nullptr; + return 0; } public: From 180da07008bf206532f557e7eb02b0cdc2735550 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 5 Jan 2025 19:11:25 +0200 Subject: [PATCH 06/25] added ORBIS_NET_CTL_INFO_MTU --- src/core/libraries/network/netctl.cpp | 4 +++- src/core/libraries/network/netctl.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/libraries/network/netctl.cpp b/src/core/libraries/network/netctl.cpp index 00d980663ae..ed9adf6fa06 100644 --- a/src/core/libraries/network/netctl.cpp +++ b/src/core/libraries/network/netctl.cpp @@ -181,8 +181,10 @@ int PS4_SYSV_ABI sceNetCtlGetInfo(int code, OrbisNetCtlInfo* info) { } } } + } break; + case ORBIS_NET_CTL_INFO_MTU: + info->mtu = 1500; // default value break; - } default: LOG_ERROR(Lib_NetCtl, "{} unsupported code", code); } diff --git a/src/core/libraries/network/netctl.h b/src/core/libraries/network/netctl.h index 4992fffa9b6..7c9ec594a32 100644 --- a/src/core/libraries/network/netctl.h +++ b/src/core/libraries/network/netctl.h @@ -49,6 +49,7 @@ union OrbisNetCtlInfo { // GetInfo codes constexpr int ORBIS_NET_CTL_INFO_DEVICE = 1; +constexpr int ORBIS_NET_CTL_INFO_MTU = 3; constexpr int ORBIS_NET_CTL_INFO_LINK = 4; constexpr int ORBIS_NET_CTL_INFO_IP_ADDRESS = 14; From acf43dda1a31a67ce89d8c2b3460b2cea467e70f Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 6 Jan 2025 00:30:20 +0200 Subject: [PATCH 07/25] added SO_BROADCAST (optname =32) in SetSocketOptions --- src/core/libraries/network/posix_sockets.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index 06c6a255c9f..f08b483c5e1 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -45,6 +45,9 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, un case ORBIS_NET_SO_REUSEADDR: return ConvertReturnErrorCode( setsockopt(sock, level, SO_REUSEADDR, (const char*)optval, optlen)); + case ORBIS_NET_SO_BROADCAST: + return ConvertReturnErrorCode( + setsockopt(sock, level, SO_BROADCAST, (const char*)optval, optlen)); } } UNREACHABLE_MSG("Unknown level ={} optname ={}", level, optname); From be9955be07b9ed05bf77b7e7083b4cc9d07748e8 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 6 Jan 2025 00:52:02 +0200 Subject: [PATCH 08/25] draft epoll work --- CMakeLists.txt | 2 + src/core/libraries/network/epoll.cpp | 20 +++++++ src/core/libraries/network/epoll.h | 81 ++++++++++++++++++++++++++++ src/core/libraries/network/net.cpp | 9 +++- 4 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 src/core/libraries/network/epoll.cpp create mode 100644 src/core/libraries/network/epoll.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b1521b5ff48..bcdf210891a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -313,6 +313,8 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/posix_sockets.cpp src/core/libraries/network/sockets.h src/core/libraries/network/net_error.h + src/core/libraries/network/epoll.cpp + src/core/libraries/network/epoll.h ) set(AVPLAYER_LIB src/core/libraries/avplayer/avplayer_common.cpp diff --git a/src/core/libraries/network/epoll.cpp b/src/core/libraries/network/epoll.cpp new file mode 100644 index 00000000000..061ba48aed1 --- /dev/null +++ b/src/core/libraries/network/epoll.cpp @@ -0,0 +1,20 @@ +#include "epoll.h" + +namespace Libraries::Net { +int NetEpoll::Add(int id, net_socket sock, OrbisNetEpollEvent* ev) { + return 0; +} + +int NetEpoll::Del(int id, net_socket sock, OrbisNetEpollEvent* ev) { + return 0; +} + +int NetEpoll::Mod(int id, net_socket sock, OrbisNetEpollEvent* ev) { + return 0; +} + +int NetEpoll::Wait(OrbisNetEpollEvent* events, int maxevents, int timeout) { + return 0; +} + +} // namespace Libraries::Net \ No newline at end of file diff --git a/src/core/libraries/network/epoll.h b/src/core/libraries/network/epoll.h new file mode 100644 index 00000000000..902df96bf28 --- /dev/null +++ b/src/core/libraries/network/epoll.h @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/types.h" +#ifdef _WIN32 +#define _WINSOCK_DEPRECATED_NO_WARNINGS +#include +#include +#include +typedef SOCKET net_socket; +typedef int socklen_t; +#else +#include +#include +#include +#include +#include +#include +#include +#include +typedef int net_socket; +#endif +#include +#include +#include + +namespace Libraries::Net { + +union OrbisNetEpollData { + void* ptr; + u32 _u32; + int fd; + u64 _u64; +}; + +struct OrbisNetEpollEvent { + u32 events; + u32 reserved; + u32 ident; + OrbisNetEpollData data; +}; + +struct EpollSocket { + unsigned int events; + OrbisNetEpollData data; + net_socket sock; +}; + +struct NetEpoll { + std::map eventEntries; + + int Add(int id, net_socket sock, OrbisNetEpollEvent* ev); + int Del(int id, net_socket sock, OrbisNetEpollEvent* ev); + int Mod(int id, net_socket sock, OrbisNetEpollEvent* ev); + int Wait(OrbisNetEpollEvent* events, int maxevents, int timeout); +}; + +typedef std::shared_ptr EpollPtr; + +class NetEpollInternal { +public: + explicit NetEpollInternal() = default; + ~NetEpollInternal() = default; + EpollPtr FindSocket(int sockid) { + std::scoped_lock lock{m_mutex}; + const auto it = epolls.find(sockid); + if (it != epolls.end()) { + return it->second; + } + return 0; + } + +public: + std::mutex m_mutex; + typedef std::map NetEpolls; + NetEpolls epolls; + int next_epool_sock_id = 0; +}; +} // namespace Libraries::Net \ No newline at end of file diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 8892252db51..76bf89b5e32 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -16,6 +16,7 @@ #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/network/net.h" +#include "epoll.h" #include "net_error.h" #include "sockets.h" @@ -560,8 +561,12 @@ int PS4_SYSV_ABI sceNetEpollControl() { } int PS4_SYSV_ABI sceNetEpollCreate(const char* name, int flags) { - LOG_ERROR(Lib_Net, "(STUBBED) called"); - return ORBIS_OK; + LOG_ERROR(Lib_Net, "name = {} flags= {}", std::string(name), flags); + auto* net_epoll = Common::Singleton::Instance(); + auto epoll = std::make_shared(); + auto id = ++net_epoll->next_epool_sock_id; + net_epoll->epolls.emplace(id, epoll); + return id; } int PS4_SYSV_ABI sceNetEpollDestroy(int eid) { From fa9044cf7a8cabe965140abe642e396bb530388c Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 6 Jan 2025 00:53:22 +0200 Subject: [PATCH 09/25] reuse fix --- src/core/libraries/network/epoll.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/libraries/network/epoll.cpp b/src/core/libraries/network/epoll.cpp index 061ba48aed1..270c3bb491e 100644 --- a/src/core/libraries/network/epoll.cpp +++ b/src/core/libraries/network/epoll.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + #include "epoll.h" namespace Libraries::Net { From 7475cd706353f5f552acf0097de9d23e2092dab6 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Tue, 7 Jan 2025 16:40:53 +0200 Subject: [PATCH 10/25] correct socketoption struct and added ORBIS_NET_SO_SNDTIMEO --- src/core/libraries/network/net.h | 23 ++++++++++---------- src/core/libraries/network/net_error.h | 2 ++ src/core/libraries/network/posix_sockets.cpp | 3 +++ 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index 3dfe6b32888..eb1d0796a17 100644 --- a/src/core/libraries/network/net.h +++ b/src/core/libraries/network/net.h @@ -59,22 +59,23 @@ enum OrbisNetSocketOption : u32 { ORBIS_NET_SO_KEEPALIVE = 0x00000008, ORBIS_NET_SO_BROADCAST = 0x00000020, ORBIS_NET_SO_LINGER = 0x00000080, - ORBIS_NET_SO_OOBINLINE = 0x00000100, ORBIS_NET_SO_REUSEPORT = 0x00000200, - ORBIS_NET_SO_ONESBCAST = 0x00000800, - ORBIS_NET_SO_USECRYPTO = 0x00001000, - ORBIS_NET_SO_USESIGNATURE = 0x00002000, + ORBIS_NET_SO_ONESBCAST = 0x00010000, + ORBIS_NET_SO_USECRYPTO = 0x00020000, + ORBIS_NET_SO_USESIGNATURE = 0x00040000, ORBIS_NET_SO_SNDBUF = 0x1001, ORBIS_NET_SO_RCVBUF = 0x1002, - ORBIS_NET_SO_SNDLOWAT = 0x1003, - ORBIS_NET_SO_RCVLOWAT = 0x1004, - ORBIS_NET_SO_SNDTIMEO = 0x1005, - ORBIS_NET_SO_RCVTIMEO = 0x1006, ORBIS_NET_SO_ERROR = 0x1007, ORBIS_NET_SO_TYPE = 0x1008, - ORBIS_NET_SO_NBIO = 0x1100, - ORBIS_NET_SO_TPPOLICY = 0x1101, - ORBIS_NET_SO_NAME = 0x1102 + ORBIS_NET_SO_SNDTIMEO = 0x1105, + ORBIS_NET_SO_RCVTIMEO = 0x1106, + ORBIS_NET_SO_ERROR_EX = 0x1107, + ORBIS_NET_SO_ACCEPTTIMEO = 0x1108, + ORBIS_NET_SO_CONNECTTIMEO = 0x1109, + ORBIS_NET_SO_NBIO = 0x1200, + ORBIS_NET_SO_POLICY = 0x1201, + ORBIS_NET_SO_NAME = 0x1202, + ORBIS_NET_SO_PRIORITY = 0x1203 }; struct OrbisNetSockaddr { diff --git a/src/core/libraries/network/net_error.h b/src/core/libraries/network/net_error.h index 74059047231..a085d8aa57c 100644 --- a/src/core/libraries/network/net_error.h +++ b/src/core/libraries/network/net_error.h @@ -6,6 +6,8 @@ // net errno codes constexpr int ORBIS_NET_EBADF = 9; +constexpr int ORBIS_NET_EFAULT = 14; // error codes constexpr int ORBIS_NET_ERROR_EBADF = 0x80410109; +constexpr int ORBIS_NET_ERROR_EFAULT = 0x8041010e; diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index f08b483c5e1..bd8ab64063f 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -48,6 +48,9 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, un case ORBIS_NET_SO_BROADCAST: return ConvertReturnErrorCode( setsockopt(sock, level, SO_BROADCAST, (const char*)optval, optlen)); + case ORBIS_NET_SO_SNDTIMEO: + return ConvertReturnErrorCode( + setsockopt(sock, level, SO_SNDTIMEO, (const char*)optval, optlen)); } } UNREACHABLE_MSG("Unknown level ={} optname ={}", level, optname); From 2ae795b5846c9856f9098e4f08d4ee37b5c66bff Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 9 Jan 2025 17:42:46 +0200 Subject: [PATCH 11/25] Implemented sceNetEpollControl,sceNetEpollDestroy --- src/core/libraries/network/epoll.cpp | 14 ++++++++++++++ src/core/libraries/network/epoll.h | 12 +++++++++++- src/core/libraries/network/net_error.h | 7 ++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/core/libraries/network/epoll.cpp b/src/core/libraries/network/epoll.cpp index 270c3bb491e..da15cf37d8c 100644 --- a/src/core/libraries/network/epoll.cpp +++ b/src/core/libraries/network/epoll.cpp @@ -1,18 +1,32 @@ // SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include "epoll.h" +#include "net_error.h" namespace Libraries::Net { int NetEpoll::Add(int id, net_socket sock, OrbisNetEpollEvent* ev) { + if (!eventEntries.try_emplace(id, EpollSocket{ev->events, ev->data, sock}).second) { + return ORBIS_NET_ERROR_EEXIST; + } return 0; } int NetEpoll::Del(int id, net_socket sock, OrbisNetEpollEvent* ev) { + if (eventEntries.erase(id) == 0) { + return ORBIS_NET_ERROR_ENOENT; + } return 0; } int NetEpoll::Mod(int id, net_socket sock, OrbisNetEpollEvent* ev) { + auto it = eventEntries.find(id); + if (it == eventEntries.end()) { + return ORBIS_NET_ERROR_ENOENT; + } + it->second.events = ev->events; + it->second.data = ev->data; return 0; } diff --git a/src/core/libraries/network/epoll.h b/src/core/libraries/network/epoll.h index 902df96bf28..ec6b5c61da5 100644 --- a/src/core/libraries/network/epoll.h +++ b/src/core/libraries/network/epoll.h @@ -48,6 +48,12 @@ struct EpollSocket { net_socket sock; }; +enum SceNetEpollControlFlag : u32 { + ORBIS_NET_EPOLL_CTL_ADD = 1, + ORBIS_NET_EPOLL_CTL_MOD, + ORBIS_NET_EPOLL_CTL_DEL +}; + struct NetEpoll { std::map eventEntries; @@ -63,7 +69,7 @@ class NetEpollInternal { public: explicit NetEpollInternal() = default; ~NetEpollInternal() = default; - EpollPtr FindSocket(int sockid) { + EpollPtr FindEpoll(int sockid) { std::scoped_lock lock{m_mutex}; const auto it = epolls.find(sockid); if (it != epolls.end()) { @@ -71,6 +77,10 @@ class NetEpollInternal { } return 0; } + int EraseEpoll(int eid) { + std::scoped_lock lock{m_mutex}; + return epolls.erase(eid); + } public: std::mutex m_mutex; diff --git a/src/core/libraries/network/net_error.h b/src/core/libraries/network/net_error.h index a085d8aa57c..88e3cac55a8 100644 --- a/src/core/libraries/network/net_error.h +++ b/src/core/libraries/network/net_error.h @@ -4,10 +4,15 @@ #pragma once // net errno codes - +constexpr int ORBIS_NET_ENOENT = 2; constexpr int ORBIS_NET_EBADF = 9; constexpr int ORBIS_NET_EFAULT = 14; +constexpr int ORBIS_NET_EEXIST = 17; +constexpr int ORBIS_NET_EINVAL = 22; // error codes +constexpr int ORBIS_NET_ERROR_ENOENT = 0x80410102; constexpr int ORBIS_NET_ERROR_EBADF = 0x80410109; constexpr int ORBIS_NET_ERROR_EFAULT = 0x8041010e; +constexpr int ORBIS_NET_ERROR_EEXIST = 0x80410111; +constexpr int ORBIS_NET_ERROR_EINVAL = 0x80410116; From 73a2113c0107d64f67a9c82521320f2304ba6f69 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 9 Jan 2025 17:43:08 +0200 Subject: [PATCH 12/25] missed files --- src/core/libraries/network/net.cpp | 73 +++++++++++++++++++++++++++--- src/core/libraries/network/net.h | 4 +- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 76bf89b5e32..c5a4f900a04 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -16,7 +16,7 @@ #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/network/net.h" -#include "epoll.h" + #include "net_error.h" #include "sockets.h" @@ -555,13 +555,69 @@ int PS4_SYSV_ABI sceNetEpollAbort() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetEpollControl() { - LOG_ERROR(Lib_Net, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI sceNetEpollControl(OrbisNetId eid, int op, OrbisNetId id, + OrbisNetEpollEvent* event) { + auto* net_epoll = Common::Singleton::Instance(); + auto epoll = net_epoll->FindEpoll(eid); + if (!epoll) { + net_errno = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "epoll id is invalid = {}", eid); + return ORBIS_NET_ERROR_EBADF; + } + if (id == 100) { + UNREACHABLE_MSG("Hitted resolver id not supported"); + } + auto* socket_call = Common::Singleton::Instance(); + auto sock = socket_call->FindSocket(id); + if (!sock) { + net_errno = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "socket id is invalid = {}", id); + return ORBIS_NET_ERROR_EBADF; + } + auto posixSocket = std::dynamic_pointer_cast(sock); + if (!posixSocket) { + net_errno = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "Can't create posix socket"); + return ORBIS_NET_ERROR_EBADF; + } + + switch (op) { + case ORBIS_NET_EPOLL_CTL_ADD: { + int add = epoll->Add(id, posixSocket->sock, event); + if (add == ORBIS_NET_ERROR_EEXIST) { + net_errno = ORBIS_NET_EEXIST; + LOG_ERROR(Lib_Net, "epoll event already added"); + return ORBIS_NET_ERROR_EEXIST; + } + return ORBIS_OK; + } + case ORBIS_NET_EPOLL_CTL_DEL: { + int del = epoll->Del(id, posixSocket->sock, event); + if (del == ORBIS_NET_ERROR_ENOENT) { + net_errno = ORBIS_NET_ENOENT; + LOG_ERROR(Lib_Net, "no epoll event in wait state"); + return ORBIS_NET_ERROR_ENOENT; + } + return ORBIS_OK; + } + case ORBIS_NET_EPOLL_CTL_MOD: { + int mod = epoll->Mod(id, posixSocket->sock, event); + if (mod == ORBIS_NET_ERROR_ENOENT) { + net_errno = ORBIS_NET_ENOENT; + LOG_ERROR(Lib_Net, "no epoll event in wait state"); + return ORBIS_NET_ERROR_ENOENT; + } + return ORBIS_OK; + } + default: + net_errno = ORBIS_NET_EINVAL; + LOG_ERROR(Lib_Net, "Unknown operation = {}", op); + return ORBIS_NET_ERROR_EINVAL; + } } int PS4_SYSV_ABI sceNetEpollCreate(const char* name, int flags) { - LOG_ERROR(Lib_Net, "name = {} flags= {}", std::string(name), flags); + LOG_DEBUG(Lib_Net, "name = {} flags= {}", std::string(name), flags); auto* net_epoll = Common::Singleton::Instance(); auto epoll = std::make_shared(); auto id = ++net_epoll->next_epool_sock_id; @@ -570,7 +626,12 @@ int PS4_SYSV_ABI sceNetEpollCreate(const char* name, int flags) { } int PS4_SYSV_ABI sceNetEpollDestroy(int eid) { - LOG_ERROR(Lib_Net, "(STUBBED) called"); + auto* net_epoll = Common::Singleton::Instance(); + if (net_epoll->EraseEpoll(eid) == 0) { + net_errno = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "Error deleting eid = {}", eid); + return ORBIS_NET_ERROR_EBADF; + } return ORBIS_OK; } diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index eb1d0796a17..c40fce7c23c 100644 --- a/src/core/libraries/network/net.h +++ b/src/core/libraries/network/net.h @@ -4,6 +4,7 @@ #pragma once #include "common/types.h" +#include "epoll.h" namespace Core::Loader { class SymbolsResolver; @@ -198,7 +199,8 @@ int PS4_SYSV_ABI sceNetDumpRead(); int PS4_SYSV_ABI sceNetDuplicateIpStart(); int PS4_SYSV_ABI sceNetDuplicateIpStop(); int PS4_SYSV_ABI sceNetEpollAbort(); -int PS4_SYSV_ABI sceNetEpollControl(); +int PS4_SYSV_ABI sceNetEpollControl(OrbisNetId eid, int op, OrbisNetId id, + OrbisNetEpollEvent* event); int PS4_SYSV_ABI sceNetEpollCreate(const char* name, int flags); int PS4_SYSV_ABI sceNetEpollDestroy(int eid); int PS4_SYSV_ABI sceNetEpollWait(); From 804a0bcb13145cb9083184adcb0c6fccacaa696d Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 10 Jan 2025 17:52:38 +0200 Subject: [PATCH 13/25] added SetSocketOptions:53: Unreachable code! Unknown level =65535 optname =4608 --- src/core/libraries/network/posix_sockets.cpp | 12 ++++++++++++ src/core/libraries/network/sockets.h | 1 + 2 files changed, 13 insertions(+) diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index bd8ab64063f..6ca60fbb438 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -3,6 +3,7 @@ #include #include "net.h" +#include "net_error.h" #include "sockets.h" namespace Libraries::Net { @@ -51,6 +52,17 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, un case ORBIS_NET_SO_SNDTIMEO: return ConvertReturnErrorCode( setsockopt(sock, level, SO_SNDTIMEO, (const char*)optval, optlen)); + case ORBIS_NET_SO_NBIO: { + if (optlen != sizeof(sockopt_so_nbio)) { + return ORBIS_NET_ERROR_EFAULT; + } + memcpy(&sockopt_so_nbio, optval, optlen); +#ifdef _WIN32 + return ConvertReturnErrorCode(ioctlsocket(sock, FIONBIO, (u_long*)&sockopt_so_nbio)); +#else + return ConvertReturnErrorCode(ioctl(sock, FIONBIO, &sockopt_so_nbio)); +#endif + } } } UNREACHABLE_MSG("Unknown level ={} optname ={}", level, optname); diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index de2b61e85a4..16c10eedf83 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -42,6 +42,7 @@ struct Socket { struct PosixSocket : public Socket { net_socket sock; + int sockopt_so_nbio = 0; explicit PosixSocket(int domain, int type, int protocol) : Socket(domain, type, protocol), sock(socket(domain, type, protocol)) {} int SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) override; From 7ec001779f896c1a1d49cbcaf44802f10760940c Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 10 Jan 2025 19:00:11 +0200 Subject: [PATCH 14/25] fake p2p sockets makes peggle2 works again --- CMakeLists.txt | 1 + src/core/libraries/network/net.cpp | 15 ++++++++--- src/core/libraries/network/net.h | 3 ++- src/core/libraries/network/p2p_sockets.cpp | 27 ++++++++++++++++++++ src/core/libraries/network/posix_sockets.cpp | 12 +++++++++ src/core/libraries/network/sockets.h | 13 ++++++++++ 6 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 src/core/libraries/network/p2p_sockets.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index bcdf210891a..a39aca73713 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -311,6 +311,7 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/ssl2.cpp src/core/libraries/network/ssl2.h src/core/libraries/network/posix_sockets.cpp + src/core/libraries/network/p2p_sockets.cpp src/core/libraries/network/sockets.h src/core/libraries/network/net_error.h src/core/libraries/network/epoll.cpp diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index c5a4f900a04..827780db946 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -1010,9 +1010,16 @@ int PS4_SYSV_ABI sceNetSendmsg() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetSendto() { - LOG_ERROR(Lib_Net, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI sceNetSendto(OrbisNetId s, const void* buf, u32 len, int flags, + const OrbisNetSockaddr* addr, u32 addrlen) { + auto* netcall = Common::Singleton::Instance(); + auto sock = netcall->FindSocket(s); + if (!sock) { + net_errno = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); + return ORBIS_NET_ERROR_EBADF; + } + return sock->SendPacket(buf, len, flags, addr, addrlen); } int PS4_SYSV_ABI sceNetSetDns6Info() { @@ -1145,7 +1152,7 @@ OrbisNetId PS4_SYSV_ABI sceNetSocket(const char* name, int family, int type, int break; case ORBIS_NET_SOCK_DGRAM_P2P: case ORBIS_NET_SOCK_STREAM_P2P: - UNREACHABLE_MSG("we don't support P2P"); + sock = std::make_shared(family, type, protocol); break; default: UNREACHABLE_MSG("Unknown type {}", type); diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index c40fce7c23c..cfceff0ce37 100644 --- a/src/core/libraries/network/net.h +++ b/src/core/libraries/network/net.h @@ -276,7 +276,8 @@ int PS4_SYSV_ABI sceNetResolverStartNtoaMultipleRecords(); int PS4_SYSV_ABI sceNetResolverStartNtoaMultipleRecordsEx(); int PS4_SYSV_ABI sceNetSend(); int PS4_SYSV_ABI sceNetSendmsg(); -int PS4_SYSV_ABI sceNetSendto(); +int PS4_SYSV_ABI sceNetSendto(OrbisNetId s, const void* buf, u32 len, int flags, + const OrbisNetSockaddr* addr, u32 addrlen); int PS4_SYSV_ABI sceNetSetDns6Info(); int PS4_SYSV_ABI sceNetSetDns6InfoToKernel(); int PS4_SYSV_ABI sceNetSetDnsInfo(); diff --git a/src/core/libraries/network/p2p_sockets.cpp b/src/core/libraries/network/p2p_sockets.cpp new file mode 100644 index 00000000000..c03883cce02 --- /dev/null +++ b/src/core/libraries/network/p2p_sockets.cpp @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include "net.h" +#include "net_error.h" +#include "sockets.h" + +namespace Libraries::Net { +int P2PSocket::SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) { + return 0; +} + +int P2PSocket::Bind(const OrbisNetSockaddr* addr, unsigned int addrlen) { + return 0; +} + +int P2PSocket::Listen(int backlog) { + return 0; +} + +int P2PSocket::SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, + u32 tolen) { + return -1; // fake value makes peggle2 work +} + +} // namespace Libraries::Net \ No newline at end of file diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index 6ca60fbb438..2f8d59098c2 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -78,4 +78,16 @@ int PosixSocket::Listen(int backlog) { return ConvertReturnErrorCode(::listen(sock, backlog)); } +int PosixSocket::SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, + u32 tolen) { + if (to != nullptr) { + sockaddr addr; + convertOrbisNetSockaddrToPosix(to, &addr); + return ConvertReturnErrorCode( + sendto(sock, (const char*)msg, len, flags, &addr, sizeof(sockaddr_in))); + } else { + return ConvertReturnErrorCode(send(sock, (const char*)msg, len, flags)); + } +} + } // namespace Libraries::Net \ No newline at end of file diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index 16c10eedf83..7c5f7a56cc1 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -38,6 +38,8 @@ struct Socket { unsigned int optlen) = 0; virtual int Bind(const OrbisNetSockaddr* addr, unsigned int addrlen) = 0; virtual int Listen(int backlog) = 0; + virtual int SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, + u32 tolen) = 0; }; struct PosixSocket : public Socket { @@ -48,6 +50,17 @@ struct PosixSocket : public Socket { int SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) override; int Bind(const OrbisNetSockaddr* addr, unsigned int addrlen) override; int Listen(int backlog) override; + int SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, + u32 tolen) override; +}; + +struct P2PSocket : public Socket { + explicit P2PSocket(int domain, int type, int protocol) : Socket(domain, type, protocol) {} + int SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) override; + int Bind(const OrbisNetSockaddr* addr, unsigned int addrlen) override; + int Listen(int backlog) override; + int SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, + u32 tolen) override; }; class NetInternal { From ec7f01072b4cec0ec9b55006c9232c8b0f0ea616 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 10 Jan 2025 19:49:40 +0200 Subject: [PATCH 15/25] fixed possible issue in sceNetResolverStartAton (found in bloodborne alpha) --- src/core/libraries/network/net.cpp | 6 +++++- src/core/libraries/network/posix_sockets.cpp | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 827780db946..15493a327f6 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -971,7 +971,11 @@ int PS4_SYSV_ABI sceNetResolverStartAton(int rid, const u32* addr, char* hostnam LOG_ERROR(Lib_Net, "rid = {} , hostname_len ={} timeout={} retry={} flags={}", rid, hostname_len, timeout, retry, flags); struct hostent* resolved = gethostbyaddr((const char*)addr, hostname_len, AF_INET); - strcpy(hostname, resolved->h_name); + if (resolved != nullptr) { + strcpy(hostname, resolved->h_name); + } else { + strcpy(hostname, "localhost"); // dummy + } return ORBIS_OK; } diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index 2f8d59098c2..3ca4bafc749 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -65,6 +65,13 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, un } } } + if (level == IPPROTO_TCP) { + switch (optname) { + case ORBIS_NET_TCP_NODELAY: + return ConvertReturnErrorCode( + setsockopt(sock, level, TCP_NODELAY, (const char*)optval, optlen)); + } + } UNREACHABLE_MSG("Unknown level ={} optname ={}", level, optname); return 0; } From 5b299ee8e4127ed5c6f8c020a5d1c16698006575 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 10 Jan 2025 20:16:03 +0200 Subject: [PATCH 16/25] added case in SetSocketOptions for tony hawk 5 --- src/core/libraries/network/posix_sockets.cpp | 7 +++++++ src/core/libraries/network/sockets.h | 1 + 2 files changed, 8 insertions(+) diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index 3ca4bafc749..bece5426259 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -52,6 +52,13 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, un case ORBIS_NET_SO_SNDTIMEO: return ConvertReturnErrorCode( setsockopt(sock, level, SO_SNDTIMEO, (const char*)optval, optlen)); + case ORBIS_NET_SO_ONESBCAST: { + if (optlen != sizeof(sockopt_so_onesbcast)) { + return ORBIS_NET_ERROR_EFAULT; + } + memcpy(&sockopt_so_onesbcast, optval, optlen); + return 0; + } case ORBIS_NET_SO_NBIO: { if (optlen != sizeof(sockopt_so_nbio)) { return ORBIS_NET_ERROR_EFAULT; diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index 7c5f7a56cc1..f6c3bec825d 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -45,6 +45,7 @@ struct Socket { struct PosixSocket : public Socket { net_socket sock; int sockopt_so_nbio = 0; + int sockopt_so_onesbcast = 0; explicit PosixSocket(int domain, int type, int protocol) : Socket(domain, type, protocol), sock(socket(domain, type, protocol)) {} int SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) override; From 7a00503708efad54f16de16b7954103c3c5c46b7 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 13 Jan 2025 13:23:51 +0200 Subject: [PATCH 17/25] implemented sceNetAccept --- src/core/libraries/network/net.cpp | 23 +++++++++++++---- src/core/libraries/network/p2p_sockets.cpp | 4 +++ src/core/libraries/network/posix_sockets.cpp | 26 ++++++++++++++++++++ src/core/libraries/network/sockets.h | 4 +++ 4 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 15493a327f6..e335930a5ed 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -65,8 +65,21 @@ int PS4_SYSV_ABI sce_net_in6addr_nodelocal_allnodes() { } OrbisNetId PS4_SYSV_ABI sceNetAccept(OrbisNetId s, OrbisNetSockaddr* addr, u32* paddrlen) { - LOG_ERROR(Lib_Net, "(STUBBED) called"); - return ORBIS_OK; + auto* netcall = Common::Singleton::Instance(); + auto sock = netcall->FindSocket(s); + if (!sock) { + net_errno = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); + return ORBIS_NET_ERROR_EBADF; + } + auto new_sock = sock->Accept(addr, paddrlen); + if (!new_sock) { + LOG_ERROR(Lib_Net, "error creating new socket for accepting"); + return -1; + } + auto id = ++netcall->next_sock_id; + netcall->socks.emplace(id, new_sock); + return id; } int PS4_SYSV_ABI sceNetAddrConfig6GetInfo() { @@ -1048,7 +1061,7 @@ int PS4_SYSV_ABI sceNetSetDnsInfoToKernel() { int PS4_SYSV_ABI sceNetSetsockopt(OrbisNetId s, int level, int optname, const void* optval, u32 optlen) { - LOG_ERROR(Lib_Net, "s = {} level = {} optname = {} optlen = {}", s, level, optname, optlen); + LOG_INFO(Lib_Net, "s = {} level = {} optname = {} optlen = {}", s, level, optname, optlen); auto* netcall = Common::Singleton::Instance(); auto sock = netcall->FindSocket(s); if (!sock) { @@ -1145,8 +1158,8 @@ int PS4_SYSV_ABI sceNetShutdown() { } OrbisNetId PS4_SYSV_ABI sceNetSocket(const char* name, int family, int type, int protocol) { - LOG_ERROR(Lib_Net, "name = {} family = {} type = {} protocol = {}", std::string(name), family, - type, protocol); + LOG_INFO(Lib_Net, "name = {} family = {} type = {} protocol = {}", std::string(name), family, + type, protocol); SocketPtr sock; switch (type) { case ORBIS_NET_SOCK_STREAM: diff --git a/src/core/libraries/network/p2p_sockets.cpp b/src/core/libraries/network/p2p_sockets.cpp index c03883cce02..50ef84410fe 100644 --- a/src/core/libraries/network/p2p_sockets.cpp +++ b/src/core/libraries/network/p2p_sockets.cpp @@ -24,4 +24,8 @@ int P2PSocket::SendPacket(const void* msg, u32 len, int flags, const OrbisNetSoc return -1; // fake value makes peggle2 work } +SocketPtr P2PSocket::Accept(OrbisNetSockaddr* addr, u32* addrlen) { + return nullptr; +} + } // namespace Libraries::Net \ No newline at end of file diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index bece5426259..4dc5a70ad25 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -39,6 +39,17 @@ static void convertOrbisNetSockaddrToPosix(const OrbisNetSockaddr* src, sockaddr memcpy(&dst_in->sin_addr, &src_in->sin_addr, 4); } +static void convertPosixSockaddrToOrbis(sockaddr* src, OrbisNetSockaddr* dst) { + if (src == nullptr || dst == nullptr) + return; + memset(dst, 0, sizeof(OrbisNetSockaddr)); + OrbisNetSockaddrIn* dst_in = (OrbisNetSockaddrIn*)dst; + sockaddr_in* src_in = (sockaddr_in*)src; + dst_in->sin_family = static_cast(src_in->sin_family); + dst_in->sin_port = src_in->sin_port; + memcpy(&dst_in->sin_addr, &src_in->sin_addr, 4); +} + int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) { level = ConvertLevels(level); if (level == SOL_SOCKET) { @@ -104,4 +115,19 @@ int PosixSocket::SendPacket(const void* msg, u32 len, int flags, const OrbisNetS } } +SocketPtr PosixSocket::Accept(OrbisNetSockaddr* addr, u32* addrlen) { + sockaddr addr2; + net_socket new_socket = ::accept(sock, &addr2, (socklen_t*)addrlen); +#ifdef _WIN32 + if (new_socket != INVALID_SOCKET) { +#else + if (new_socket >= 0) { +#endif + convertPosixSockaddrToOrbis(&addr2, addr); + *addrlen = sizeof(OrbisNetSockaddrIn); + return std::make_shared(new_socket); + } + return nullptr; +} + } // namespace Libraries::Net \ No newline at end of file diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index f6c3bec825d..8997374ec67 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -40,6 +40,7 @@ struct Socket { virtual int Listen(int backlog) = 0; virtual int SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, u32 tolen) = 0; + virtual SocketPtr Accept(OrbisNetSockaddr* addr, u32* addrlen) = 0; }; struct PosixSocket : public Socket { @@ -48,11 +49,13 @@ struct PosixSocket : public Socket { int sockopt_so_onesbcast = 0; explicit PosixSocket(int domain, int type, int protocol) : Socket(domain, type, protocol), sock(socket(domain, type, protocol)) {} + explicit PosixSocket(net_socket sock) : Socket(0, 0, 0), sock(sock) {} int SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) override; int Bind(const OrbisNetSockaddr* addr, unsigned int addrlen) override; int Listen(int backlog) override; int SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, u32 tolen) override; + SocketPtr Accept(OrbisNetSockaddr* addr, u32* addrlen) override; }; struct P2PSocket : public Socket { @@ -62,6 +65,7 @@ struct P2PSocket : public Socket { int Listen(int backlog) override; int SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, u32 tolen) override; + SocketPtr Accept(OrbisNetSockaddr* addr, u32* addrlen) override; }; class NetInternal { From 94bcc21994ce05c5fef5258beee90cd4a8cf8317 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 20 Jan 2025 20:25:43 +0200 Subject: [PATCH 18/25] added more setsocket options and some error returns --- src/core/libraries/network/net.cpp | 20 ++++++++++-- src/core/libraries/network/net.h | 3 +- src/core/libraries/network/net_error.h | 1 + src/core/libraries/network/posix_sockets.cpp | 33 ++++++++++++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index e335930a5ed..008a1b92176 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -18,6 +18,7 @@ #include "core/libraries/network/net.h" #include "net_error.h" +#include "netctl.h" #include "sockets.h" namespace Libraries::Net { @@ -728,8 +729,23 @@ int PS4_SYSV_ABI sceNetGetIfnameNumList() { return ORBIS_OK; } -int PS4_SYSV_ABI sceNetGetMacAddress() { - LOG_ERROR(Lib_Net, "(STUBBED) called"); +int PS4_SYSV_ABI sceNetGetMacAddress(Libraries::NetCtl::OrbisNetEtherAddr* addr, int flags) { + if (addr == nullptr) { + LOG_ERROR(Lib_Net, "addr is null!"); + return ORBIS_NET_EINVAL; + } +#ifdef _WIN32 + IP_ADAPTER_INFO AdapterInfo[16]; + DWORD dwBufLen = sizeof(AdapterInfo); + if (GetAdaptersInfo(AdapterInfo, &dwBufLen) != ERROR_SUCCESS) { + LOG_ERROR(Lib_Net, "Can't retrieve adapter info"); + return ORBIS_NET_EINVAL; + } else { + memcpy(addr->data, AdapterInfo[0].Address, 6); + } +#else + LOG_ERROR(Lib_Net, "FixMe no support for MacOS,linux"); +#endif return ORBIS_OK; } diff --git a/src/core/libraries/network/net.h b/src/core/libraries/network/net.h index cfceff0ce37..0d58dbebee0 100644 --- a/src/core/libraries/network/net.h +++ b/src/core/libraries/network/net.h @@ -5,6 +5,7 @@ #include "common/types.h" #include "epoll.h" +#include "netctl.h" namespace Core::Loader { class SymbolsResolver; @@ -219,7 +220,7 @@ int PS4_SYSV_ABI sceNetGetIfList(); int PS4_SYSV_ABI sceNetGetIfListOnce(); int PS4_SYSV_ABI sceNetGetIfName(); int PS4_SYSV_ABI sceNetGetIfnameNumList(); -int PS4_SYSV_ABI sceNetGetMacAddress(); +int PS4_SYSV_ABI sceNetGetMacAddress(Libraries::NetCtl::OrbisNetEtherAddr* addr, int flags); int PS4_SYSV_ABI sceNetGetMemoryPoolStats(); int PS4_SYSV_ABI sceNetGetNameToIndex(); int PS4_SYSV_ABI sceNetGetpeername(); diff --git a/src/core/libraries/network/net_error.h b/src/core/libraries/network/net_error.h index 88e3cac55a8..f85443fc4af 100644 --- a/src/core/libraries/network/net_error.h +++ b/src/core/libraries/network/net_error.h @@ -16,3 +16,4 @@ constexpr int ORBIS_NET_ERROR_EBADF = 0x80410109; constexpr int ORBIS_NET_ERROR_EFAULT = 0x8041010e; constexpr int ORBIS_NET_ERROR_EEXIST = 0x80410111; constexpr int ORBIS_NET_ERROR_EINVAL = 0x80410116; +constexpr int ORBIS_NET_ERROR_ENOPROTOOPT = 0x8041012a; diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index 4dc5a70ad25..d73fbffe8e6 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -22,6 +22,23 @@ static int ConvertLevels(int level) { static int ConvertReturnErrorCode(int retval) { if (retval < 0) { +#ifdef _WIN32 + int err = WSAGetLastError(); + LOG_ERROR(Lib_Net, "Error occured {}", err); + switch (err) { + case WSAENOPROTOOPT: + return ORBIS_NET_ERROR_ENOPROTOOPT; + case WSAEINVAL: + return ORBIS_NET_ERROR_EINVAL; +#else + LOG_ERROR(Lib_Net, "Error occured {}", errno); + switch (errno) { + case ENOPROTOOPT: + return ORBIS_NET_ERROR_ENOPROTOOPT; + case EINVAL: + return ORBIS_NET_ERROR_EINVAL; +#endif + } UNREACHABLE_MSG("Function returned an errorCode = {}", retval); } // if it is 0 or positive return it as it is @@ -63,6 +80,15 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, un case ORBIS_NET_SO_SNDTIMEO: return ConvertReturnErrorCode( setsockopt(sock, level, SO_SNDTIMEO, (const char*)optval, optlen)); + case ORBIS_NET_SO_SNDBUF: + return ConvertReturnErrorCode( + setsockopt(sock, level, SO_SNDBUF, (const char*)optval, optlen)); + case ORBIS_NET_SO_RCVBUF: + return ConvertReturnErrorCode( + setsockopt(sock, level, SO_RCVBUF, (const char*)optval, optlen)); + case ORBIS_NET_SO_LINGER: + return ConvertReturnErrorCode( + setsockopt(sock, level, SO_LINGER, (const char*)optval, optlen)); case ORBIS_NET_SO_ONESBCAST: { if (optlen != sizeof(sockopt_so_onesbcast)) { return ORBIS_NET_ERROR_EFAULT; @@ -90,6 +116,13 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, un setsockopt(sock, level, TCP_NODELAY, (const char*)optval, optlen)); } } + if (level == IPPROTO_IP) { + switch (optname) { + case ORBIS_NET_IP_HDRINCL: + return ConvertReturnErrorCode( + setsockopt(sock, level, IP_HDRINCL, (const char*)optval, optlen)); + } + } UNREACHABLE_MSG("Unknown level ={} optname ={}", level, optname); return 0; } From 9c5b2214a11d35f66e21248ccdcd3ee453f862a3 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 20 Jan 2025 20:38:21 +0200 Subject: [PATCH 19/25] added sceNetRecvfrom --- src/core/libraries/network/net.cpp | 10 ++++++++-- src/core/libraries/network/p2p_sockets.cpp | 4 ++++ src/core/libraries/network/posix_sockets.cpp | 13 +++++++++++++ src/core/libraries/network/sockets.h | 4 ++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 008a1b92176..576cbfd96ba 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -946,8 +946,14 @@ int PS4_SYSV_ABI sceNetRecv() { int PS4_SYSV_ABI sceNetRecvfrom(OrbisNetId s, void* buf, size_t len, int flags, OrbisNetSockaddr* addr, u32* paddrlen) { - LOG_ERROR(Lib_Net, "(STUBBED) called"); - return ORBIS_OK; + auto* netcall = Common::Singleton::Instance(); + auto sock = netcall->FindSocket(s); + if (!sock) { + net_errno = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); + return ORBIS_NET_ERROR_EBADF; + } + return sock->ReceivePacket(buf, len, flags, addr, paddrlen); } int PS4_SYSV_ABI sceNetRecvmsg() { diff --git a/src/core/libraries/network/p2p_sockets.cpp b/src/core/libraries/network/p2p_sockets.cpp index 50ef84410fe..584d22f4baa 100644 --- a/src/core/libraries/network/p2p_sockets.cpp +++ b/src/core/libraries/network/p2p_sockets.cpp @@ -24,6 +24,10 @@ int P2PSocket::SendPacket(const void* msg, u32 len, int flags, const OrbisNetSoc return -1; // fake value makes peggle2 work } +int P2PSocket::ReceivePacket(void* buf, u32 len, int flags, OrbisNetSockaddr* from, u32* fromlen) { + return -1; // fake it +} + SocketPtr P2PSocket::Accept(OrbisNetSockaddr* addr, u32* addrlen) { return nullptr; } diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index d73fbffe8e6..c5b74aab0ed 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -148,6 +148,19 @@ int PosixSocket::SendPacket(const void* msg, u32 len, int flags, const OrbisNetS } } +int PosixSocket::ReceivePacket(void* buf, u32 len, int flags, OrbisNetSockaddr* from, + u32* fromlen) { + if (from != nullptr) { + sockaddr addr; + int res = recvfrom(sock, (char*)buf, len, flags, &addr, (socklen_t*)fromlen); + convertPosixSockaddrToOrbis(&addr, from); + *fromlen = sizeof(OrbisNetSockaddrIn); + return ConvertReturnErrorCode(res); + } else { + return ConvertReturnErrorCode(recv(sock, (char*)buf, len, flags)); + } +} + SocketPtr PosixSocket::Accept(OrbisNetSockaddr* addr, u32* addrlen) { sockaddr addr2; net_socket new_socket = ::accept(sock, &addr2, (socklen_t*)addrlen); diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index 8997374ec67..c0212c6dfa8 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -41,6 +41,8 @@ struct Socket { virtual int SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, u32 tolen) = 0; virtual SocketPtr Accept(OrbisNetSockaddr* addr, u32* addrlen) = 0; + virtual int ReceivePacket(void* buf, u32 len, int flags, OrbisNetSockaddr* from, + u32* fromlen) = 0; }; struct PosixSocket : public Socket { @@ -55,6 +57,7 @@ struct PosixSocket : public Socket { int Listen(int backlog) override; int SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, u32 tolen) override; + int ReceivePacket(void* buf, u32 len, int flags, OrbisNetSockaddr* from, u32* fromlen) override; SocketPtr Accept(OrbisNetSockaddr* addr, u32* addrlen) override; }; @@ -65,6 +68,7 @@ struct P2PSocket : public Socket { int Listen(int backlog) override; int SendPacket(const void* msg, u32 len, int flags, const OrbisNetSockaddr* to, u32 tolen) override; + int ReceivePacket(void* buf, u32 len, int flags, OrbisNetSockaddr* from, u32* fromlen) override; SocketPtr Accept(OrbisNetSockaddr* addr, u32* addrlen) override; }; From 79fe728c92092d3abea6620afb05d947ac07ebbb Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 20 Jan 2025 22:55:58 +0200 Subject: [PATCH 20/25] handled null name issues --- src/core/libraries/network/net.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 576cbfd96ba..1fc9982f638 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -631,7 +631,11 @@ int PS4_SYSV_ABI sceNetEpollControl(OrbisNetId eid, int op, OrbisNetId id, } int PS4_SYSV_ABI sceNetEpollCreate(const char* name, int flags) { - LOG_DEBUG(Lib_Net, "name = {} flags= {}", std::string(name), flags); + if (name == nullptr) { + LOG_DEBUG(Lib_Net, "name = no-name flags= {}", flags); + } else { + LOG_DEBUG(Lib_Net, "name = {} flags= {}", std::string(name), flags); + } auto* net_epoll = Common::Singleton::Instance(); auto epoll = std::make_shared(); auto id = ++net_epoll->next_epool_sock_id; @@ -1180,8 +1184,13 @@ int PS4_SYSV_ABI sceNetShutdown() { } OrbisNetId PS4_SYSV_ABI sceNetSocket(const char* name, int family, int type, int protocol) { - LOG_INFO(Lib_Net, "name = {} family = {} type = {} protocol = {}", std::string(name), family, - type, protocol); + if (name == nullptr) { + LOG_INFO(Lib_Net, "name = no-named family = {} type = {} protocol = {}", family, type, + protocol); + } else { + LOG_INFO(Lib_Net, "name = {} family = {} type = {} protocol = {}", std::string(name), + family, type, protocol); + } SocketPtr sock; switch (type) { case ORBIS_NET_SOCK_STREAM: From 345752b1a0a40931cd8000e31cfea314c62808a7 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 20 Jan 2025 23:11:43 +0200 Subject: [PATCH 21/25] improved net_errno --- src/core/libraries/network/net.cpp | 16 +++++++++++----- src/core/libraries/network/net_error.h | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 1fc9982f638..332ecca9580 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -25,6 +25,12 @@ namespace Libraries::Net { static thread_local int32_t net_errno = 0; +int setErrnoFromOrbis(int code) { + if (code != 0) { + net_errno = code + ORBIS_NET_ERROR_EPERM + 1; + } + return code; +} int PS4_SYSV_ABI in6addr_any() { LOG_ERROR(Lib_Net, "(STUBBED) called"); return ORBIS_OK; @@ -146,7 +152,7 @@ int PS4_SYSV_ABI sceNetBind(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addr LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); return ORBIS_NET_ERROR_EBADF; } - return sock->Bind(addr, addrlen); + return setErrnoFromOrbis(sock->Bind(addr, addrlen)); } int PS4_SYSV_ABI sceNetClearDnsCache() { @@ -897,7 +903,7 @@ int PS4_SYSV_ABI sceNetListen(OrbisNetId s, int backlog) { LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); return ORBIS_NET_ERROR_EBADF; } - return sock->Listen(backlog); + return setErrnoFromOrbis(sock->Listen(backlog)); } int PS4_SYSV_ABI sceNetMemoryAllocate() { @@ -957,7 +963,7 @@ int PS4_SYSV_ABI sceNetRecvfrom(OrbisNetId s, void* buf, size_t len, int flags, LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); return ORBIS_NET_ERROR_EBADF; } - return sock->ReceivePacket(buf, len, flags, addr, paddrlen); + return setErrnoFromOrbis(sock->ReceivePacket(buf, len, flags, addr, paddrlen)); } int PS4_SYSV_ABI sceNetRecvmsg() { @@ -1062,7 +1068,7 @@ int PS4_SYSV_ABI sceNetSendto(OrbisNetId s, const void* buf, u32 len, int flags, LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); return ORBIS_NET_ERROR_EBADF; } - return sock->SendPacket(buf, len, flags, addr, addrlen); + return setErrnoFromOrbis(sock->SendPacket(buf, len, flags, addr, addrlen)); } int PS4_SYSV_ABI sceNetSetDns6Info() { @@ -1095,7 +1101,7 @@ int PS4_SYSV_ABI sceNetSetsockopt(OrbisNetId s, int level, int optname, const vo LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); return ORBIS_NET_ERROR_EBADF; } - return sock->SetSocketOptions(level, optname, optval, optlen); + return setErrnoFromOrbis(sock->SetSocketOptions(level, optname, optval, optlen)); } int PS4_SYSV_ABI sceNetShowIfconfig() { diff --git a/src/core/libraries/network/net_error.h b/src/core/libraries/network/net_error.h index f85443fc4af..fd2f4035136 100644 --- a/src/core/libraries/network/net_error.h +++ b/src/core/libraries/network/net_error.h @@ -11,6 +11,7 @@ constexpr int ORBIS_NET_EEXIST = 17; constexpr int ORBIS_NET_EINVAL = 22; // error codes +constexpr int ORBIS_NET_ERROR_EPERM = 0x80410101; constexpr int ORBIS_NET_ERROR_ENOENT = 0x80410102; constexpr int ORBIS_NET_ERROR_EBADF = 0x80410109; constexpr int ORBIS_NET_ERROR_EFAULT = 0x8041010e; From 32aa2bb3ec4c3d69ea97ccd8b6fd811121573798 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 27 Jan 2025 20:03:41 +0200 Subject: [PATCH 22/25] implemented ORBIS_NET_CTL_INFO_ETHER_ADDR --- CMakeLists.txt | 2 + src/core/libraries/network/net_util.cpp | 100 ++++++++++++++++++++++++ src/core/libraries/network/net_util.h | 24 ++++++ src/core/libraries/network/netctl.cpp | 7 ++ src/core/libraries/network/netctl.h | 17 ++++ 5 files changed, 150 insertions(+) create mode 100644 src/core/libraries/network/net_util.cpp create mode 100644 src/core/libraries/network/net_util.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a39aca73713..b7e34fccd71 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -316,6 +316,8 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/net_error.h src/core/libraries/network/epoll.cpp src/core/libraries/network/epoll.h + src/core/libraries/network/net_util.cpp + src/core/libraries/network/net_util.h ) set(AVPLAYER_LIB src/core/libraries/avplayer/avplayer_common.cpp diff --git a/src/core/libraries/network/net_util.cpp b/src/core/libraries/network/net_util.cpp new file mode 100644 index 00000000000..844298e60a5 --- /dev/null +++ b/src/core/libraries/network/net_util.cpp @@ -0,0 +1,100 @@ +#ifdef _WIN32 +#define _WINSOCK_DEPRECATED_NO_WARNINGS +#include +#include +#include +typedef SOCKET net_socket; +typedef int socklen_t; +#else +#include +#include +#include +#include +#include +#include +#include +#include +typedef int net_socket; +#endif +#include +#include +#include +#include +#include "net_util.h" + +namespace NetUtil { + +const std::array& NetUtilInternal::GetEthernetAddr() const { + return ether_address; +} + +bool NetUtilInternal::RetrieveEthernetAddr() { + std::scoped_lock lock{m_mutex}; +#ifdef _WIN32 + std::vector adapter_infos(sizeof(IP_ADAPTER_INFO)); + ULONG size_infos = sizeof(IP_ADAPTER_INFO); + + if (GetAdaptersInfo(reinterpret_cast(adapter_infos.data()), &size_infos) == + ERROR_BUFFER_OVERFLOW) + adapter_infos.resize(size_infos); + + if (GetAdaptersInfo(reinterpret_cast(adapter_infos.data()), &size_infos) == + NO_ERROR && + size_infos) { + PIP_ADAPTER_INFO info = reinterpret_cast(adapter_infos.data()); + memcpy(ether_address.data(), info[0].Address, 6); + return true; + } +#elif defined __APPLE__ + ifaddrs* ifap; + + if (getifaddrs(&ifap) == 0) { + ifaddrs* p; + for (p = ifap; p; p = p->ifa_next) { + if (p->ifa_addr->sa_family == AF_LINK) { + sockaddr_dl* sdp = reinterpret_cast(p->ifa_addr); + memcpy(ether_address.data(), sdp->sdl_data + sdp->sdl_nlen, 6); + freeifaddrs(ifap); + return true; + } + } + freeifaddrs(ifap); + } +#else + ifreq ifr; + ifconf ifc; + char buf[1024]; + int success = 0; + + int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); + if (sock == -1) + return false; + + ifc.ifc_len = sizeof(buf); + ifc.ifc_buf = buf; + if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) + return false; + + ifreq* it = ifc.ifc_req; + const ifreq* const end = it + (ifc.ifc_len / sizeof(ifreq)); + + for (; it != end; ++it) { + strcpy(ifr.ifr_name, it->ifr_name); + if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) { + if (!(ifr.ifr_flags & IFF_LOOPBACK)) { + if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) { + success = 1; + break; + } + } + } + } + + if (success) { + memcpy(ether_address.data(), ifr.ifr_hwaddr.sa_data, 6); + return true; + } +#endif + return false; +} +} // namespace NetUtil \ No newline at end of file diff --git a/src/core/libraries/network/net_util.h b/src/core/libraries/network/net_util.h new file mode 100644 index 00000000000..be9dc15a1f1 --- /dev/null +++ b/src/core/libraries/network/net_util.h @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include "common/types.h" + +namespace NetUtil { + +class NetUtilInternal { +public: + explicit NetUtilInternal() = default; + ~NetUtilInternal() = default; + +private: + std::array ether_address{}; + std::mutex m_mutex; + +public: + const std::array& GetEthernetAddr() const; + bool RetrieveEthernetAddr(); +}; +} // namespace NetUtil \ No newline at end of file diff --git a/src/core/libraries/network/netctl.cpp b/src/core/libraries/network/netctl.cpp index ed9adf6fa06..e3afd6ddee5 100644 --- a/src/core/libraries/network/netctl.cpp +++ b/src/core/libraries/network/netctl.cpp @@ -12,11 +12,13 @@ #include #endif +#include #include "common/logging/log.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/network/net_ctl_codes.h" #include "core/libraries/network/netctl.h" +#include "net_util.h" namespace Libraries::NetCtl { @@ -162,6 +164,11 @@ int PS4_SYSV_ABI sceNetCtlGetInfo(int code, OrbisNetCtlInfo* info) { case ORBIS_NET_CTL_INFO_DEVICE: info->device = ORBIS_NET_CTL_DEVICE_WIRED; break; + case ORBIS_NET_CTL_INFO_ETHER_ADDR: { + auto* netinfo = Common::Singleton::Instance(); + netinfo->RetrieveEthernetAddr(); + memcpy(info->ether_addr.data, netinfo->GetEthernetAddr().data(), 6); + } break; case ORBIS_NET_CTL_INFO_LINK: info->link = ORBIS_NET_CTL_LINK_DISCONNECTED; break; diff --git a/src/core/libraries/network/netctl.h b/src/core/libraries/network/netctl.h index 7c9ec594a32..203c75822da 100644 --- a/src/core/libraries/network/netctl.h +++ b/src/core/libraries/network/netctl.h @@ -49,9 +49,26 @@ union OrbisNetCtlInfo { // GetInfo codes constexpr int ORBIS_NET_CTL_INFO_DEVICE = 1; +constexpr int ORBIS_NET_CTL_INFO_ETHER_ADDR = 2; constexpr int ORBIS_NET_CTL_INFO_MTU = 3; constexpr int ORBIS_NET_CTL_INFO_LINK = 4; +constexpr int ORBIS_NET_CTL_INFO_BSSID = 5; +constexpr int ORBIS_NET_CTL_INFO_SSID = 6; +constexpr int ORBIS_NET_CTL_INFO_WIFI_SECURITY = 7; +constexpr int ORBIS_NET_CTL_INFO_RSSI_DBM = 8; +constexpr int ORBIS_NET_CTL_INFO_RSSI_PERCENTAGE = 9; +constexpr int ORBIS_NET_CTL_INFO_CHANNEL = 10; +constexpr int ORBIS_NET_CTL_INFO_IP_CONFIG = 11; +constexpr int ORBIS_NET_CTL_INFO_DHCP_HOSTNAME = 12; +constexpr int ORBIS_NET_CTL_INFO_PPPOE_AUTH_NAME = 13; constexpr int ORBIS_NET_CTL_INFO_IP_ADDRESS = 14; +constexpr int ORBIS_NET_CTL_INFO_NETMASK = 15; +constexpr int ORBIS_NET_CTL_INFO_DEFAULT_ROUTE = 16; +constexpr int ORBIS_NET_CTL_INFO_PRIMARY_DNS = 17; +constexpr int ORBIS_NET_CTL_INFO_SECONDARY_DNS = 18; +constexpr int ORBIS_NET_CTL_INFO_HTTP_PROXY_CONFIG = 19; +constexpr int ORBIS_NET_CTL_INFO_HTTP_PROXY_SERVER = 20; +constexpr int ORBIS_NET_CTL_INFO_HTTP_PROXY_PORT = 21; int PS4_SYSV_ABI sceNetBweCheckCallbackIpcInt(); int PS4_SYSV_ABI sceNetBweClearEventIpcInt(); From 545ac4c3d513848e8da7de64bb62f652fabe0696 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 27 Jan 2025 20:25:16 +0200 Subject: [PATCH 23/25] linux mac fix? --- src/core/libraries/network/net_util.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/libraries/network/net_util.cpp b/src/core/libraries/network/net_util.cpp index 844298e60a5..39085036060 100644 --- a/src/core/libraries/network/net_util.cpp +++ b/src/core/libraries/network/net_util.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + #ifdef _WIN32 #define _WINSOCK_DEPRECATED_NO_WARNINGS #include @@ -8,6 +11,7 @@ typedef int socklen_t; #else #include #include +#include #include #include #include From 1476b67e34daf2b332fe7a9b8f0d466ce029e78f Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 27 Jan 2025 20:39:49 +0200 Subject: [PATCH 24/25] fix linux-mac part2 --- src/core/libraries/network/net_util.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/libraries/network/net_util.cpp b/src/core/libraries/network/net_util.cpp index 39085036060..b0a0d9ad8cd 100644 --- a/src/core/libraries/network/net_util.cpp +++ b/src/core/libraries/network/net_util.cpp @@ -20,6 +20,11 @@ typedef int socklen_t; #include typedef int net_socket; #endif +#if defined(__APPLE__) +#include +#include +#endif + #include #include #include @@ -49,7 +54,7 @@ bool NetUtilInternal::RetrieveEthernetAddr() { memcpy(ether_address.data(), info[0].Address, 6); return true; } -#elif defined __APPLE__ +#elif defined(__APPLE__) ifaddrs* ifap; if (getifaddrs(&ifap) == 0) { From afe5c5c7eb8a8a4122a03bd4e3734a5168f10964 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 27 Jan 2025 20:50:18 +0200 Subject: [PATCH 25/25] linux fix? --- src/core/libraries/network/net_util.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/libraries/network/net_util.cpp b/src/core/libraries/network/net_util.cpp index b0a0d9ad8cd..d0f0a81da89 100644 --- a/src/core/libraries/network/net_util.cpp +++ b/src/core/libraries/network/net_util.cpp @@ -29,6 +29,7 @@ typedef int net_socket; #include #include #include +#include #include "net_util.h" namespace NetUtil {