diff --git a/src/core/libraries/rudp/rudp.cpp b/src/core/libraries/rudp/rudp.cpp index 2dfb66f64..a06795519 100644 --- a/src/core/libraries/rudp/rudp.cpp +++ b/src/core/libraries/rudp/rudp.cpp @@ -1,13 +1,33 @@ // SPDX-FileCopyrightText: Copyright 2026 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include +#include #include "common/logging/log.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/rudp/rudp.h" +#include "core/libraries/rudp/rudp_error.h" namespace Libraries::Rudp { +static OrbisRudpStatus g_rudpStatusInternal = {0}; + +void* g_RudpContext = nullptr; + +struct RudpInternalState { + std::atomic current_contexts{0}; + std::atomic allocs{0}; + std::atomic frees{0}; + std::atomic mem_current{0}; + std::atomic mem_peak{0}; +}; +static RudpInternalState g_state; + +std::recursive_mutex g_RudpMutex; +bool g_isRudpInitialized = false; + s32 PS4_SYSV_ABI sceRudpAccept() { LOG_ERROR(Lib_Rudp, "(STUBBED) called"); return ORBIS_OK; @@ -88,8 +108,33 @@ s32 PS4_SYSV_ABI sceRudpGetSizeWritable() { return ORBIS_OK; } -s32 PS4_SYSV_ABI sceRudpGetStatus() { - LOG_ERROR(Lib_Rudp, "(STUBBED) called"); +s32 Rudp_GetActiveContexts() { + return g_state.current_contexts.load(); +} + +void Rudp_GetMemoryStats(s32* allocs, s32* frees, s32* memCurr, s32* memPeak) { + *allocs = g_state.allocs.load(); + *frees = g_state.frees.load(); + *memCurr = g_state.mem_current.load(); + *memPeak = g_state.mem_peak.load(); +} + +s32 PS4_SYSV_ABI sceRudpGetStatus(OrbisRudpStatus* status, size_t statusSize) { + std::lock_guard lock(g_RudpMutex); + + if (!g_isRudpInitialized) { + return ORBIS_RUDP_ERROR_UNINITIALIZED; + } + + if (status == nullptr || (statusSize - 1) >= sizeof(OrbisRudpStatus)) { + return ORBIS_RUDP_ERROR_INVALID_ARGUMENT; + } + + std::memcpy(status, &g_rudpStatusInternal, statusSize); + + status->currentContexts = Rudp_GetActiveContexts(); + Rudp_GetMemoryStats(&status->allocs, &status->frees, &status->memCurrent, &status->memPeak); + return ORBIS_OK; } diff --git a/src/core/libraries/rudp/rudp.h b/src/core/libraries/rudp/rudp.h index 22d2576a2..84cc05c22 100644 --- a/src/core/libraries/rudp/rudp.h +++ b/src/core/libraries/rudp/rudp.h @@ -4,12 +4,78 @@ #pragma once #include "common/types.h" +#include +#include namespace Core::Loader { class SymbolsResolver; } namespace Libraries::Rudp { +struct OrbisRudpStatus { + s64 sentUdpBytes; + s64 rcvdUdpBytes; + s32 sentUdpPackets; + s32 rcvdUdpPackets; + + s64 sentUserBytes; + s32 sentUserPackets; + s32 sentLatencyCriticalPackets; + + s64 rcvdUserBytes; + s32 rcvdUserPackets; + s32 rcvdLatencyCriticalPackets; + + s32 sentSynPackets; + s32 rcvdSynPackets; + s32 sentUsrPackets; + s32 rcvdUsrPackets; + s32 sentPrbPackets; + s32 rcvdPrbPackets; + s32 sentRstPackets; + s32 rcvdRstPackets; + + s32 lostPackets; + s32 retransmittedPackets; + s32 reorderedPackets; + + s32 currentContexts; + + s64 sentQualityLevel1Bytes; + s64 rcvdQualityLevel1Bytes; + s32 sentQualityLevel1Packets; + s32 rcvdQualityLevel1Packets; + + s64 sentQualityLevel2Bytes; + s64 rcvdQualityLevel2Bytes; + s32 sentQualityLevel2Packets; + s32 rcvdQualityLevel2Packets; + + s64 sentQualityLevel3Bytes; + s64 rcvdQualityLevel3Bytes; + s32 sentQualityLevel3Packets; + s32 rcvdQualityLevel3Packets; + + s64 sentQualityLevel4Bytes; + s64 rcvdQualityLevel4Bytes; + s32 sentQualityLevel4Packets; + s32 rcvdQualityLevel4Packets; + + s32 allocs; + s32 frees; + s32 memCurrent; + s32 memPeak; + + s32 establishedConnections; + s32 failedConnections; + + s32 failedConnectionsReset; + s32 failedConnectionsRefused; + s32 failedConnectionsTimeout; + s32 failedConnectionsVersionMismatch; + s32 failedConnectionsTransportTypeMismatch; + s32 failedConnectionsQualityLevelMismatch; +}; s32 PS4_SYSV_ABI sceRudpAccept(); s32 PS4_SYSV_ABI sceRudpActivate(); @@ -27,7 +93,7 @@ s32 PS4_SYSV_ABI sceRudpGetOption(); s32 PS4_SYSV_ABI sceRudpGetRemoteInfo(); s32 PS4_SYSV_ABI sceRudpGetSizeReadable(); s32 PS4_SYSV_ABI sceRudpGetSizeWritable(); -s32 PS4_SYSV_ABI sceRudpGetStatus(); +s32 PS4_SYSV_ABI sceRudpGetStatus(OrbisRudpStatus* status, size_t statusSize); s32 PS4_SYSV_ABI sceRudpInit(); s32 PS4_SYSV_ABI sceRudpInitiate(); s32 PS4_SYSV_ABI sceRudpListen(); diff --git a/src/core/libraries/rudp/rudp_error.h b/src/core/libraries/rudp/rudp_error.h new file mode 100644 index 000000000..52b3ebf1e --- /dev/null +++ b/src/core/libraries/rudp/rudp_error.h @@ -0,0 +1,9 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/libraries/error_codes.h" + +constexpr int ORBIS_RUDP_ERROR_UNINITIALIZED = 0x80770001; +constexpr int ORBIS_RUDP_ERROR_INVALID_ARGUMENT = 0x80770004;