mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-16 16:21:02 +00:00
Fake PSN (#7516)
This commit is contained in:
parent
bb1b4bac9b
commit
f1f5c91386
@ -351,6 +351,10 @@ target_sources(rpcs3_emu PRIVATE
|
|||||||
Io/GHLtar.cpp
|
Io/GHLtar.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Np
|
||||||
|
target_sources(rpcs3_emu PRIVATE
|
||||||
|
NP/np_handler.cpp
|
||||||
|
)
|
||||||
|
|
||||||
# Memory
|
# Memory
|
||||||
target_sources(rpcs3_emu PRIVATE
|
target_sources(rpcs3_emu PRIVATE
|
||||||
|
@ -2,12 +2,18 @@
|
|||||||
#include "Emu/system_config.h"
|
#include "Emu/system_config.h"
|
||||||
#include "Emu/Cell/PPUModule.h"
|
#include "Emu/Cell/PPUModule.h"
|
||||||
#include "Emu/IdManager.h"
|
#include "Emu/IdManager.h"
|
||||||
|
#include "Emu/Cell/lv2/sys_sync.h"
|
||||||
|
|
||||||
#include "cellGame.h"
|
#include "cellGame.h"
|
||||||
#include "cellSysutil.h"
|
#include "cellSysutil.h"
|
||||||
#include "cellNetCtl.h"
|
#include "cellNetCtl.h"
|
||||||
|
|
||||||
#include "Utilities/StrUtil.h"
|
#include "Utilities/StrUtil.h"
|
||||||
|
#include "Emu/IdManager.h"
|
||||||
|
|
||||||
|
#include "Emu/NP/np_handler.h"
|
||||||
|
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
LOG_CHANNEL(cellNetCtl);
|
LOG_CHANNEL(cellNetCtl);
|
||||||
|
|
||||||
@ -90,14 +96,14 @@ error_code cellNetCtlInit()
|
|||||||
{
|
{
|
||||||
cellNetCtl.warning("cellNetCtlInit()");
|
cellNetCtl.warning("cellNetCtlInit()");
|
||||||
|
|
||||||
auto net_ctl_manager = g_fxo->get<cell_net_ctl_manager>();
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
|
||||||
if (net_ctl_manager->is_initialized)
|
if (nph->is_netctl_init)
|
||||||
{
|
{
|
||||||
return CELL_NET_CTL_ERROR_NOT_TERMINATED;
|
return CELL_NET_CTL_ERROR_NOT_TERMINATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
net_ctl_manager->is_initialized = true;
|
nph->is_netctl_init = true;
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
@ -106,15 +112,17 @@ void cellNetCtlTerm()
|
|||||||
{
|
{
|
||||||
cellNetCtl.warning("cellNetCtlTerm()");
|
cellNetCtl.warning("cellNetCtlTerm()");
|
||||||
|
|
||||||
auto net_ctl_manager = g_fxo->get<cell_net_ctl_manager>();
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
net_ctl_manager->is_initialized = false;
|
nph->is_netctl_init = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
error_code cellNetCtlGetState(vm::ptr<s32> state)
|
error_code cellNetCtlGetState(vm::ptr<s32> state)
|
||||||
{
|
{
|
||||||
cellNetCtl.trace("cellNetCtlGetState(state=*0x%x)", state);
|
cellNetCtl.trace("cellNetCtlGetState(state=*0x%x)", state);
|
||||||
|
|
||||||
if (!g_fxo->get<cell_net_ctl_manager>()->is_initialized)
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
|
||||||
|
if (!nph->is_netctl_init)
|
||||||
{
|
{
|
||||||
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
||||||
}
|
}
|
||||||
@ -124,7 +132,8 @@ error_code cellNetCtlGetState(vm::ptr<s32> state)
|
|||||||
return CELL_NET_CTL_ERROR_INVALID_ADDR;
|
return CELL_NET_CTL_ERROR_INVALID_ADDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
*state = g_cfg.net.net_status;
|
*state = nph->get_net_status();
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,7 +141,9 @@ error_code cellNetCtlAddHandler(vm::ptr<cellNetCtlHandler> handler, vm::ptr<void
|
|||||||
{
|
{
|
||||||
cellNetCtl.todo("cellNetCtlAddHandler(handler=*0x%x, arg=*0x%x, hid=*0x%x)", handler, arg, hid);
|
cellNetCtl.todo("cellNetCtlAddHandler(handler=*0x%x, arg=*0x%x, hid=*0x%x)", handler, arg, hid);
|
||||||
|
|
||||||
if (!g_fxo->get<cell_net_ctl_manager>()->is_initialized)
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
|
||||||
|
if (!nph->is_netctl_init)
|
||||||
{
|
{
|
||||||
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
||||||
}
|
}
|
||||||
@ -149,7 +160,9 @@ error_code cellNetCtlDelHandler(s32 hid)
|
|||||||
{
|
{
|
||||||
cellNetCtl.todo("cellNetCtlDelHandler(hid=0x%x)", hid);
|
cellNetCtl.todo("cellNetCtlDelHandler(hid=0x%x)", hid);
|
||||||
|
|
||||||
if (!g_fxo->get<cell_net_ctl_manager>()->is_initialized)
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
|
||||||
|
if (!nph->is_netctl_init)
|
||||||
{
|
{
|
||||||
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
||||||
}
|
}
|
||||||
@ -166,7 +179,9 @@ error_code cellNetCtlGetInfo(s32 code, vm::ptr<CellNetCtlInfo> info)
|
|||||||
{
|
{
|
||||||
cellNetCtl.todo("cellNetCtlGetInfo(code=0x%x (%s), info=*0x%x)", code, InfoCodeToName(code), info);
|
cellNetCtl.todo("cellNetCtlGetInfo(code=0x%x (%s), info=*0x%x)", code, InfoCodeToName(code), info);
|
||||||
|
|
||||||
if (!g_fxo->get<cell_net_ctl_manager>()->is_initialized)
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
|
||||||
|
if (!nph->is_netctl_init)
|
||||||
{
|
{
|
||||||
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
||||||
}
|
}
|
||||||
@ -183,7 +198,7 @@ error_code cellNetCtlGetInfo(s32 code, vm::ptr<CellNetCtlInfo> info)
|
|||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_cfg.net.net_status == CELL_NET_CTL_STATE_Disconnected)
|
if (nph->get_net_status() == CELL_NET_CTL_STATE_Disconnected)
|
||||||
{
|
{
|
||||||
return CELL_NET_CTL_ERROR_NOT_CONNECTED;
|
return CELL_NET_CTL_ERROR_NOT_CONNECTED;
|
||||||
}
|
}
|
||||||
@ -198,15 +213,7 @@ error_code cellNetCtlGetInfo(s32 code, vm::ptr<CellNetCtlInfo> info)
|
|||||||
}
|
}
|
||||||
else if (code == CELL_NET_CTL_INFO_IP_ADDRESS)
|
else if (code == CELL_NET_CTL_INFO_IP_ADDRESS)
|
||||||
{
|
{
|
||||||
if (g_cfg.net.net_status != CELL_NET_CTL_STATE_IPObtained)
|
strcpy_trunc(info->ip_address, nph->get_ip());
|
||||||
{
|
|
||||||
// 0.0.0.0 seems to be the default address when no ethernet cables are connected to the PS3
|
|
||||||
strcpy_trunc(info->ip_address, "0.0.0.0");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
strcpy_trunc(info->ip_address, g_cfg.net.ip_address);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (code == CELL_NET_CTL_INFO_NETMASK)
|
else if (code == CELL_NET_CTL_INFO_NETMASK)
|
||||||
{
|
{
|
||||||
@ -224,7 +231,9 @@ error_code cellNetCtlNetStartDialogLoadAsync(vm::cptr<CellNetCtlNetStartDialogPa
|
|||||||
{
|
{
|
||||||
cellNetCtl.error("cellNetCtlNetStartDialogLoadAsync(param=*0x%x)", param);
|
cellNetCtl.error("cellNetCtlNetStartDialogLoadAsync(param=*0x%x)", param);
|
||||||
|
|
||||||
if (!g_fxo->get<cell_net_ctl_manager>()->is_initialized)
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
|
||||||
|
if (!nph->is_netctl_init)
|
||||||
{
|
{
|
||||||
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
||||||
}
|
}
|
||||||
@ -244,10 +253,17 @@ error_code cellNetCtlNetStartDialogLoadAsync(vm::cptr<CellNetCtlNetStartDialogPa
|
|||||||
return CELL_NET_CTL_ERROR_INVALID_SIZE;
|
return CELL_NET_CTL_ERROR_INVALID_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Actually sign into PSN or an emulated network similar to PSN (ESN)
|
// This is a hack for Diva F 2nd that registers the sysutil callback after calling this function.
|
||||||
// TODO: Properly open the dialog prompt for sign in
|
g_fxo->init<named_thread>("Delayed cellNetCtlNetStartDialogLoadAsync messages", []()
|
||||||
sysutil_send_system_cmd(CELL_SYSUTIL_NET_CTL_NETSTART_LOADED, 0);
|
{
|
||||||
sysutil_send_system_cmd(CELL_SYSUTIL_NET_CTL_NETSTART_FINISHED, 0);
|
lv2_obj::wait_timeout(500000, nullptr);
|
||||||
|
|
||||||
|
if (thread_ctrl::state() != thread_state::aborting)
|
||||||
|
{
|
||||||
|
sysutil_send_system_cmd(CELL_SYSUTIL_NET_CTL_NETSTART_LOADED, 0);
|
||||||
|
sysutil_send_system_cmd(CELL_SYSUTIL_NET_CTL_NETSTART_FINISHED, 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
@ -256,7 +272,9 @@ error_code cellNetCtlNetStartDialogAbortAsync()
|
|||||||
{
|
{
|
||||||
cellNetCtl.error("cellNetCtlNetStartDialogAbortAsync()");
|
cellNetCtl.error("cellNetCtlNetStartDialogAbortAsync()");
|
||||||
|
|
||||||
if (!g_fxo->get<cell_net_ctl_manager>()->is_initialized)
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
|
||||||
|
if (!nph->is_netctl_init)
|
||||||
{
|
{
|
||||||
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
||||||
}
|
}
|
||||||
@ -268,7 +286,9 @@ error_code cellNetCtlNetStartDialogUnloadAsync(vm::ptr<CellNetCtlNetStartDialogR
|
|||||||
{
|
{
|
||||||
cellNetCtl.warning("cellNetCtlNetStartDialogUnloadAsync(result=*0x%x)", result);
|
cellNetCtl.warning("cellNetCtlNetStartDialogUnloadAsync(result=*0x%x)", result);
|
||||||
|
|
||||||
if (!g_fxo->get<cell_net_ctl_manager>()->is_initialized)
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
|
||||||
|
if (!nph->is_netctl_init)
|
||||||
{
|
{
|
||||||
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
||||||
}
|
}
|
||||||
@ -283,15 +303,7 @@ error_code cellNetCtlNetStartDialogUnloadAsync(vm::ptr<CellNetCtlNetStartDialogR
|
|||||||
return CELL_NET_CTL_ERROR_INVALID_SIZE;
|
return CELL_NET_CTL_ERROR_INVALID_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_cfg.net.net_status == CELL_NET_CTL_STATE_Disconnected)
|
result->result = nph->get_net_status() == CELL_NET_CTL_STATE_IPObtained ? 0 : CELL_NET_CTL_ERROR_DIALOG_CANCELED;
|
||||||
{
|
|
||||||
result->result = CELL_NET_CTL_ERROR_NET_NOT_CONNECTED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Hack
|
|
||||||
result->result = CELL_NET_CTL_ERROR_DIALOG_CANCELED;
|
|
||||||
}
|
|
||||||
|
|
||||||
sysutil_send_system_cmd(CELL_SYSUTIL_NET_CTL_NETSTART_UNLOADED, 0);
|
sysutil_send_system_cmd(CELL_SYSUTIL_NET_CTL_NETSTART_UNLOADED, 0);
|
||||||
|
|
||||||
@ -302,7 +314,9 @@ error_code cellNetCtlGetNatInfo(vm::ptr<CellNetCtlNatInfo> natInfo)
|
|||||||
{
|
{
|
||||||
cellNetCtl.warning("cellNetCtlGetNatInfo(natInfo=*0x%x)", natInfo);
|
cellNetCtl.warning("cellNetCtlGetNatInfo(natInfo=*0x%x)", natInfo);
|
||||||
|
|
||||||
if (!g_fxo->get<cell_net_ctl_manager>()->is_initialized)
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
|
||||||
|
if (!nph->is_netctl_init)
|
||||||
{
|
{
|
||||||
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
return CELL_NET_CTL_ERROR_NOT_INITIALIZED;
|
||||||
}
|
}
|
||||||
|
@ -352,8 +352,3 @@ struct CellGameUpdateParam
|
|||||||
|
|
||||||
using CellGameUpdateCallback = void(s32 status, s32 error_code, vm::ptr<void> userdata);
|
using CellGameUpdateCallback = void(s32 status, s32 error_code, vm::ptr<void> userdata);
|
||||||
using CellGameUpdateCallbackEx = void(vm::ptr<CellGameUpdateResult> result, vm::ptr<void> userdata);
|
using CellGameUpdateCallbackEx = void(vm::ptr<CellGameUpdateResult> result, vm::ptr<void> userdata);
|
||||||
|
|
||||||
struct cell_net_ctl_manager
|
|
||||||
{
|
|
||||||
atomic_t<bool> is_initialized = false;
|
|
||||||
};
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -9,14 +9,14 @@
|
|||||||
error_code sceNpInit(u32 poolsize, vm::ptr<void> poolptr);
|
error_code sceNpInit(u32 poolsize, vm::ptr<void> poolptr);
|
||||||
error_code sceNpTerm();
|
error_code sceNpTerm();
|
||||||
|
|
||||||
using in_addr_t = u32;
|
using np_in_addr_t = u32;
|
||||||
using in_port_t = u16;
|
using np_in_port_t = u16;
|
||||||
using sa_family_t = u8;
|
using np_sa_family_t = u8;
|
||||||
using socklen_t = u32;
|
using np_socklen_t = u32;
|
||||||
|
|
||||||
struct in_addr
|
struct np_in_addr
|
||||||
{
|
{
|
||||||
in_addr_t s_addr; // TODO: alignment?
|
np_in_addr_t np_s_addr; // TODO: alignment?
|
||||||
};
|
};
|
||||||
|
|
||||||
using sys_memory_container_t = u32;
|
using sys_memory_container_t = u32;
|
||||||
@ -1121,8 +1121,8 @@ union SceNpSignalingConnectionInfo
|
|||||||
SceNpId npId;
|
SceNpId npId;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
be_t<u32> addr; // in_addr
|
np_in_addr addr; // in_addr
|
||||||
be_t<u16> port; // in_port_t
|
np_in_port_t port; // in_port_t
|
||||||
} address;
|
} address;
|
||||||
be_t<u32> packet_loss;
|
be_t<u32> packet_loss;
|
||||||
};
|
};
|
||||||
@ -1298,22 +1298,3 @@ using SceNpMatchingGUIHandler = void(u32 ctx_id, s32 event, s32 error_code, vm::
|
|||||||
using SceNpProfileResultHandler = s32(s32 result, vm::ptr<void> arg);
|
using SceNpProfileResultHandler = s32(s32 result, vm::ptr<void> arg);
|
||||||
|
|
||||||
using SceNpManagerSubSigninCallback = void(s32 result, vm::ptr<SceNpId> npId, vm::ptr<void> cb_arg);
|
using SceNpManagerSubSigninCallback = void(s32 result, vm::ptr<SceNpId> npId, vm::ptr<void> cb_arg);
|
||||||
|
|
||||||
// fxm objects
|
|
||||||
|
|
||||||
struct sce_np_manager
|
|
||||||
{
|
|
||||||
std::atomic<bool> is_initialized = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sce_np_lookup_manager
|
|
||||||
{
|
|
||||||
std::atomic<bool> is_initialized = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sce_np_score_manager
|
|
||||||
{
|
|
||||||
std::atomic<bool> is_initialized = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern s32 g_psn_connection_status;
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
|
||||||
|
extern logs::channel sceNp2;
|
||||||
|
|
||||||
// Error codes
|
// Error codes
|
||||||
enum SceNpMatching2Error : u32
|
enum SceNpMatching2Error : u32
|
||||||
{
|
{
|
||||||
@ -485,6 +487,7 @@ typedef u8 SceNpMatching2Operator;
|
|||||||
typedef u8 SceNpMatching2CastType;
|
typedef u8 SceNpMatching2CastType;
|
||||||
typedef u8 SceNpMatching2SessionType;
|
typedef u8 SceNpMatching2SessionType;
|
||||||
typedef u8 SceNpMatching2SignalingType;
|
typedef u8 SceNpMatching2SignalingType;
|
||||||
|
typedef u8 SceNpMatching2SignalingFlag;
|
||||||
typedef u8 SceNpMatching2EventCause;
|
typedef u8 SceNpMatching2EventCause;
|
||||||
typedef u8 SceNpMatching2ServerStatus;
|
typedef u8 SceNpMatching2ServerStatus;
|
||||||
typedef u8 SceNpMatching2Role;
|
typedef u8 SceNpMatching2Role;
|
||||||
@ -537,7 +540,7 @@ struct SceNpMatching2BinAttr
|
|||||||
{
|
{
|
||||||
be_t<SceNpMatching2AttributeId> id;
|
be_t<SceNpMatching2AttributeId> id;
|
||||||
u8 padding[2];
|
u8 padding[2];
|
||||||
be_t<u32> ptr;
|
vm::bptr<u8> ptr;
|
||||||
be_t<u32> size;
|
be_t<u32> size;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -587,9 +590,9 @@ struct SceNpMatching2JoinedSessionInfo
|
|||||||
// User information
|
// User information
|
||||||
struct SceNpMatching2UserInfo
|
struct SceNpMatching2UserInfo
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2UserInfo> next;
|
vm::bptr<SceNpMatching2UserInfo> next;
|
||||||
SceNpUserInfo2 userInfo;
|
SceNpUserInfo2 userInfo;
|
||||||
vm::ptr<SceNpMatching2BinAttr> userBinAttr;
|
vm::bptr<SceNpMatching2BinAttr> userBinAttr;
|
||||||
be_t<u32> userBinAttrNum;
|
be_t<u32> userBinAttrNum;
|
||||||
SceNpMatching2JoinedSessionInfo joinedSessionInfo;
|
SceNpMatching2JoinedSessionInfo joinedSessionInfo;
|
||||||
be_t<u32> joinedSessionInfoNum;
|
be_t<u32> joinedSessionInfoNum;
|
||||||
@ -628,15 +631,15 @@ struct SceNpMatching2LobbyMemberBinAttrInternal
|
|||||||
// Lobby-internal lobby member information
|
// Lobby-internal lobby member information
|
||||||
struct SceNpMatching2LobbyMemberDataInternal
|
struct SceNpMatching2LobbyMemberDataInternal
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2LobbyMemberDataInternal> next;
|
vm::bptr<SceNpMatching2LobbyMemberDataInternal> next;
|
||||||
SceNpUserInfo2 userInfo;
|
SceNpUserInfo2 userInfo;
|
||||||
CellRtcTick joinDate;
|
CellRtcTick joinDate;
|
||||||
be_t<SceNpMatching2LobbyMemberId> memberId;
|
be_t<SceNpMatching2LobbyMemberId> memberId;
|
||||||
u8 padding[2];
|
u8 padding[2];
|
||||||
be_t<SceNpMatching2FlagAttr> flagAttr;
|
be_t<SceNpMatching2FlagAttr> flagAttr;
|
||||||
vm::ptr<SceNpMatching2JoinedSessionInfo> joinedSessionInfo;
|
vm::bptr<SceNpMatching2JoinedSessionInfo> joinedSessionInfo;
|
||||||
be_t<u32> joinedSessionInfoNum;
|
be_t<u32> joinedSessionInfoNum;
|
||||||
vm::ptr<SceNpMatching2LobbyMemberBinAttrInternal> lobbyMemberBinAttrInternal;
|
vm::bptr<SceNpMatching2LobbyMemberBinAttrInternal> lobbyMemberBinAttrInternal;
|
||||||
be_t<u32> lobbyMemberBinAttrInternalNum; // Unsigned ints are be_t<u32> not uint, right?
|
be_t<u32> lobbyMemberBinAttrInternalNum; // Unsigned ints are be_t<u32> not uint, right?
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -661,7 +664,7 @@ struct SceNpMatching2LobbyBinAttrInternal
|
|||||||
// Lobby-external lobby information
|
// Lobby-external lobby information
|
||||||
struct SceNpMatching2LobbyDataExternal
|
struct SceNpMatching2LobbyDataExternal
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2LobbyDataExternal> next;
|
vm::bptr<SceNpMatching2LobbyDataExternal> next;
|
||||||
be_t<SceNpMatching2ServerId> serverId;
|
be_t<SceNpMatching2ServerId> serverId;
|
||||||
u8 padding1[2];
|
u8 padding1[2];
|
||||||
be_t<SceNpMatching2WorldId> worldId;
|
be_t<SceNpMatching2WorldId> worldId;
|
||||||
@ -670,11 +673,11 @@ struct SceNpMatching2LobbyDataExternal
|
|||||||
be_t<u32> maxSlot;
|
be_t<u32> maxSlot;
|
||||||
be_t<u32> curMemberNum;
|
be_t<u32> curMemberNum;
|
||||||
be_t<u32> flagAttr;
|
be_t<u32> flagAttr;
|
||||||
vm::ptr<SceNpMatching2IntAttr> lobbySearchableIntAttrExternal;
|
vm::bptr<SceNpMatching2IntAttr> lobbySearchableIntAttrExternal;
|
||||||
be_t<u32> lobbySearchableIntAttrExternalNum;
|
be_t<u32> lobbySearchableIntAttrExternalNum;
|
||||||
vm::ptr<SceNpMatching2BinAttr> lobbySearchableBinAttrExternal;
|
vm::bptr<SceNpMatching2BinAttr> lobbySearchableBinAttrExternal;
|
||||||
be_t<u32> lobbySearchableBinAttrExternalNum;
|
be_t<u32> lobbySearchableBinAttrExternalNum;
|
||||||
vm::ptr<SceNpMatching2BinAttr> lobbyBinAttrExternal;
|
vm::bptr<SceNpMatching2BinAttr> lobbyBinAttrExternal;
|
||||||
be_t<u32> lobbyBinAttrExternalNum;
|
be_t<u32> lobbyBinAttrExternalNum;
|
||||||
u8 padding3[4];
|
u8 padding3[4];
|
||||||
};
|
};
|
||||||
@ -689,7 +692,7 @@ struct SceNpMatching2LobbyDataInternal
|
|||||||
be_t<u32> maxSlot;
|
be_t<u32> maxSlot;
|
||||||
SceNpMatching2LobbyMemberIdList memberIdList;
|
SceNpMatching2LobbyMemberIdList memberIdList;
|
||||||
be_t<SceNpMatching2FlagAttr> flagAttr;
|
be_t<SceNpMatching2FlagAttr> flagAttr;
|
||||||
vm::ptr<SceNpMatching2LobbyBinAttrInternal> lobbyBinAttrInternal;
|
vm::bptr<SceNpMatching2LobbyBinAttrInternal> lobbyBinAttrInternal;
|
||||||
be_t<u32> lobbyBinAttrInternalNum;
|
be_t<u32> lobbyBinAttrInternalNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -752,7 +755,7 @@ struct SceNpMatching2RoomMemberBinAttrInternal
|
|||||||
// External room member data
|
// External room member data
|
||||||
struct SceNpMatching2RoomMemberDataExternal
|
struct SceNpMatching2RoomMemberDataExternal
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomMemberDataExternal> next;
|
vm::bptr<SceNpMatching2RoomMemberDataExternal> next;
|
||||||
SceNpUserInfo2 userInfo;
|
SceNpUserInfo2 userInfo;
|
||||||
CellRtcTick joinDate;
|
CellRtcTick joinDate;
|
||||||
SceNpMatching2Role role;
|
SceNpMatching2Role role;
|
||||||
@ -762,27 +765,27 @@ struct SceNpMatching2RoomMemberDataExternal
|
|||||||
// Internal room member data
|
// Internal room member data
|
||||||
struct SceNpMatching2RoomMemberDataInternal
|
struct SceNpMatching2RoomMemberDataInternal
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomMemberDataInternal> next;
|
vm::bptr<SceNpMatching2RoomMemberDataInternal> next;
|
||||||
SceNpUserInfo2 userInfo;
|
SceNpUserInfo2 userInfo;
|
||||||
CellRtcTick joinDate;
|
CellRtcTick joinDate;
|
||||||
be_t<SceNpMatching2RoomMemberId> memberId;
|
be_t<SceNpMatching2RoomMemberId> memberId;
|
||||||
SceNpMatching2TeamId teamId;
|
SceNpMatching2TeamId teamId;
|
||||||
u8 padding1[1];
|
u8 padding1[1];
|
||||||
vm::ptr<SceNpMatching2RoomGroup> roomGroup;
|
vm::bptr<SceNpMatching2RoomGroup> roomGroup;
|
||||||
SceNpMatching2NatType natType;
|
SceNpMatching2NatType natType;
|
||||||
u8 padding2[3];
|
u8 padding2[3];
|
||||||
be_t<SceNpMatching2FlagAttr> flagAttr;
|
be_t<SceNpMatching2FlagAttr> flagAttr;
|
||||||
vm::ptr<SceNpMatching2RoomMemberBinAttrInternal> roomMemberBinAttrInternal;
|
vm::bptr<SceNpMatching2RoomMemberBinAttrInternal> roomMemberBinAttrInternal;
|
||||||
be_t<u32> roomMemberBinAttrInternalNum;
|
be_t<u32> roomMemberBinAttrInternalNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Internal room member data list
|
// Internal room member data list
|
||||||
struct SceNpMatching2RoomMemberDataInternalList
|
struct SceNpMatching2RoomMemberDataInternalList
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomMemberDataInternal> members;
|
vm::bptr<SceNpMatching2RoomMemberDataInternal> members;
|
||||||
be_t<u32> membersNum;
|
be_t<u32> membersNum;
|
||||||
vm::ptr<SceNpMatching2RoomMemberDataInternal> me;
|
vm::bptr<SceNpMatching2RoomMemberDataInternal> me;
|
||||||
vm::ptr<SceNpMatching2RoomMemberDataInternal> owner;
|
vm::bptr<SceNpMatching2RoomMemberDataInternal> owner;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Internal room binary attribute
|
// Internal room binary attribute
|
||||||
@ -797,7 +800,7 @@ struct SceNpMatching2RoomBinAttrInternal
|
|||||||
// External room data
|
// External room data
|
||||||
struct SceNpMatching2RoomDataExternal
|
struct SceNpMatching2RoomDataExternal
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomDataExternal> next;
|
vm::bptr<SceNpMatching2RoomDataExternal> next;
|
||||||
be_t<SceNpMatching2ServerId> serverId;
|
be_t<SceNpMatching2ServerId> serverId;
|
||||||
u8 padding1[2];
|
u8 padding1[2];
|
||||||
be_t<SceNpMatching2WorldId> worldId;
|
be_t<SceNpMatching2WorldId> worldId;
|
||||||
@ -810,15 +813,15 @@ struct SceNpMatching2RoomDataExternal
|
|||||||
be_t<u16> openPrivateSlotNum;
|
be_t<u16> openPrivateSlotNum;
|
||||||
be_t<u16> curMemberNum;
|
be_t<u16> curMemberNum;
|
||||||
be_t<SceNpMatching2RoomPasswordSlotMask> passwordSlotMask;
|
be_t<SceNpMatching2RoomPasswordSlotMask> passwordSlotMask;
|
||||||
vm::ptr<SceNpUserInfo2> owner;
|
vm::bptr<SceNpUserInfo2> owner;
|
||||||
vm::ptr<SceNpMatching2RoomGroup> roomGroup;
|
vm::bptr<SceNpMatching2RoomGroup> roomGroup;
|
||||||
be_t<u32> roomGroupNum;
|
be_t<u32> roomGroupNum;
|
||||||
be_t<u32> flagAttr;
|
be_t<u32> flagAttr;
|
||||||
vm::ptr<SceNpMatching2IntAttr> roomSearchableIntAttrExternal;
|
vm::bptr<SceNpMatching2IntAttr> roomSearchableIntAttrExternal;
|
||||||
be_t<u32> roomSearchableIntAttrExternalNum;
|
be_t<u32> roomSearchableIntAttrExternalNum;
|
||||||
vm::ptr<SceNpMatching2BinAttr> roomSearchableBinAttrExternal;
|
vm::bptr<SceNpMatching2BinAttr> roomSearchableBinAttrExternal;
|
||||||
be_t<u32> roomSearchableBinAttrExternalNum;
|
be_t<u32> roomSearchableBinAttrExternalNum;
|
||||||
vm::ptr<SceNpMatching2BinAttr> roomBinAttrExternal;
|
vm::bptr<SceNpMatching2BinAttr> roomBinAttrExternal;
|
||||||
be_t<u32> roomBinAttrExternalNum;
|
be_t<u32> roomBinAttrExternalNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -833,10 +836,10 @@ struct SceNpMatching2RoomDataInternal
|
|||||||
be_t<SceNpMatching2RoomPasswordSlotMask> passwordSlotMask;
|
be_t<SceNpMatching2RoomPasswordSlotMask> passwordSlotMask;
|
||||||
be_t<u32> maxSlot;
|
be_t<u32> maxSlot;
|
||||||
SceNpMatching2RoomMemberDataInternalList memberList;
|
SceNpMatching2RoomMemberDataInternalList memberList;
|
||||||
vm::ptr<SceNpMatching2RoomGroup> roomGroup;
|
vm::bptr<SceNpMatching2RoomGroup> roomGroup;
|
||||||
be_t<u32> roomGroupNum;
|
be_t<u32> roomGroupNum;
|
||||||
be_t<SceNpMatching2FlagAttr> flagAttr;
|
be_t<SceNpMatching2FlagAttr> flagAttr;
|
||||||
vm::ptr<SceNpMatching2RoomBinAttrInternal> roomBinAttrInternal;
|
vm::bptr<SceNpMatching2RoomBinAttrInternal> roomBinAttrInternal;
|
||||||
be_t<u32> roomBinAttrInternalNum;
|
be_t<u32> roomBinAttrInternalNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -857,9 +860,9 @@ union SceNpMatching2RoomMessageDestination
|
|||||||
// Invitation data
|
// Invitation data
|
||||||
struct SceNpMatching2InvitationData
|
struct SceNpMatching2InvitationData
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2JoinedSessionInfo> targetSession;
|
vm::bptr<SceNpMatching2JoinedSessionInfo> targetSession;
|
||||||
be_t<u32> targetSessionNum;
|
be_t<u32> targetSessionNum;
|
||||||
vm::ptr<void> optData;
|
vm::bptr<void> optData;
|
||||||
be_t<u32> optDataLen;
|
be_t<u32> optDataLen;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -867,7 +870,7 @@ struct SceNpMatching2InvitationData
|
|||||||
struct SceNpMatching2SignalingOptParam
|
struct SceNpMatching2SignalingOptParam
|
||||||
{
|
{
|
||||||
SceNpMatching2SignalingType type;
|
SceNpMatching2SignalingType type;
|
||||||
u8 reserved1[1];
|
SceNpMatching2SignalingFlag flag;
|
||||||
be_t<SceNpMatching2RoomMemberId> hubMemberId;
|
be_t<SceNpMatching2RoomMemberId> hubMemberId;
|
||||||
u8 reserved2[4];
|
u8 reserved2[4];
|
||||||
};
|
};
|
||||||
@ -875,8 +878,8 @@ struct SceNpMatching2SignalingOptParam
|
|||||||
// Option parameters for requests
|
// Option parameters for requests
|
||||||
struct SceNpMatching2RequestOptParam
|
struct SceNpMatching2RequestOptParam
|
||||||
{
|
{
|
||||||
SceNpMatching2RequestCallback cbFunc;
|
vm::bptr<SceNpMatching2RequestCallback> cbFunc;
|
||||||
vm::ptr<void> cbFuncArg;
|
vm::bptr<void> cbFuncArg;
|
||||||
be_t<u32> timeout;
|
be_t<u32> timeout;
|
||||||
be_t<u16> appReqId;
|
be_t<u16> appReqId;
|
||||||
u8 padding[2];
|
u8 padding[2];
|
||||||
@ -927,7 +930,7 @@ struct SceNpMatching2GetWorldInfoListRequest
|
|||||||
// World data list request response data
|
// World data list request response data
|
||||||
struct SceNpMatching2GetWorldInfoListResponse
|
struct SceNpMatching2GetWorldInfoListResponse
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2World> world;
|
vm::bptr<SceNpMatching2World> world;
|
||||||
be_t<u32> worldNum;
|
be_t<u32> worldNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -936,7 +939,7 @@ struct SceNpMatching2SetUserInfoRequest
|
|||||||
{
|
{
|
||||||
be_t<SceNpMatching2ServerId> serverId;
|
be_t<SceNpMatching2ServerId> serverId;
|
||||||
u8 padding[2];
|
u8 padding[2];
|
||||||
vm::ptr<SceNpMatching2BinAttr> userBinAttr;
|
vm::bptr<SceNpMatching2BinAttr> userBinAttr;
|
||||||
be_t<u32> userBinAttrNum;
|
be_t<u32> userBinAttrNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -945,7 +948,7 @@ struct SceNpMatching2GetUserInfoListRequest
|
|||||||
{
|
{
|
||||||
be_t<SceNpMatching2ServerId> serverId;
|
be_t<SceNpMatching2ServerId> serverId;
|
||||||
u8 padding[2];
|
u8 padding[2];
|
||||||
vm::ptr<SceNpId> npId;
|
vm::bptr<SceNpId> npId;
|
||||||
be_t<u32> npIdNum;
|
be_t<u32> npIdNum;
|
||||||
vm::bptr<SceNpMatching2AttributeId> attrId;
|
vm::bptr<SceNpMatching2AttributeId> attrId;
|
||||||
be_t<u32> attrIdNum;
|
be_t<u32> attrIdNum;
|
||||||
@ -955,7 +958,7 @@ struct SceNpMatching2GetUserInfoListRequest
|
|||||||
// User information list acquisition response data
|
// User information list acquisition response data
|
||||||
struct SceNpMatching2GetUserInfoListResponse
|
struct SceNpMatching2GetUserInfoListResponse
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2UserInfo> userInfo;
|
vm::bptr<SceNpMatching2UserInfo> userInfo;
|
||||||
be_t<u32> userInfoNum;
|
be_t<u32> userInfoNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -968,7 +971,7 @@ struct SceNpMatching2GetRoomMemberDataExternalListRequest
|
|||||||
// External room member data list request response data
|
// External room member data list request response data
|
||||||
struct SceNpMatching2GetRoomMemberDataExternalListResponse
|
struct SceNpMatching2GetRoomMemberDataExternalListResponse
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomMemberDataExternal> roomMemberDataExternal;
|
vm::bptr<SceNpMatching2RoomMemberDataExternal> roomMemberDataExternal;
|
||||||
be_t<u32> roomMemberDataExternalNum;
|
be_t<u32> roomMemberDataExternalNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -976,11 +979,11 @@ struct SceNpMatching2GetRoomMemberDataExternalListResponse
|
|||||||
struct SceNpMatching2SetRoomDataExternalRequest
|
struct SceNpMatching2SetRoomDataExternalRequest
|
||||||
{
|
{
|
||||||
be_t<SceNpMatching2RoomId> roomId;
|
be_t<SceNpMatching2RoomId> roomId;
|
||||||
vm::ptr<SceNpMatching2IntAttr> roomSearchableIntAttrExternal;
|
vm::bptr<SceNpMatching2IntAttr> roomSearchableIntAttrExternal;
|
||||||
be_t<u32> roomSearchableIntAttrExternalNum;
|
be_t<u32> roomSearchableIntAttrExternalNum;
|
||||||
vm::ptr<SceNpMatching2BinAttr> roomSearchableBinAttrExternal;
|
vm::bptr<SceNpMatching2BinAttr> roomSearchableBinAttrExternal;
|
||||||
be_t<u32> roomSearchableBinAttrExternalNum;
|
be_t<u32> roomSearchableBinAttrExternalNum;
|
||||||
vm::ptr<SceNpMatching2BinAttr> roomBinAttrExternal;
|
vm::bptr<SceNpMatching2BinAttr> roomBinAttrExternal;
|
||||||
be_t<u32> roomBinAttrExternalNum;
|
be_t<u32> roomBinAttrExternalNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -996,7 +999,7 @@ struct SceNpMatching2GetRoomDataExternalListRequest
|
|||||||
// External room data list request response data
|
// External room data list request response data
|
||||||
struct SceNpMatching2GetRoomDataExternalListResponse
|
struct SceNpMatching2GetRoomDataExternalListResponse
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomDataExternal> roomDataExternal;
|
vm::bptr<SceNpMatching2RoomDataExternal> roomDataExternal;
|
||||||
be_t<u32> roomDataExternalNum;
|
be_t<u32> roomDataExternalNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1008,44 +1011,44 @@ struct SceNpMatching2CreateJoinRoomRequest
|
|||||||
be_t<SceNpMatching2LobbyId> lobbyId;
|
be_t<SceNpMatching2LobbyId> lobbyId;
|
||||||
be_t<u32> maxSlot;
|
be_t<u32> maxSlot;
|
||||||
be_t<u32> flagAttr;
|
be_t<u32> flagAttr;
|
||||||
vm::ptr<SceNpMatching2BinAttr> roomBinAttrInternal;
|
vm::bptr<SceNpMatching2BinAttr> roomBinAttrInternal;
|
||||||
be_t<u32> roomBinAttrInternalNum;
|
be_t<u32> roomBinAttrInternalNum;
|
||||||
vm::ptr<SceNpMatching2IntAttr> roomSearchableIntAttrExternal;
|
vm::bptr<SceNpMatching2IntAttr> roomSearchableIntAttrExternal;
|
||||||
be_t<u32> roomSearchableIntAttrExternalNum;
|
be_t<u32> roomSearchableIntAttrExternalNum;
|
||||||
vm::ptr<SceNpMatching2BinAttr> roomSearchableBinAttrExternal;
|
vm::bptr<SceNpMatching2BinAttr> roomSearchableBinAttrExternal;
|
||||||
be_t<u32> roomSearchableBinAttrExternalNum;
|
be_t<u32> roomSearchableBinAttrExternalNum;
|
||||||
vm::ptr<SceNpMatching2BinAttr> roomBinAttrExternal;
|
vm::bptr<SceNpMatching2BinAttr> roomBinAttrExternal;
|
||||||
be_t<u32> roomBinAttrExternalNum;
|
be_t<u32> roomBinAttrExternalNum;
|
||||||
vm::ptr<SceNpMatching2SessionPassword> roomPassword;
|
vm::bptr<SceNpMatching2SessionPassword> roomPassword;
|
||||||
vm::ptr<SceNpMatching2RoomGroupConfig> groupConfig;
|
vm::bptr<SceNpMatching2RoomGroupConfig> groupConfig;
|
||||||
be_t<u32> groupConfigNum;
|
be_t<u32> groupConfigNum;
|
||||||
vm::bptr<SceNpMatching2RoomPasswordSlotMask> passwordSlotMask;
|
vm::bptr<SceNpMatching2RoomPasswordSlotMask> passwordSlotMask;
|
||||||
vm::ptr<SceNpId> allowedUser;
|
vm::bptr<SceNpId> allowedUser;
|
||||||
be_t<u32> allowedUserNum;
|
be_t<u32> allowedUserNum;
|
||||||
vm::ptr<SceNpId> blockedUser;
|
vm::bptr<SceNpId> blockedUser;
|
||||||
be_t<u32> blockedUserNum;
|
be_t<u32> blockedUserNum;
|
||||||
vm::ptr<SceNpMatching2GroupLabel> joinRoomGroupLabel;
|
vm::bptr<SceNpMatching2GroupLabel> joinRoomGroupLabel;
|
||||||
vm::ptr<SceNpMatching2BinAttr> roomMemberBinAttrInternal;
|
vm::bptr<SceNpMatching2BinAttr> roomMemberBinAttrInternal;
|
||||||
be_t<u32> roomMemberBinAttrInternalNum;
|
be_t<u32> roomMemberBinAttrInternalNum;
|
||||||
SceNpMatching2TeamId teamId;
|
SceNpMatching2TeamId teamId;
|
||||||
u8 padding2[3];
|
u8 padding2[3];
|
||||||
SceNpMatching2SignalingOptParam sigOptParam;
|
vm::bptr<SceNpMatching2SignalingOptParam> sigOptParam;
|
||||||
u8 padding3[4];
|
u8 padding3[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create-and-join room request response data
|
// Create-and-join room request response data
|
||||||
struct SceNpMatching2CreateJoinRoomResponse
|
struct SceNpMatching2CreateJoinRoomResponse
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomDataInternal> roomDataInternal;
|
vm::bptr<SceNpMatching2RoomDataInternal> roomDataInternal;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Join room request parameters
|
// Join room request parameters
|
||||||
struct SceNpMatching2JoinRoomRequest
|
struct SceNpMatching2JoinRoomRequest
|
||||||
{
|
{
|
||||||
be_t<SceNpMatching2RoomId> roomId;
|
be_t<SceNpMatching2RoomId> roomId;
|
||||||
vm::ptr<SceNpMatching2SessionPassword> roomPassword;
|
vm::bptr<SceNpMatching2SessionPassword> roomPassword;
|
||||||
vm::ptr<SceNpMatching2GroupLabel> joinRoomGroupLabel;
|
vm::bptr<SceNpMatching2GroupLabel> joinRoomGroupLabel;
|
||||||
vm::ptr<SceNpMatching2BinAttr> roomMemberBinAttrInternal;
|
vm::bptr<SceNpMatching2BinAttr> roomMemberBinAttrInternal;
|
||||||
be_t<u32> roomMemberBinAttrInternalNum;
|
be_t<u32> roomMemberBinAttrInternalNum;
|
||||||
SceNpMatching2PresenceOptionData optData;
|
SceNpMatching2PresenceOptionData optData;
|
||||||
SceNpMatching2TeamId teamId;
|
SceNpMatching2TeamId teamId;
|
||||||
@ -1055,7 +1058,7 @@ struct SceNpMatching2JoinRoomRequest
|
|||||||
// Join room request response data
|
// Join room request response data
|
||||||
struct SceNpMatching2JoinRoomResponse
|
struct SceNpMatching2JoinRoomResponse
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomDataInternal> roomDataInternal;
|
vm::bptr<SceNpMatching2RoomDataInternal> roomDataInternal;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Leave room request parameters
|
// Leave room request parameters
|
||||||
@ -1094,9 +1097,9 @@ struct SceNpMatching2SearchRoomRequest
|
|||||||
SceNpMatching2RangeFilter rangeFilter;
|
SceNpMatching2RangeFilter rangeFilter;
|
||||||
be_t<SceNpMatching2FlagAttr> flagFilter;
|
be_t<SceNpMatching2FlagAttr> flagFilter;
|
||||||
be_t<SceNpMatching2FlagAttr> flagAttr;
|
be_t<SceNpMatching2FlagAttr> flagAttr;
|
||||||
vm::ptr<SceNpMatching2IntSearchFilter> intFilter;
|
vm::bptr<SceNpMatching2IntSearchFilter> intFilter;
|
||||||
be_t<u32> intFilterNum;
|
be_t<u32> intFilterNum;
|
||||||
vm::ptr<SceNpMatching2BinSearchFilter> binFilter;
|
vm::bptr<SceNpMatching2BinSearchFilter> binFilter;
|
||||||
be_t<u32> binFilterNum;
|
be_t<u32> binFilterNum;
|
||||||
vm::bptr<SceNpMatching2AttributeId> attrId;
|
vm::bptr<SceNpMatching2AttributeId> attrId;
|
||||||
be_t<u32> attrIdNum;
|
be_t<u32> attrIdNum;
|
||||||
@ -1106,7 +1109,7 @@ struct SceNpMatching2SearchRoomRequest
|
|||||||
struct SceNpMatching2SearchRoomResponse
|
struct SceNpMatching2SearchRoomResponse
|
||||||
{
|
{
|
||||||
SceNpMatching2Range range;
|
SceNpMatching2Range range;
|
||||||
vm::ptr<SceNpMatching2RoomDataExternal> roomDataExternal;
|
vm::bptr<SceNpMatching2RoomDataExternal> roomDataExternal;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Room message send request parameters
|
// Room message send request parameters
|
||||||
@ -1145,9 +1148,9 @@ struct SceNpMatching2SetRoomDataInternalRequest
|
|||||||
be_t<SceNpMatching2RoomId> roomId;
|
be_t<SceNpMatching2RoomId> roomId;
|
||||||
be_t<SceNpMatching2FlagAttr> flagFilter;
|
be_t<SceNpMatching2FlagAttr> flagFilter;
|
||||||
be_t<SceNpMatching2FlagAttr> flagAttr;
|
be_t<SceNpMatching2FlagAttr> flagAttr;
|
||||||
vm::ptr<SceNpMatching2BinAttr> roomBinAttrInternal;
|
vm::bptr<SceNpMatching2BinAttr> roomBinAttrInternal;
|
||||||
be_t<u32> roomBinAttrInternalNum;
|
be_t<u32> roomBinAttrInternalNum;
|
||||||
vm::ptr<SceNpMatching2RoomGroupPasswordConfig> passwordConfig;
|
vm::bptr<SceNpMatching2RoomGroupPasswordConfig> passwordConfig;
|
||||||
be_t<u32> passwordConfigNum;
|
be_t<u32> passwordConfigNum;
|
||||||
vm::bptr<SceNpMatching2RoomPasswordSlotMask> passwordSlotMask;
|
vm::bptr<SceNpMatching2RoomPasswordSlotMask> passwordSlotMask;
|
||||||
vm::bptr<SceNpMatching2RoomMemberId> ownerPrivilegeRank;
|
vm::bptr<SceNpMatching2RoomMemberId> ownerPrivilegeRank;
|
||||||
@ -1166,7 +1169,7 @@ struct SceNpMatching2GetRoomDataInternalRequest
|
|||||||
// Internal room data request response data
|
// Internal room data request response data
|
||||||
struct SceNpMatching2GetRoomDataInternalResponse
|
struct SceNpMatching2GetRoomDataInternalResponse
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomDataInternal> roomDataInternal;
|
vm::bptr<SceNpMatching2RoomDataInternal> roomDataInternal;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Internal room member data configuration request parameters
|
// Internal room member data configuration request parameters
|
||||||
@ -1178,7 +1181,7 @@ struct SceNpMatching2SetRoomMemberDataInternalRequest
|
|||||||
u8 padding[5];
|
u8 padding[5];
|
||||||
be_t<SceNpMatching2FlagAttr> flagFilter;
|
be_t<SceNpMatching2FlagAttr> flagFilter;
|
||||||
be_t<SceNpMatching2FlagAttr> flagAttr;
|
be_t<SceNpMatching2FlagAttr> flagAttr;
|
||||||
vm::ptr<SceNpMatching2BinAttr> roomMemberBinAttrInternal;
|
vm::bptr<SceNpMatching2BinAttr> roomMemberBinAttrInternal;
|
||||||
be_t<u32> roomMemberBinAttrInternalNum;
|
be_t<u32> roomMemberBinAttrInternalNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1195,7 +1198,7 @@ struct SceNpMatching2GetRoomMemberDataInternalRequest
|
|||||||
// Internal room member data request response data
|
// Internal room member data request response data
|
||||||
struct SceNpMatching2GetRoomMemberDataInternalResponse
|
struct SceNpMatching2GetRoomMemberDataInternalResponse
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomMemberDataInternal> roomMemberDataInternal;
|
vm::bptr<SceNpMatching2RoomMemberDataInternal> roomMemberDataInternal;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Signaling option parameter setting request parameter
|
// Signaling option parameter setting request parameter
|
||||||
@ -1218,16 +1221,16 @@ struct SceNpMatching2GetLobbyInfoListRequest
|
|||||||
struct SceNpMatching2GetLobbyInfoListResponse
|
struct SceNpMatching2GetLobbyInfoListResponse
|
||||||
{
|
{
|
||||||
SceNpMatching2Range range;
|
SceNpMatching2Range range;
|
||||||
vm::ptr<SceNpMatching2LobbyDataExternal> lobbyDataExternal;
|
vm::bptr<SceNpMatching2LobbyDataExternal> lobbyDataExternal;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Lobby joining request parameter
|
// Lobby joining request parameter
|
||||||
struct SceNpMatching2JoinLobbyRequest
|
struct SceNpMatching2JoinLobbyRequest
|
||||||
{
|
{
|
||||||
be_t<SceNpMatching2LobbyId> lobbyId;
|
be_t<SceNpMatching2LobbyId> lobbyId;
|
||||||
vm::ptr<SceNpMatching2JoinedSessionInfo> joinedSessionInfo;
|
vm::bptr<SceNpMatching2JoinedSessionInfo> joinedSessionInfo;
|
||||||
be_t<u32> joinedSessionInfoNum;
|
be_t<u32> joinedSessionInfoNum;
|
||||||
vm::ptr<SceNpMatching2BinAttr> lobbyMemberBinAttrInternal;
|
vm::bptr<SceNpMatching2BinAttr> lobbyMemberBinAttrInternal;
|
||||||
be_t<u32> lobbyMemberBinAttrInternalNum;
|
be_t<u32> lobbyMemberBinAttrInternalNum;
|
||||||
SceNpMatching2PresenceOptionData optData;
|
SceNpMatching2PresenceOptionData optData;
|
||||||
u8 padding[4];
|
u8 padding[4];
|
||||||
@ -1236,7 +1239,7 @@ struct SceNpMatching2JoinLobbyRequest
|
|||||||
// Lobby joining response data
|
// Lobby joining response data
|
||||||
struct SceNpMatching2JoinLobbyResponse
|
struct SceNpMatching2JoinLobbyResponse
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2LobbyDataInternal> lobbyDataInternal;
|
vm::bptr<SceNpMatching2LobbyDataInternal> lobbyDataInternal;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Lobby leaving request parameter
|
// Lobby leaving request parameter
|
||||||
@ -1284,9 +1287,9 @@ struct SceNpMatching2SetLobbyMemberDataInternalRequest
|
|||||||
u8 padding1[2];
|
u8 padding1[2];
|
||||||
be_t<SceNpMatching2FlagAttr> flagFilter;
|
be_t<SceNpMatching2FlagAttr> flagFilter;
|
||||||
be_t<SceNpMatching2FlagAttr> flagAttr;
|
be_t<SceNpMatching2FlagAttr> flagAttr;
|
||||||
vm::ptr<SceNpMatching2JoinedSessionInfo> joinedSessionInfo;
|
vm::bptr<SceNpMatching2JoinedSessionInfo> joinedSessionInfo;
|
||||||
be_t<u32> joinedSessionInfoNum;
|
be_t<u32> joinedSessionInfoNum;
|
||||||
vm::ptr<SceNpMatching2BinAttr> lobbyMemberBinAttrInternal;
|
vm::bptr<SceNpMatching2BinAttr> lobbyMemberBinAttrInternal;
|
||||||
be_t<u32> lobbyMemberBinAttrInternalNum;
|
be_t<u32> lobbyMemberBinAttrInternalNum;
|
||||||
u8 padding2[4];
|
u8 padding2[4];
|
||||||
};
|
};
|
||||||
@ -1304,7 +1307,7 @@ struct SceNpMatching2GetLobbyMemberDataInternalRequest
|
|||||||
// Lobby-internal lobby member information acquisition response data
|
// Lobby-internal lobby member information acquisition response data
|
||||||
struct SceNpMatching2GetLobbyMemberDataInternalResponse
|
struct SceNpMatching2GetLobbyMemberDataInternalResponse
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2LobbyMemberDataInternal> lobbyMemberDataInternal;
|
vm::bptr<SceNpMatching2LobbyMemberDataInternal> lobbyMemberDataInternal;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Request parameters for obtaining a list of lobby-internal lobby member information
|
// Request parameters for obtaining a list of lobby-internal lobby member information
|
||||||
@ -1322,7 +1325,7 @@ struct SceNpMatching2GetLobbyMemberDataInternalListRequest
|
|||||||
// Reponse data for obtaining a list of lobby-internal lobby member information
|
// Reponse data for obtaining a list of lobby-internal lobby member information
|
||||||
struct SceNpMatching2GetLobbyMemberDataInternalListResponse
|
struct SceNpMatching2GetLobbyMemberDataInternalListResponse
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2LobbyMemberDataInternal> lobbyMemberDataInternal;
|
vm::bptr<SceNpMatching2LobbyMemberDataInternal> lobbyMemberDataInternal;
|
||||||
be_t<u32> lobbyMemberDataInternalNum;
|
be_t<u32> lobbyMemberDataInternalNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1348,14 +1351,14 @@ struct SceNpMatching2SignalingGetPingInfoResponse
|
|||||||
struct SceNpMatching2JoinProhibitiveRoomRequest
|
struct SceNpMatching2JoinProhibitiveRoomRequest
|
||||||
{
|
{
|
||||||
SceNpMatching2JoinRoomRequest joinParam;
|
SceNpMatching2JoinRoomRequest joinParam;
|
||||||
vm::ptr<SceNpId> blockedUser;
|
vm::bptr<SceNpId> blockedUser;
|
||||||
be_t<u32> blockedUserNum;
|
be_t<u32> blockedUserNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Room member update information
|
// Room member update information
|
||||||
struct SceNpMatching2RoomMemberUpdateInfo
|
struct SceNpMatching2RoomMemberUpdateInfo
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomMemberDataInternal> roomMemberDataInternal;
|
vm::bptr<SceNpMatching2RoomMemberDataInternal> roomMemberDataInternal;
|
||||||
SceNpMatching2EventCause eventCause;
|
SceNpMatching2EventCause eventCause;
|
||||||
u8 padding[3];
|
u8 padding[3];
|
||||||
SceNpMatching2PresenceOptionData optData;
|
SceNpMatching2PresenceOptionData optData;
|
||||||
@ -1368,7 +1371,7 @@ struct SceNpMatching2RoomOwnerUpdateInfo
|
|||||||
be_t<SceNpMatching2RoomMemberId> newOwner;
|
be_t<SceNpMatching2RoomMemberId> newOwner;
|
||||||
SceNpMatching2EventCause eventCause;
|
SceNpMatching2EventCause eventCause;
|
||||||
u8 padding[3];
|
u8 padding[3];
|
||||||
vm::ptr<SceNpMatching2SessionPassword> roomPassword;
|
vm::bptr<SceNpMatching2SessionPassword> roomPassword;
|
||||||
SceNpMatching2PresenceOptionData optData;
|
SceNpMatching2PresenceOptionData optData;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1384,7 +1387,7 @@ struct SceNpMatching2RoomUpdateInfo
|
|||||||
// Internal room data update information
|
// Internal room data update information
|
||||||
struct SceNpMatching2RoomDataInternalUpdateInfo
|
struct SceNpMatching2RoomDataInternalUpdateInfo
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomDataInternal> newRoomDataInternal;
|
vm::bptr<SceNpMatching2RoomDataInternal> newRoomDataInternal;
|
||||||
vm::bptr<SceNpMatching2FlagAttr> newFlagAttr;
|
vm::bptr<SceNpMatching2FlagAttr> newFlagAttr;
|
||||||
vm::bptr<SceNpMatching2FlagAttr> prevFlagAttr;
|
vm::bptr<SceNpMatching2FlagAttr> prevFlagAttr;
|
||||||
vm::bptr<SceNpMatching2RoomPasswordSlotMask> newRoomPasswordSlotMask;
|
vm::bptr<SceNpMatching2RoomPasswordSlotMask> newRoomPasswordSlotMask;
|
||||||
@ -1398,7 +1401,7 @@ struct SceNpMatching2RoomDataInternalUpdateInfo
|
|||||||
// Internal room member data update information
|
// Internal room member data update information
|
||||||
struct SceNpMatching2RoomMemberDataInternalUpdateInfo
|
struct SceNpMatching2RoomMemberDataInternalUpdateInfo
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2RoomMemberDataInternal> newRoomMemberDataInternal;
|
vm::bptr<SceNpMatching2RoomMemberDataInternal> newRoomMemberDataInternal;
|
||||||
vm::bptr<SceNpMatching2FlagAttr> newFlagAttr;
|
vm::bptr<SceNpMatching2FlagAttr> newFlagAttr;
|
||||||
vm::bptr<SceNpMatching2FlagAttr> prevFlagAttr;
|
vm::bptr<SceNpMatching2FlagAttr> prevFlagAttr;
|
||||||
vm::bptr<SceNpMatching2TeamId> newTeamId;
|
vm::bptr<SceNpMatching2TeamId> newTeamId;
|
||||||
@ -1412,8 +1415,8 @@ struct SceNpMatching2RoomMessageInfo
|
|||||||
b8 filtered;
|
b8 filtered;
|
||||||
SceNpMatching2CastType castType;
|
SceNpMatching2CastType castType;
|
||||||
u8 padding[2];
|
u8 padding[2];
|
||||||
vm::ptr<SceNpMatching2RoomMessageDestination> dst;
|
vm::bptr<SceNpMatching2RoomMessageDestination> dst;
|
||||||
vm::ptr<SceNpUserInfo2> srcMember;
|
vm::bptr<SceNpUserInfo2> srcMember;
|
||||||
vm::cptr<void> msg;
|
vm::cptr<void> msg;
|
||||||
be_t<u32> msgLen;
|
be_t<u32> msgLen;
|
||||||
};
|
};
|
||||||
@ -1421,7 +1424,7 @@ struct SceNpMatching2RoomMessageInfo
|
|||||||
// Lobby member update information
|
// Lobby member update information
|
||||||
struct SceNpMatching2LobbyMemberUpdateInfo
|
struct SceNpMatching2LobbyMemberUpdateInfo
|
||||||
{
|
{
|
||||||
vm::ptr<SceNpMatching2LobbyMemberDataInternal> lobbyMemberDataInternal;
|
vm::bptr<SceNpMatching2LobbyMemberDataInternal> lobbyMemberDataInternal;
|
||||||
SceNpMatching2EventCause eventCause;
|
SceNpMatching2EventCause eventCause;
|
||||||
u8 padding[3];
|
u8 padding[3];
|
||||||
SceNpMatching2PresenceOptionData optData;
|
SceNpMatching2PresenceOptionData optData;
|
||||||
@ -1445,7 +1448,7 @@ struct SceNpMatching2LobbyMemberDataInternalUpdateInfo
|
|||||||
be_t<SceNpMatching2FlagAttr> newFlagAttr;
|
be_t<SceNpMatching2FlagAttr> newFlagAttr;
|
||||||
SceNpMatching2JoinedSessionInfo newJoinedSessionInfo;
|
SceNpMatching2JoinedSessionInfo newJoinedSessionInfo;
|
||||||
be_t<u32> newJoinedSessionInfoNum;
|
be_t<u32> newJoinedSessionInfoNum;
|
||||||
vm::ptr<SceNpMatching2LobbyMemberBinAttrInternal> newLobbyMemberBinAttrInternal;
|
vm::bptr<SceNpMatching2LobbyMemberBinAttrInternal> newLobbyMemberBinAttrInternal;
|
||||||
be_t<u32> newLobbyMemberBinAttrInternalNum;
|
be_t<u32> newLobbyMemberBinAttrInternalNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1455,8 +1458,8 @@ struct SceNpMatching2LobbyMessageInfo
|
|||||||
b8 filtered;
|
b8 filtered;
|
||||||
SceNpMatching2CastType castType;
|
SceNpMatching2CastType castType;
|
||||||
u8 padding[2];
|
u8 padding[2];
|
||||||
vm::ptr<SceNpMatching2LobbyMessageDestination> dst;
|
vm::bptr<SceNpMatching2LobbyMessageDestination> dst;
|
||||||
vm::ptr<SceNpUserInfo2> srcMember;
|
vm::bptr<SceNpUserInfo2> srcMember;
|
||||||
vm::cptr<void> msg;
|
vm::cptr<void> msg;
|
||||||
be_t<u32> msgLen;
|
be_t<u32> msgLen;
|
||||||
};
|
};
|
||||||
@ -1466,8 +1469,8 @@ struct SceNpMatching2LobbyInvitationInfo
|
|||||||
{
|
{
|
||||||
SceNpMatching2CastType castType;
|
SceNpMatching2CastType castType;
|
||||||
u8 padding[3];
|
u8 padding[3];
|
||||||
vm::ptr<SceNpMatching2LobbyMessageDestination> dst;
|
vm::bptr<SceNpMatching2LobbyMessageDestination> dst;
|
||||||
vm::ptr<SceNpUserInfo2> srcMember;
|
vm::bptr<SceNpUserInfo2> srcMember;
|
||||||
SceNpMatching2InvitationData invitationData;
|
SceNpMatching2InvitationData invitationData;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1579,20 +1582,3 @@ struct SceNpAuthGetAuthorizationCodeParameter
|
|||||||
vm::bcptr<SceNpClientId> pClientId;
|
vm::bcptr<SceNpClientId> pClientId;
|
||||||
vm::bcptr<char> pScope;
|
vm::bcptr<char> pScope;
|
||||||
};
|
};
|
||||||
|
|
||||||
// fxm objects
|
|
||||||
|
|
||||||
struct sce_np_2_manager
|
|
||||||
{
|
|
||||||
std::atomic<bool> is_initialized = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sce_np_2_matching_manager
|
|
||||||
{
|
|
||||||
std::atomic<bool> is_initialized = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sce_np_oauth_2_manager
|
|
||||||
{
|
|
||||||
std::atomic<bool> is_initialized = false;
|
|
||||||
};
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "sceNpSns.h"
|
#include "sceNpSns.h"
|
||||||
#include "sceNp.h"
|
#include "sceNp.h"
|
||||||
|
#include "Emu/NP/np_handler.h"
|
||||||
|
|
||||||
LOG_CHANNEL(sceNpSns);
|
LOG_CHANNEL(sceNpSns);
|
||||||
|
|
||||||
@ -182,7 +183,9 @@ error_code sceNpSnsFbGetAccessToken(u32 handle, vm::cptr<SceNpSnsFbAccessTokenPa
|
|||||||
return SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE;
|
return SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_psn_connection_status == SCE_NP_MANAGER_STATUS_OFFLINE)
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
|
||||||
|
if (nph->get_psn_status() == SCE_NP_MANAGER_STATUS_OFFLINE)
|
||||||
{
|
{
|
||||||
return not_an_error(SCE_NP_SNS_ERROR_NOT_SIGN_IN);
|
return not_an_error(SCE_NP_SNS_ERROR_NOT_SIGN_IN);
|
||||||
}
|
}
|
||||||
@ -307,7 +310,9 @@ error_code sceNpSnsFbGetLongAccessToken(u32 handle, vm::cptr<SceNpSnsFbAccessTok
|
|||||||
return SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE;
|
return SCE_NP_SNS_FB_ERROR_UNKNOWN_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_psn_connection_status == SCE_NP_MANAGER_STATUS_OFFLINE)
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
|
||||||
|
if (nph->get_psn_status() == SCE_NP_MANAGER_STATUS_OFFLINE)
|
||||||
{
|
{
|
||||||
return not_an_error(SCE_NP_SNS_ERROR_NOT_SIGN_IN);
|
return not_an_error(SCE_NP_SNS_ERROR_NOT_SIGN_IN);
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "Emu/NP/np_handler.h"
|
||||||
|
|
||||||
LOG_CHANNEL(sys_net);
|
LOG_CHANNEL(sys_net);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -155,6 +157,7 @@ static sys_net_error get_last_error(bool is_blocking, int native_error = 0)
|
|||||||
ERROR_CASE(EALREADY);
|
ERROR_CASE(EALREADY);
|
||||||
ERROR_CASE(ENOTCONN);
|
ERROR_CASE(ENOTCONN);
|
||||||
ERROR_CASE(ECONNRESET);
|
ERROR_CASE(ECONNRESET);
|
||||||
|
ERROR_CASE(EADDRINUSE);
|
||||||
default: sys_net.error("Unknown/illegal socket error: %d", native_error);
|
default: sys_net.error("Unknown/illegal socket error: %d", native_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -335,8 +338,8 @@ struct network_thread
|
|||||||
|
|
||||||
using network_context = named_thread<network_thread>;
|
using network_context = named_thread<network_thread>;
|
||||||
|
|
||||||
lv2_socket::lv2_socket(lv2_socket::socket_type s)
|
lv2_socket::lv2_socket(lv2_socket::socket_type s, s32 s_type)
|
||||||
: socket(s)
|
: socket(s), type(s_type)
|
||||||
{
|
{
|
||||||
// Set non-blocking
|
// Set non-blocking
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -454,7 +457,7 @@ error_code sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr>
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto newsock = std::make_shared<lv2_socket>(native_socket);
|
auto newsock = std::make_shared<lv2_socket>(native_socket, 0);
|
||||||
|
|
||||||
result = idm::import_existing<lv2_socket>(newsock);
|
result = idm::import_existing<lv2_socket>(newsock);
|
||||||
|
|
||||||
@ -491,7 +494,8 @@ error_code sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr<sys_net_sockaddr>
|
|||||||
|
|
||||||
sys_net.warning("sys_net_bnet_bind(s=%d, addr=*0x%x, addrlen=%u)", s, addr, addrlen);
|
sys_net.warning("sys_net_bnet_bind(s=%d, addr=*0x%x, addrlen=%u)", s, addr, addrlen);
|
||||||
|
|
||||||
if (addr->sa_family != SYS_NET_AF_INET)
|
// 0 presumably defaults to AF_INET(to check?)
|
||||||
|
if (addr->sa_family != SYS_NET_AF_INET && addr->sa_family != 0)
|
||||||
{
|
{
|
||||||
sys_net.error("sys_net_bnet_bind(s=%d): unsupported sa_family (%d)", s, addr->sa_family);
|
sys_net.error("sys_net_bnet_bind(s=%d): unsupported sa_family (%d)", s, addr->sa_family);
|
||||||
return -SYS_NET_EAFNOSUPPORT;
|
return -SYS_NET_EAFNOSUPPORT;
|
||||||
@ -507,6 +511,18 @@ error_code sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr<sys_net_sockaddr>
|
|||||||
|
|
||||||
const auto sock = idm::check<lv2_socket>(s, [&](lv2_socket& sock) -> sys_net_error
|
const auto sock = idm::check<lv2_socket>(s, [&](lv2_socket& sock) -> sys_net_error
|
||||||
{
|
{
|
||||||
|
if (sock.type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
{
|
||||||
|
const u16 daport = reinterpret_cast<const sys_net_sockaddr_in*>(addr.get_ptr())->sin_port;
|
||||||
|
const u16 davport = reinterpret_cast<const sys_net_sockaddr_in_p2p*>(addr.get_ptr())->sin_vport;
|
||||||
|
sys_net.warning("Trying to bind %s:%d:%d", inet_ntoa(name.sin_addr), daport, davport);
|
||||||
|
name.sin_port = std::bit_cast<u16, be_t<u16>>(daport + davport); // htons(daport + davport)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sys_net.warning("Trying to bind %s:%d", inet_ntoa(name.sin_addr), std::bit_cast<be_t<u16>, u16>(name.sin_port)); // ntohs(name.sin_port)
|
||||||
|
}
|
||||||
|
|
||||||
std::lock_guard lock(sock.mutex);
|
std::lock_guard lock(sock.mutex);
|
||||||
|
|
||||||
if (::bind(sock.socket, reinterpret_cast<struct sockaddr*>(&name), namelen) == 0)
|
if (::bind(sock.socket, reinterpret_cast<struct sockaddr*>(&name), namelen) == 0)
|
||||||
@ -545,21 +561,27 @@ error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr
|
|||||||
name.sin_addr.s_addr = std::bit_cast<u32>(psa_in->sin_addr);
|
name.sin_addr.s_addr = std::bit_cast<u32>(psa_in->sin_addr);
|
||||||
::socklen_t namelen = sizeof(name);
|
::socklen_t namelen = sizeof(name);
|
||||||
|
|
||||||
|
sys_net.warning("Attempting to connect on %s:%d", inet_ntoa(name.sin_addr), std::bit_cast<be_t<u16>, u16>(name.sin_port)); // ntohs(name.sin_port)
|
||||||
|
|
||||||
const auto sock = idm::check<lv2_socket>(s, [&](lv2_socket& sock)
|
const auto sock = idm::check<lv2_socket>(s, [&](lv2_socket& sock)
|
||||||
{
|
{
|
||||||
std::lock_guard lock(sock.mutex);
|
std::lock_guard lock(sock.mutex);
|
||||||
|
|
||||||
if (addr->sa_family == 0 && !psa_in->sin_port && !psa_in->sin_addr)
|
if (addr->sa_family == 0 && !psa_in->sin_port && !psa_in->sin_addr)
|
||||||
{
|
{
|
||||||
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
|
||||||
// Hack for DNS (8.8.8.8:53)
|
// Hack for DNS (8.8.8.8:53)
|
||||||
name.sin_port = std::bit_cast<u16, be_t<u16>>(53);
|
name.sin_port = std::bit_cast<u16, be_t<u16>>(53);
|
||||||
name.sin_addr.s_addr = 0x08080808;
|
name.sin_addr.s_addr = nph->get_dns();
|
||||||
|
|
||||||
// Overwrite arg (probably used to validate recvfrom addr)
|
// Overwrite arg (probably used to validate recvfrom addr)
|
||||||
psa_in->sin_family = SYS_NET_AF_INET;
|
psa_in->sin_family = SYS_NET_AF_INET;
|
||||||
psa_in->sin_port = 53;
|
psa_in->sin_port = 53;
|
||||||
psa_in->sin_addr = 0x08080808;
|
psa_in->sin_addr = nph->get_dns();
|
||||||
sys_net.warning("sys_net_bnet_connect(s=%d): using DNS 8.8.8.8:53...");
|
sys_net.warning("sys_net_bnet_connect: using DNS...");
|
||||||
|
|
||||||
|
nph->add_dns_spy(s);
|
||||||
}
|
}
|
||||||
else if (addr->sa_family != SYS_NET_AF_INET)
|
else if (addr->sa_family != SYS_NET_AF_INET)
|
||||||
{
|
{
|
||||||
@ -717,6 +739,17 @@ error_code sys_net_bnet_getpeername(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sock
|
|||||||
paddr->sin_port = std::bit_cast<be_t<u16>, u16>(reinterpret_cast<struct sockaddr_in*>(&native_addr)->sin_port);
|
paddr->sin_port = std::bit_cast<be_t<u16>, u16>(reinterpret_cast<struct sockaddr_in*>(&native_addr)->sin_port);
|
||||||
paddr->sin_addr = std::bit_cast<be_t<u32>, u32>(reinterpret_cast<struct sockaddr_in*>(&native_addr)->sin_addr.s_addr);
|
paddr->sin_addr = std::bit_cast<be_t<u32>, u32>(reinterpret_cast<struct sockaddr_in*>(&native_addr)->sin_addr.s_addr);
|
||||||
paddr->sin_zero = 0;
|
paddr->sin_zero = 0;
|
||||||
|
|
||||||
|
if (sock.type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
{
|
||||||
|
vm::ptr<sys_net_sockaddr_in_p2p> paddr_p2p = vm::cast(addr.addr());
|
||||||
|
paddr_p2p->sin_vport = paddr_p2p->sin_port - 3658;
|
||||||
|
paddr_p2p->sin_port = 3658;
|
||||||
|
in_addr rep;
|
||||||
|
rep.s_addr = htonl(paddr->sin_addr);
|
||||||
|
sys_net.error("Reporting P2P socket address as %s:%d:%d", inet_ntoa(rep), paddr_p2p->sin_port, paddr_p2p->sin_vport);
|
||||||
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1037,16 +1070,54 @@ error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr<void> buf, u32
|
|||||||
native_flags |= MSG_WAITALL;
|
native_flags |= MSG_WAITALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s32 type = 0;
|
||||||
|
|
||||||
const auto sock = idm::check<lv2_socket>(s, [&](lv2_socket& sock)
|
const auto sock = idm::check<lv2_socket>(s, [&](lv2_socket& sock)
|
||||||
{
|
{
|
||||||
|
type = sock.type;
|
||||||
std::lock_guard lock(sock.mutex);
|
std::lock_guard lock(sock.mutex);
|
||||||
|
|
||||||
//if (!(sock.events & lv2_socket::poll::read))
|
//if (!(sock.events & lv2_socket::poll::read))
|
||||||
{
|
{
|
||||||
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
if (nph->is_dns(s) && nph->is_dns_queue(s))
|
||||||
|
{
|
||||||
|
const auto packet = nph->get_dns_packet(s);
|
||||||
|
ASSERT(packet.size() < len);
|
||||||
|
|
||||||
|
memcpy(buf.get_ptr(), packet.data(), packet.size());
|
||||||
|
native_result = packet.size();
|
||||||
|
|
||||||
|
native_addr.ss_family = AF_INET;
|
||||||
|
(reinterpret_cast<::sockaddr_in*>(&native_addr))->sin_port = std::bit_cast<u16, be_t<u16>>(53); // htons(53)
|
||||||
|
(reinterpret_cast<::sockaddr_in*>(&native_addr))->sin_addr.s_addr = nph->get_dns();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
native_result = ::recvfrom(sock.socket, reinterpret_cast<char*>(buf.get_ptr()), len, native_flags, reinterpret_cast<struct sockaddr*>(&native_addr), &native_addrlen);
|
native_result = ::recvfrom(sock.socket, reinterpret_cast<char*>(buf.get_ptr()), len, native_flags, reinterpret_cast<struct sockaddr*>(&native_addr), &native_addrlen);
|
||||||
|
|
||||||
if (native_result >= 0)
|
if (native_result >= 0)
|
||||||
{
|
{
|
||||||
|
if (sys_net.enabled == logs::level::trace)
|
||||||
|
{
|
||||||
|
std::string datrace;
|
||||||
|
const char hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
|
||||||
|
|
||||||
|
u8* dabuf = static_cast<u8 *>(buf.get_ptr());
|
||||||
|
|
||||||
|
for (s32 index = 0; index < native_result; index++)
|
||||||
|
{
|
||||||
|
if ((index % 16) == 0)
|
||||||
|
datrace += '\n';
|
||||||
|
|
||||||
|
datrace += hex[(dabuf[index] >> 4) & 15];
|
||||||
|
datrace += hex[(dabuf[index]) & 15];
|
||||||
|
datrace += ' ';
|
||||||
|
}
|
||||||
|
sys_net.trace("DNS RESULT: %s", datrace);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1083,6 +1154,8 @@ error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr<void> buf, u32
|
|||||||
|
|
||||||
if (!sock)
|
if (!sock)
|
||||||
{
|
{
|
||||||
|
if (type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
sys_net.error("Error recvfrom(bad socket)");
|
||||||
return -SYS_NET_EBADF;
|
return -SYS_NET_EBADF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1093,6 +1166,9 @@ error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr<void> buf, u32
|
|||||||
return not_an_error(-result);
|
return not_an_error(-result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
sys_net.error("Error recvfrom(result early): %d", result);
|
||||||
|
|
||||||
return -result;
|
return -result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1110,11 +1186,15 @@ error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr<void> buf, u32
|
|||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
|
if (type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
sys_net.error("Error recvfrom(result): %d", result);
|
||||||
return -result;
|
return -result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ppu.gpr[3] == static_cast<u64>(-SYS_NET_EINTR))
|
if (ppu.gpr[3] == static_cast<u64>(-SYS_NET_EINTR))
|
||||||
{
|
{
|
||||||
|
if (type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
sys_net.error("Error recvfrom(interrupted)");
|
||||||
return -SYS_NET_EINTR;
|
return -SYS_NET_EINTR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1141,9 +1221,23 @@ error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr<void> buf, u32
|
|||||||
paddr->sin_port = std::bit_cast<be_t<u16>, u16>(reinterpret_cast<struct sockaddr_in*>(&native_addr)->sin_port);
|
paddr->sin_port = std::bit_cast<be_t<u16>, u16>(reinterpret_cast<struct sockaddr_in*>(&native_addr)->sin_port);
|
||||||
paddr->sin_addr = std::bit_cast<be_t<u32>, u32>(reinterpret_cast<struct sockaddr_in*>(&native_addr)->sin_addr.s_addr);
|
paddr->sin_addr = std::bit_cast<be_t<u32>, u32>(reinterpret_cast<struct sockaddr_in*>(&native_addr)->sin_addr.s_addr);
|
||||||
paddr->sin_zero = 0;
|
paddr->sin_zero = 0;
|
||||||
|
|
||||||
|
if (type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
{
|
||||||
|
vm::ptr<sys_net_sockaddr_in_p2p> paddr_p2p = vm::cast(addr.addr());
|
||||||
|
paddr_p2p->sin_vport = paddr_p2p->sin_port - 3658;
|
||||||
|
paddr_p2p->sin_port = 3658;
|
||||||
|
|
||||||
|
const u16 daport = reinterpret_cast<sys_net_sockaddr_in*>(addr.get_ptr())->sin_port;
|
||||||
|
const u16 davport = reinterpret_cast<sys_net_sockaddr_in_p2p*>(addr.get_ptr())->sin_vport;
|
||||||
|
sys_net.error("Received a P2P packet from %s:%d:%d", inet_ntoa(reinterpret_cast<::sockaddr_in*>(&native_addr)->sin_addr), daport, davport);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Length
|
// Length
|
||||||
|
if (type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
sys_net.error("Ok recvfrom: %d", native_result);
|
||||||
|
|
||||||
return not_an_error(native_result);
|
return not_an_error(native_result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1207,12 +1301,34 @@ error_code sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr<void> buf, u32 l
|
|||||||
native_flags |= MSG_WAITALL;
|
native_flags |= MSG_WAITALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s32 type = 0;
|
||||||
const auto sock = idm::check<lv2_socket>(s, [&](lv2_socket& sock)
|
const auto sock = idm::check<lv2_socket>(s, [&](lv2_socket& sock)
|
||||||
{
|
{
|
||||||
|
type = sock.type;
|
||||||
|
if (sock.type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
{
|
||||||
|
const u16 daport = reinterpret_cast<const sys_net_sockaddr_in*>(addr.get_ptr())->sin_port;
|
||||||
|
const u16 davport = reinterpret_cast<const sys_net_sockaddr_in_p2p*>(addr.get_ptr())->sin_vport;
|
||||||
|
sys_net.error("Sending a P2P packet to %s:%d:%d", inet_ntoa(name.sin_addr), daport, davport);
|
||||||
|
name.sin_port = std::bit_cast<u16, be_t<u16>>(daport + davport); // htons(daport + davport)
|
||||||
|
}
|
||||||
|
|
||||||
std::lock_guard lock(sock.mutex);
|
std::lock_guard lock(sock.mutex);
|
||||||
|
|
||||||
//if (!(sock.events & lv2_socket::poll::write))
|
//if (!(sock.events & lv2_socket::poll::write))
|
||||||
{
|
{
|
||||||
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
if (nph->is_dns(s))
|
||||||
|
{
|
||||||
|
const s32 ret_analyzer = nph->analyze_dns_packet(s, static_cast<const u8*>(buf.get_ptr()), len);
|
||||||
|
// Check if the packet is intercepted
|
||||||
|
if (ret_analyzer >= 0)
|
||||||
|
{
|
||||||
|
native_result = ret_analyzer;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
native_result = ::sendto(sock.socket, reinterpret_cast<const char*>(buf.get_ptr()), len, native_flags, addr ? reinterpret_cast<struct sockaddr*>(&name) : nullptr, addr ? namelen : 0);
|
native_result = ::sendto(sock.socket, reinterpret_cast<const char*>(buf.get_ptr()), len, native_flags, addr ? reinterpret_cast<struct sockaddr*>(&name) : nullptr, addr ? namelen : 0);
|
||||||
|
|
||||||
if (native_result >= 0)
|
if (native_result >= 0)
|
||||||
@ -1253,16 +1369,20 @@ error_code sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr<void> buf, u32 l
|
|||||||
|
|
||||||
if (!sock)
|
if (!sock)
|
||||||
{
|
{
|
||||||
|
if (type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
sys_net.error("Error sendto(bad socket)");
|
||||||
return -SYS_NET_EBADF;
|
return -SYS_NET_EBADF;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sock.ret && result)
|
if (!sock.ret && result)
|
||||||
{
|
{
|
||||||
|
if (type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
sys_net.error("Error sendto(early result): %d", result);
|
||||||
|
|
||||||
if (result == SYS_NET_EWOULDBLOCK)
|
if (result == SYS_NET_EWOULDBLOCK)
|
||||||
{
|
{
|
||||||
return not_an_error(-result);
|
return not_an_error(-result);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -result;
|
return -result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1280,16 +1400,23 @@ error_code sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr<void> buf, u32 l
|
|||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
|
if (type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
sys_net.error("Error sendto(result): %d", result);
|
||||||
return -result;
|
return -result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ppu.gpr[3] == static_cast<u64>(-SYS_NET_EINTR))
|
if (ppu.gpr[3] == static_cast<u64>(-SYS_NET_EINTR))
|
||||||
{
|
{
|
||||||
|
if (type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
sys_net.error("Error sendto(interrupted)");
|
||||||
return -SYS_NET_EINTR;
|
return -SYS_NET_EINTR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Length
|
// Length
|
||||||
|
if (type == SYS_NET_SOCK_DGRAM_P2P)
|
||||||
|
sys_net.error("Ok sendto: %d", native_result);
|
||||||
|
|
||||||
return not_an_error(native_result);
|
return not_an_error(native_result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1576,7 +1703,7 @@ error_code sys_net_bnet_socket(ppu_thread& ppu, s32 family, s32 type, s32 protoc
|
|||||||
return -get_last_error(false);
|
return -get_last_error(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
const s32 s = idm::import_existing<lv2_socket>(std::make_shared<lv2_socket>(native_socket));
|
const s32 s = idm::import_existing<lv2_socket>(std::make_shared<lv2_socket>(native_socket, type));
|
||||||
|
|
||||||
if (s == id_manager::id_traits<lv2_socket>::invalid)
|
if (s == id_manager::id_traits<lv2_socket>::invalid)
|
||||||
{
|
{
|
||||||
@ -1602,6 +1729,9 @@ error_code sys_net_bnet_close(ppu_thread& ppu, s32 s)
|
|||||||
if (!sock->queue.empty())
|
if (!sock->queue.empty())
|
||||||
sys_net.error("CLOSE");
|
sys_net.error("CLOSE");
|
||||||
|
|
||||||
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
nph->remove_dns_spy(s);
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1638,7 +1768,12 @@ error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr<sys_net_pollfd> fds, s32 n
|
|||||||
|
|
||||||
if (auto sock = idm::check_unlocked<lv2_socket>(fds[i].fd))
|
if (auto sock = idm::check_unlocked<lv2_socket>(fds[i].fd))
|
||||||
{
|
{
|
||||||
if (fds[i].events & ~(SYS_NET_POLLIN | SYS_NET_POLLOUT))
|
// Check for fake packet for dns interceptions
|
||||||
|
const auto nph = g_fxo->get<named_thread<np_handler>>();
|
||||||
|
if (fds[i].events & SYS_NET_POLLIN && nph->is_dns(fds[i].fd) && nph->is_dns_queue(fds[i].fd))
|
||||||
|
fds[i].revents |= SYS_NET_POLLIN;
|
||||||
|
|
||||||
|
if (fds[i].events & ~(SYS_NET_POLLIN | SYS_NET_POLLOUT | SYS_NET_POLLERR))
|
||||||
sys_net.error("sys_net_bnet_poll(fd=%d): events=0x%x", fds[i].fd, fds[i].events);
|
sys_net.error("sys_net_bnet_poll(fd=%d): events=0x%x", fds[i].fd, fds[i].events);
|
||||||
_fds[i].fd = sock->socket;
|
_fds[i].fd = sock->socket;
|
||||||
if (fds[i].events & SYS_NET_POLLIN)
|
if (fds[i].events & SYS_NET_POLLIN)
|
||||||
|
@ -328,7 +328,7 @@ struct lv2_socket final
|
|||||||
__bitset_enum_max
|
__bitset_enum_max
|
||||||
};
|
};
|
||||||
|
|
||||||
lv2_socket(socket_type s);
|
lv2_socket(socket_type s, s32 s_type);
|
||||||
~lv2_socket();
|
~lv2_socket();
|
||||||
|
|
||||||
shared_mutex mutex;
|
shared_mutex mutex;
|
||||||
@ -353,6 +353,8 @@ struct lv2_socket final
|
|||||||
// Unsupported option
|
// Unsupported option
|
||||||
s32 so_tcp_maxseg = 1500;
|
s32 so_tcp_maxseg = 1500;
|
||||||
|
|
||||||
|
s32 type = 0;
|
||||||
|
|
||||||
// Value keepers
|
// Value keepers
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
s32 so_reuseaddr = 0;
|
s32 so_reuseaddr = 0;
|
||||||
|
405
rpcs3/Emu/NP/np_handler.cpp
Normal file
405
rpcs3/Emu/NP/np_handler.cpp
Normal file
@ -0,0 +1,405 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
#include <thread>
|
||||||
|
#include "Emu/system_config.h"
|
||||||
|
#include "np_handler.h"
|
||||||
|
#include "Emu/Cell/PPUModule.h"
|
||||||
|
#include "Emu/Cell/Modules/sceNp.h"
|
||||||
|
#include "Emu/Cell/Modules/sceNp2.h"
|
||||||
|
#include "Emu/Cell/Modules/cellNetCtl.h"
|
||||||
|
#include "Utilities/StrUtil.h"
|
||||||
|
#include "Emu/Cell/Modules/cellSysutil.h"
|
||||||
|
#include "Emu/IdManager.h"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <WS2tcpip.h>
|
||||||
|
#else
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern logs::channel sys_net;
|
||||||
|
extern logs::channel sceNp2;
|
||||||
|
extern logs::channel sceNp;
|
||||||
|
|
||||||
|
np_handler::np_handler()
|
||||||
|
{
|
||||||
|
is_connected = (g_cfg.net.net_active == np_internet_status::enabled);
|
||||||
|
is_psn_active = (g_cfg.net.psn_status >= np_psn_status::fake);
|
||||||
|
|
||||||
|
// Validate IP/Get from host?
|
||||||
|
if (get_net_status() == CELL_NET_CTL_STATE_IPObtained)
|
||||||
|
{
|
||||||
|
// cur_ip = g_cfg.net.ip_address;
|
||||||
|
|
||||||
|
// Attempt to get actual IP address
|
||||||
|
const char* google_dns_server = "8.8.8.8";
|
||||||
|
const int dns_port = 53;
|
||||||
|
|
||||||
|
struct sockaddr_in serv;
|
||||||
|
const int sock = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
|
||||||
|
ASSERT(sock >= 0);
|
||||||
|
|
||||||
|
memset(&serv, 0, sizeof(serv));
|
||||||
|
serv.sin_family = AF_INET;
|
||||||
|
serv.sin_addr.s_addr = inet_addr(google_dns_server);
|
||||||
|
serv.sin_port = std::bit_cast<u16, be_t<u16>>(dns_port); // htons(dns_port)
|
||||||
|
|
||||||
|
int err = connect(sock, reinterpret_cast<const struct sockaddr*>(&serv), sizeof(serv));
|
||||||
|
if (err < 0)
|
||||||
|
{
|
||||||
|
sys_net.error("Failed to connect to google dns for IP discovery");
|
||||||
|
is_connected = false;
|
||||||
|
cur_ip = "0.0.0.0";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct sockaddr_in name;
|
||||||
|
socklen_t namelen = sizeof(name);
|
||||||
|
err = getsockname(sock, reinterpret_cast<struct sockaddr*>(&name), &namelen);
|
||||||
|
|
||||||
|
char buffer[80];
|
||||||
|
const char* p = inet_ntop(AF_INET, &name.sin_addr, buffer, 80);
|
||||||
|
|
||||||
|
if (p == nullptr)
|
||||||
|
{
|
||||||
|
sys_net.error("Failed to convert address for IP discovery");
|
||||||
|
is_connected = false;
|
||||||
|
cur_ip = "0.0.0.0";
|
||||||
|
}
|
||||||
|
cur_ip = p;
|
||||||
|
|
||||||
|
struct in_addr addr;
|
||||||
|
inet_pton(AF_INET, cur_ip.c_str(), &addr);
|
||||||
|
cur_addr = addr.s_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
closesocket(sock);
|
||||||
|
#else
|
||||||
|
close(sock);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Convert dns address
|
||||||
|
std::string s_dns = g_cfg.net.dns;
|
||||||
|
in_addr conv;
|
||||||
|
if (!inet_pton(AF_INET, s_dns.c_str(), &conv))
|
||||||
|
{
|
||||||
|
sys_net.error("Provided IP(%s) address for DNS is invalid!", s_dns);
|
||||||
|
is_connected = false;
|
||||||
|
conv.s_addr = 0;
|
||||||
|
cur_ip = "0.0.0.0";
|
||||||
|
}
|
||||||
|
dns = conv.s_addr;
|
||||||
|
|
||||||
|
// Init switch map for dns
|
||||||
|
auto swaps = fmt::split(g_cfg.net.swap_list, {"&&"});
|
||||||
|
for (std::size_t i = 0; i < swaps.size(); i++)
|
||||||
|
{
|
||||||
|
auto host_and_ip = fmt::split(swaps[i], {"="});
|
||||||
|
if (host_and_ip.size() != 2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
in_addr conv;
|
||||||
|
if (!inet_pton(AF_INET, host_and_ip[1].c_str(), &conv))
|
||||||
|
{
|
||||||
|
sys_net.error("IP(%s) provided for %s in the switch list is invalid!", host_and_ip[1], host_and_ip[0]);
|
||||||
|
conv.s_addr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_map[host_and_ip[0]] = conv.s_addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cur_ip = "0.0.0.0";
|
||||||
|
dns = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void np_handler::init_NP(u32 poolsize, vm::ptr<void> poolptr)
|
||||||
|
{
|
||||||
|
// Init memory pool
|
||||||
|
mpool = poolptr;
|
||||||
|
mpool_size = poolsize;
|
||||||
|
mpool_avail = poolsize;
|
||||||
|
mpool_allocs.clear();
|
||||||
|
|
||||||
|
memset(&npid, 0, sizeof(npid));
|
||||||
|
memset(&online_name, 0, sizeof(online_name));
|
||||||
|
memset(&avatar_url, 0, sizeof(avatar_url));
|
||||||
|
|
||||||
|
if (g_cfg.net.psn_status >= np_psn_status::fake)
|
||||||
|
{
|
||||||
|
std::string s_npid = g_cfg.net.psn_npid;
|
||||||
|
ASSERT(s_npid != ""); // It should be generated in settings window if empty
|
||||||
|
|
||||||
|
strncpy(npid.handle.data, s_npid.c_str(), sizeof(npid.handle.data));
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (g_cfg.net.psn_status)
|
||||||
|
{
|
||||||
|
case np_psn_status::disabled:
|
||||||
|
break;
|
||||||
|
case np_psn_status::fake:
|
||||||
|
{
|
||||||
|
strncpy(online_name.data, "RPCS3's user", sizeof(online_name.data));
|
||||||
|
strncpy(avatar_url.data, "https://i.imgur.com/AfWIyQP.jpg", sizeof(avatar_url.data));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void np_handler::terminate_NP()
|
||||||
|
{
|
||||||
|
is_psn_active = false;
|
||||||
|
|
||||||
|
// Reset memory pool
|
||||||
|
mpool.set(0);
|
||||||
|
mpool_size = 0;
|
||||||
|
mpool_avail = 0;
|
||||||
|
mpool_allocs.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
vm::addr_t np_handler::allocate(u32 size)
|
||||||
|
{
|
||||||
|
// Align allocs
|
||||||
|
const u32 alloc_size = ::align(size, 4);
|
||||||
|
if (alloc_size > mpool_avail)
|
||||||
|
{
|
||||||
|
sceNp.error("Not enough memory available in NP pool!");
|
||||||
|
return vm::cast<u32>(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 last_free = 0;
|
||||||
|
bool found_space = false;
|
||||||
|
|
||||||
|
for (auto& a : mpool_allocs)
|
||||||
|
{
|
||||||
|
if ((a.first - last_free) >= alloc_size)
|
||||||
|
{
|
||||||
|
found_space = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
last_free = a.first + a.second;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found_space)
|
||||||
|
{
|
||||||
|
if ((mpool_size - last_free) < alloc_size)
|
||||||
|
{
|
||||||
|
sceNp.error("Not enough memory available in NP pool(continuous block)!");
|
||||||
|
return vm::cast<u32>(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mpool_allocs.emplace(last_free, alloc_size);
|
||||||
|
mpool_avail -= alloc_size;
|
||||||
|
|
||||||
|
memset((static_cast<u8*>(mpool.get_ptr())) + last_free, 0, alloc_size);
|
||||||
|
|
||||||
|
return vm::cast(mpool.addr() + last_free);
|
||||||
|
}
|
||||||
|
|
||||||
|
void np_handler::operator()()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 np_handler::get_net_status() const
|
||||||
|
{
|
||||||
|
return is_connected ? CELL_NET_CTL_STATE_IPObtained : CELL_NET_CTL_STATE_Disconnected;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 np_handler::get_psn_status() const
|
||||||
|
{
|
||||||
|
return is_psn_active ? SCE_NP_MANAGER_STATUS_ONLINE : SCE_NP_MANAGER_STATUS_OFFLINE;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& np_handler::get_ip() const
|
||||||
|
{
|
||||||
|
return cur_ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 np_handler::get_dns() const
|
||||||
|
{
|
||||||
|
return dns;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SceNpId& np_handler::get_npid() const
|
||||||
|
{
|
||||||
|
return npid;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SceNpOnlineId& np_handler::get_online_id() const
|
||||||
|
{
|
||||||
|
return npid.handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SceNpOnlineName& np_handler::get_online_name() const
|
||||||
|
{
|
||||||
|
return online_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SceNpAvatarUrl& np_handler::get_avatar_url() const
|
||||||
|
{
|
||||||
|
return avatar_url;
|
||||||
|
}
|
||||||
|
|
||||||
|
void np_handler::add_dns_spy(u32 sock)
|
||||||
|
{
|
||||||
|
dns_spylist.emplace(std::make_pair(sock, std::queue<std::vector<u8>>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void np_handler::remove_dns_spy(u32 sock)
|
||||||
|
{
|
||||||
|
dns_spylist.erase(sock);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool np_handler::is_dns(u32 sock) const
|
||||||
|
{
|
||||||
|
return dns_spylist.count(sock) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool np_handler::is_dns_queue(u32 sock) const
|
||||||
|
{
|
||||||
|
return !dns_spylist.at(sock).empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<u8> np_handler::get_dns_packet(u32 sock)
|
||||||
|
{
|
||||||
|
auto ret_vec = std::move(dns_spylist.at(sock).front());
|
||||||
|
dns_spylist.at(sock).pop();
|
||||||
|
|
||||||
|
return ret_vec;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 np_handler::analyze_dns_packet(s32 s, const u8* buf, u32 len)
|
||||||
|
{
|
||||||
|
if (sys_net.enabled == logs::level::trace)
|
||||||
|
{
|
||||||
|
std::string datrace;
|
||||||
|
const char hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
|
||||||
|
|
||||||
|
for (u32 index = 0; index < len; index++)
|
||||||
|
{
|
||||||
|
if ((index % 16) == 0)
|
||||||
|
datrace += '\n';
|
||||||
|
|
||||||
|
datrace += hex[(buf[index] >> 4) & 15];
|
||||||
|
datrace += hex[(buf[index]) & 15];
|
||||||
|
datrace += ' ';
|
||||||
|
}
|
||||||
|
sys_net.trace("DNS REQUEST: %s", datrace);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dns_header
|
||||||
|
{
|
||||||
|
u16 id; // identification number
|
||||||
|
|
||||||
|
u8 rd : 1; // recursion desired
|
||||||
|
u8 tc : 1; // truncated message
|
||||||
|
u8 aa : 1; // authoritive answer
|
||||||
|
u8 opcode : 4; // purpose of message
|
||||||
|
u8 qr : 1; // query/response flag
|
||||||
|
|
||||||
|
u8 rcode : 4; // response code
|
||||||
|
u8 cd : 1; // checking disabled
|
||||||
|
u8 ad : 1; // authenticated data
|
||||||
|
u8 z : 1; // its z! reserved
|
||||||
|
u8 ra : 1; // recursion available
|
||||||
|
|
||||||
|
be_t<u16> q_count; // number of question entries
|
||||||
|
be_t<u16> ans_count; // number of answer entries
|
||||||
|
be_t<u16> auth_count; // number of authority entries
|
||||||
|
be_t<u16> add_count; // number of resource entries
|
||||||
|
};
|
||||||
|
|
||||||
|
if (len < sizeof(dns_header))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
const dns_header* dhead = reinterpret_cast<const dns_header*>(buf);
|
||||||
|
// We are only looking for queries not truncated(todo?), only handle one dns query at a time(todo?)
|
||||||
|
if (dhead->qr != 0 || dhead->tc != 0 || dhead->q_count != 1 || dhead->ans_count != 0 || dhead->auth_count != 0 || dhead->add_count != 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
// Get the actual address
|
||||||
|
u8 count = 0;
|
||||||
|
std::string host{};
|
||||||
|
for (u32 i = sizeof(dns_header); (i < len) && buf[i] != 0; i++)
|
||||||
|
{
|
||||||
|
if (count == 0)
|
||||||
|
{
|
||||||
|
count = buf[i];
|
||||||
|
if (i != sizeof(dns_header))
|
||||||
|
{
|
||||||
|
host += '.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
host += static_cast<char>(buf[i]);
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sys_net.warning("DNS query for %s", host);
|
||||||
|
|
||||||
|
if (switch_map.count(host))
|
||||||
|
{
|
||||||
|
// design fake packet
|
||||||
|
std::vector<u8> fake(len);
|
||||||
|
memcpy(fake.data(), buf, len);
|
||||||
|
dns_header* fake_header = reinterpret_cast<dns_header*>(fake.data());
|
||||||
|
fake_header->qr = 1;
|
||||||
|
fake_header->ra = 1;
|
||||||
|
fake_header->ans_count = 1;
|
||||||
|
fake.insert(fake.end(), {0xC0, 0x0C}); // Ref to name in header
|
||||||
|
fake.insert(fake.end(), {0x00, 0x01}); // IPv4
|
||||||
|
fake.insert(fake.end(), {0x00, 0x01}); // Class?
|
||||||
|
fake.insert(fake.end(), {0x00, 0x00, 0x00, 0x3B}); // TTL
|
||||||
|
fake.insert(fake.end(), {0x00, 0x04}); // Size of data
|
||||||
|
u32 ip = switch_map[host];
|
||||||
|
u8* ptr_ip = reinterpret_cast<u8*>(&ip);
|
||||||
|
fake.insert(fake.end(), ptr_ip, ptr_ip + 4); // IP
|
||||||
|
|
||||||
|
sys_net.warning("Solving %s to %d.%d.%d.%d", host, ptr_ip[0], ptr_ip[1], ptr_ip[2], ptr_ip[3]);
|
||||||
|
|
||||||
|
dns_spylist[s].push(std::move(fake));
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 np_handler::create_score_context(vm::cptr<SceNpCommunicationId> communicationId, vm::cptr<SceNpCommunicationPassphrase> passphrase)
|
||||||
|
{
|
||||||
|
return static_cast<s32>(idm::make<score_ctx>(communicationId, passphrase));
|
||||||
|
}
|
||||||
|
bool np_handler::destroy_score_context(s32 ctx_id)
|
||||||
|
{
|
||||||
|
return idm::remove<score_ctx>(static_cast<u32>(ctx_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 np_handler::create_match2_context(vm::cptr<SceNpCommunicationId> communicationId, vm::cptr<SceNpCommunicationPassphrase> passphrase)
|
||||||
|
{
|
||||||
|
return static_cast<u16>(idm::make<match2_ctx>(communicationId, passphrase));
|
||||||
|
}
|
||||||
|
bool np_handler::destroy_match2_context(u16 ctx_id)
|
||||||
|
{
|
||||||
|
return idm::remove<match2_ctx>(static_cast<u32>(ctx_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 np_handler::create_lookup_context(vm::cptr<SceNpCommunicationId> communicationId)
|
||||||
|
{
|
||||||
|
return static_cast<s32>(idm::make<lookup_ctx>(communicationId));
|
||||||
|
}
|
||||||
|
bool np_handler::destroy_lookup_context(s32 ctx_id)
|
||||||
|
{
|
||||||
|
return idm::remove<match2_ctx>(static_cast<u32>(ctx_id));
|
||||||
|
}
|
128
rpcs3/Emu/NP/np_handler.h
Normal file
128
rpcs3/Emu/NP/np_handler.h
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Emu/Memory/vm_ptr.h"
|
||||||
|
#include "Emu/Cell/Modules/sceNp.h"
|
||||||
|
#include "Emu/Cell/Modules/sceNp2.h"
|
||||||
|
|
||||||
|
#include <queue>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
class np_handler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
np_handler();
|
||||||
|
|
||||||
|
s32 get_psn_status() const;
|
||||||
|
s32 get_net_status() const;
|
||||||
|
|
||||||
|
const std::string& get_ip() const;
|
||||||
|
u32 get_dns() const;
|
||||||
|
|
||||||
|
const SceNpId& get_npid() const;
|
||||||
|
const SceNpOnlineId& get_online_id() const;
|
||||||
|
const SceNpOnlineName& get_online_name() const;
|
||||||
|
const SceNpAvatarUrl& get_avatar_url() const;
|
||||||
|
|
||||||
|
// DNS hooking functions
|
||||||
|
void add_dns_spy(u32 sock);
|
||||||
|
void remove_dns_spy(u32 sock);
|
||||||
|
bool is_dns(u32 sock) const;
|
||||||
|
bool is_dns_queue(u32 sock) const;
|
||||||
|
std::vector<u8> get_dns_packet(u32 sock);
|
||||||
|
s32 analyze_dns_packet(s32 s, const u8* buf, u32 len);
|
||||||
|
|
||||||
|
void operator()();
|
||||||
|
|
||||||
|
void init_NP(u32 poolsize, vm::ptr<void> poolptr);
|
||||||
|
void terminate_NP();
|
||||||
|
|
||||||
|
bool is_netctl_init = false;
|
||||||
|
bool is_NP_init = false;
|
||||||
|
bool is_NP_Lookup_init = false;
|
||||||
|
bool is_NP_Score_init = false;
|
||||||
|
bool is_NP2_init = false;
|
||||||
|
bool is_NP2_Match2_init = false;
|
||||||
|
bool is_NP_Auth_init = false;
|
||||||
|
|
||||||
|
// Score related
|
||||||
|
struct score_ctx
|
||||||
|
{
|
||||||
|
score_ctx(vm::cptr<SceNpCommunicationId> communicationId, vm::cptr<SceNpCommunicationPassphrase> passphrase)
|
||||||
|
{
|
||||||
|
memcpy(&this->communicationId, communicationId.get_ptr(), sizeof(SceNpCommunicationId));
|
||||||
|
memcpy(&this->passphrase, passphrase.get_ptr(), sizeof(SceNpCommunicationPassphrase));
|
||||||
|
}
|
||||||
|
|
||||||
|
static const u32 id_base = 1;
|
||||||
|
static const u32 id_step = 1;
|
||||||
|
static const u32 id_count = 32;
|
||||||
|
|
||||||
|
SceNpCommunicationId communicationId;
|
||||||
|
SceNpCommunicationPassphrase passphrase;
|
||||||
|
};
|
||||||
|
s32 create_score_context(vm::cptr<SceNpCommunicationId> communicationId, vm::cptr<SceNpCommunicationPassphrase> passphrase);
|
||||||
|
bool destroy_score_context(s32 ctx_id);
|
||||||
|
|
||||||
|
// Match2 related
|
||||||
|
struct match2_ctx
|
||||||
|
{
|
||||||
|
match2_ctx(vm::cptr<SceNpCommunicationId> communicationId, vm::cptr<SceNpCommunicationPassphrase> passphrase)
|
||||||
|
{
|
||||||
|
memcpy(&this->communicationId, communicationId.get_ptr(), sizeof(SceNpCommunicationId));
|
||||||
|
memcpy(&this->passphrase, passphrase.get_ptr(), sizeof(SceNpCommunicationPassphrase));
|
||||||
|
}
|
||||||
|
|
||||||
|
static const u32 id_base = 1;
|
||||||
|
static const u32 id_step = 1;
|
||||||
|
static const u32 id_count = 255;
|
||||||
|
|
||||||
|
SceNpCommunicationId communicationId;
|
||||||
|
SceNpCommunicationPassphrase passphrase;
|
||||||
|
};
|
||||||
|
u16 create_match2_context(vm::cptr<SceNpCommunicationId> communicationId, vm::cptr<SceNpCommunicationPassphrase> passphrase);
|
||||||
|
bool destroy_match2_context(u16 ctx_id);
|
||||||
|
|
||||||
|
struct lookup_ctx
|
||||||
|
{
|
||||||
|
lookup_ctx(vm::cptr<SceNpCommunicationId> communicationId)
|
||||||
|
{
|
||||||
|
memcpy(&this->communicationId, communicationId.get_ptr(), sizeof(SceNpCommunicationId));
|
||||||
|
}
|
||||||
|
|
||||||
|
static const u32 id_base = 1;
|
||||||
|
static const u32 id_step = 1;
|
||||||
|
static const u32 id_count = 32;
|
||||||
|
|
||||||
|
SceNpCommunicationId communicationId;
|
||||||
|
SceNpCommunicationPassphrase passphrase;
|
||||||
|
};
|
||||||
|
s32 create_lookup_context(vm::cptr<SceNpCommunicationId> communicationId);
|
||||||
|
bool destroy_lookup_context(s32 ctx_id);
|
||||||
|
|
||||||
|
static constexpr std::string_view thread_name = "NP Handler Thread";
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool is_connected = false;
|
||||||
|
bool is_psn_active = false;
|
||||||
|
|
||||||
|
// Net infos
|
||||||
|
std::string cur_ip{};
|
||||||
|
u32 cur_addr = 0;
|
||||||
|
u32 dns = 0x08080808;
|
||||||
|
|
||||||
|
// User infos
|
||||||
|
SceNpId npid{};
|
||||||
|
SceNpOnlineName online_name{};
|
||||||
|
SceNpAvatarUrl avatar_url{};
|
||||||
|
|
||||||
|
// DNS related
|
||||||
|
std::map<s32, std::queue<std::vector<u8>>> dns_spylist{};
|
||||||
|
std::map<std::string, u32> switch_map{};
|
||||||
|
|
||||||
|
// Memory pool for sceNp/sceNp2
|
||||||
|
vm::ptr<void> mpool{};
|
||||||
|
u32 mpool_size = 0;
|
||||||
|
u32 mpool_avail = 0;
|
||||||
|
std::map<u32, u32> mpool_allocs{}; // offset/size
|
||||||
|
vm::addr_t allocate(u32 size);
|
||||||
|
};
|
@ -234,11 +234,15 @@ struct cfg_root : cfg::node
|
|||||||
{
|
{
|
||||||
node_net(cfg::node* _this) : cfg::node(_this, "Net") {}
|
node_net(cfg::node* _this) : cfg::node(_this, "Net") {}
|
||||||
|
|
||||||
cfg::_enum<CellNetCtlState> net_status{ this, "Connection status" };
|
cfg::_enum<np_internet_status> net_active{this, "Internet enabled", np_internet_status::disabled};
|
||||||
cfg::string ip_address{ this, "IP address", "192.168.1.1" };
|
cfg::string ip_address{this, "IP address", "0.0.0.0"};
|
||||||
|
cfg::string dns{this, "DNS address", "8.8.8.8"};
|
||||||
} net{ this };
|
cfg::string swap_list{this, "IP swap list", ""};
|
||||||
|
|
||||||
|
cfg::_enum<np_psn_status> psn_status{this, "PSN status", np_psn_status::disabled};
|
||||||
|
cfg::string psn_npid{this, "NPID", ""};
|
||||||
|
} net{this};
|
||||||
|
|
||||||
struct node_misc : cfg::node
|
struct node_misc : cfg::node
|
||||||
{
|
{
|
||||||
node_misc(cfg::node* _this) : cfg::node(_this, "Miscellaneous") {}
|
node_misc(cfg::node* _this) : cfg::node(_this, "Miscellaneous") {}
|
||||||
|
@ -205,3 +205,34 @@ void fmt_class_string<enter_button_assign>::format(std::string& out, u64 arg)
|
|||||||
return unknown;
|
return unknown;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
void fmt_class_string<np_internet_status>::format(std::string& out, u64 arg)
|
||||||
|
{
|
||||||
|
format_enum(out, arg, [](np_internet_status value)
|
||||||
|
{
|
||||||
|
switch (value)
|
||||||
|
{
|
||||||
|
case np_internet_status::disabled: return "Disconnected";
|
||||||
|
case np_internet_status::enabled: return "Connected";
|
||||||
|
}
|
||||||
|
|
||||||
|
return unknown;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
void fmt_class_string<np_psn_status>::format(std::string& out, u64 arg)
|
||||||
|
{
|
||||||
|
format_enum(out, arg, [](np_psn_status value)
|
||||||
|
{
|
||||||
|
switch (value)
|
||||||
|
{
|
||||||
|
case np_psn_status::disabled: return "Disconnected";
|
||||||
|
case np_psn_status::fake: return "Simulated";
|
||||||
|
}
|
||||||
|
|
||||||
|
return unknown;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -167,3 +167,15 @@ enum class enter_button_assign
|
|||||||
circle, // CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CIRCLE
|
circle, // CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CIRCLE
|
||||||
cross // CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CROSS
|
cross // CELL_SYSUTIL_ENTER_BUTTON_ASSIGN_CROSS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class np_internet_status
|
||||||
|
{
|
||||||
|
disabled,
|
||||||
|
enabled,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum np_psn_status
|
||||||
|
{
|
||||||
|
disabled,
|
||||||
|
fake,
|
||||||
|
};
|
||||||
|
@ -80,6 +80,7 @@
|
|||||||
<ClCompile Include="Emu\system_config_types.cpp" />
|
<ClCompile Include="Emu\system_config_types.cpp" />
|
||||||
<ClCompile Include="Emu\title.cpp" />
|
<ClCompile Include="Emu\title.cpp" />
|
||||||
<ClCompile Include="Emu\system_config.cpp" />
|
<ClCompile Include="Emu\system_config.cpp" />
|
||||||
|
<ClCompile Include="Emu\NP\np_handler.cpp" />
|
||||||
<ClCompile Include="util\atomic.cpp">
|
<ClCompile Include="util\atomic.cpp">
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -426,6 +427,7 @@
|
|||||||
<ClInclude Include="Emu\Io\Keyboard.h" />
|
<ClInclude Include="Emu\Io\Keyboard.h" />
|
||||||
<ClInclude Include="Emu\Io\pad_config.h" />
|
<ClInclude Include="Emu\Io\pad_config.h" />
|
||||||
<ClInclude Include="Emu\Io\pad_config_types.h" />
|
<ClInclude Include="Emu\Io\pad_config_types.h" />
|
||||||
|
<ClInclude Include="Emu\NP\np_handler.h" />
|
||||||
<ClInclude Include="Emu\RSX\Common\texture_cache_helpers.h" />
|
<ClInclude Include="Emu\RSX\Common\texture_cache_helpers.h" />
|
||||||
<ClInclude Include="Emu\RSX\Overlays\overlay_fonts.h" />
|
<ClInclude Include="Emu\RSX\Overlays\overlay_fonts.h" />
|
||||||
<ClInclude Include="Emu\RSX\Overlays\overlay_message_dialog.h" />
|
<ClInclude Include="Emu\RSX\Overlays\overlay_message_dialog.h" />
|
||||||
|
@ -72,6 +72,9 @@
|
|||||||
<Filter Include="Emu\GPU\RSX\Overlays\Shaders">
|
<Filter Include="Emu\GPU\RSX\Overlays\Shaders">
|
||||||
<UniqueIdentifier>{f368580d-07bc-4c8b-b488-a4198f2dd17d}</UniqueIdentifier>
|
<UniqueIdentifier>{f368580d-07bc-4c8b-b488-a4198f2dd17d}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="Emu\NP">
|
||||||
|
<UniqueIdentifier>{652ce43e-72db-42cd-831a-0e194f67e731}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="Crypto\aes.cpp">
|
<ClCompile Include="Crypto\aes.cpp">
|
||||||
@ -911,6 +914,9 @@
|
|||||||
<ClCompile Include="Emu\RSX\Overlays\overlay_utils.cpp">
|
<ClCompile Include="Emu\RSX\Overlays\overlay_utils.cpp">
|
||||||
<Filter>Emu\GPU\RSX\Overlays</Filter>
|
<Filter>Emu\GPU\RSX\Overlays</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="Emu\NP\np_handler.cpp">
|
||||||
|
<Filter>Emu\NP</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Crypto\aes.h">
|
<ClInclude Include="Crypto\aes.h">
|
||||||
@ -1741,5 +1747,8 @@
|
|||||||
<ClInclude Include="Emu\Io\GHLtar.h">
|
<ClInclude Include="Emu\Io\GHLtar.h">
|
||||||
<Filter>Emu\Io</Filter>
|
<Filter>Emu\Io</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="Emu\NP\np_handler.h">
|
||||||
|
<Filter>Emu\NP</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@ -10,6 +10,7 @@
|
|||||||
#include "Utilities/StrUtil.h"
|
#include "Utilities/StrUtil.h"
|
||||||
|
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QLineEdit>
|
||||||
|
|
||||||
#if defined(_WIN32) || defined(HAVE_VULKAN)
|
#if defined(_WIN32) || defined(HAVE_VULKAN)
|
||||||
#include "Emu/RSX/VK/VKHelpers.h"
|
#include "Emu/RSX/VK/VKHelpers.h"
|
||||||
@ -551,6 +552,23 @@ void emu_settings::EnhanceDoubleSpinBox(QDoubleSpinBox* spinbox, SettingsType ty
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void emu_settings::EnhanceEdit(QLineEdit* edit, SettingsType type)
|
||||||
|
{
|
||||||
|
if (!edit)
|
||||||
|
{
|
||||||
|
cfg_log.fatal("EnhanceEdit '%s' was used with an invalid object", GetSettingName(type));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string set_text = GetSetting(type);
|
||||||
|
edit->setText(qstr(set_text));
|
||||||
|
|
||||||
|
connect(edit, &QLineEdit::textChanged, [=, this](const QString &text)
|
||||||
|
{
|
||||||
|
SetSetting(type, sstr(text));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<std::string> emu_settings::GetLoadedLibraries()
|
std::vector<std::string> emu_settings::GetLoadedLibraries()
|
||||||
{
|
{
|
||||||
return m_currentSettings["Core"]["Load libraries"].as<std::vector<std::string>, std::initializer_list<std::string>>({});
|
return m_currentSettings["Core"]["Load libraries"].as<std::vector<std::string>, std::initializer_list<std::string>>({});
|
||||||
|
@ -138,7 +138,11 @@ public:
|
|||||||
WindowTitleFormat,
|
WindowTitleFormat,
|
||||||
|
|
||||||
// Network
|
// Network
|
||||||
ConnectionStatus,
|
InternetStatus,
|
||||||
|
DNSAddress,
|
||||||
|
IpSwapList,
|
||||||
|
PSNStatus,
|
||||||
|
PSNNPID,
|
||||||
|
|
||||||
// System
|
// System
|
||||||
Language,
|
Language,
|
||||||
@ -228,6 +232,9 @@ public:
|
|||||||
/** Connects a double spin box with the target settings type*/
|
/** Connects a double spin box with the target settings type*/
|
||||||
void EnhanceDoubleSpinBox(QDoubleSpinBox* slider, SettingsType type, const QString& prefix = "", const QString& suffix = "");
|
void EnhanceDoubleSpinBox(QDoubleSpinBox* slider, SettingsType type, const QString& prefix = "", const QString& suffix = "");
|
||||||
|
|
||||||
|
/** Connects a line edit with the target settings type*/
|
||||||
|
void EnhanceEdit(QLineEdit* edit, SettingsType type);
|
||||||
|
|
||||||
std::vector<std::string> GetLoadedLibraries();
|
std::vector<std::string> GetLoadedLibraries();
|
||||||
void SaveSelectedLibraries(const std::vector<std::string>& libs);
|
void SaveSelectedLibraries(const std::vector<std::string>& libs);
|
||||||
|
|
||||||
@ -379,7 +386,11 @@ private:
|
|||||||
{ WindowTitleFormat, { "Miscellaneous", "Window Title Format" }},
|
{ WindowTitleFormat, { "Miscellaneous", "Window Title Format" }},
|
||||||
|
|
||||||
// Networking
|
// Networking
|
||||||
{ ConnectionStatus, { "Net", "Connection status"}},
|
{ InternetStatus, { "Net", "Internet enabled"}},
|
||||||
|
{ DNSAddress, { "Net", "DNS address"}},
|
||||||
|
{ IpSwapList, { "Net", "IP swap list"}},
|
||||||
|
{ PSNStatus, { "Net", "PSN status"}},
|
||||||
|
{ PSNNPID, { "Net", "NPID"}},
|
||||||
|
|
||||||
// System
|
// System
|
||||||
{ Language, { "System", "Language"}},
|
{ Language, { "System", "Language"}},
|
||||||
|
@ -902,11 +902,52 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> guiSettings, std:
|
|||||||
// | |\ | __/ |_ \ V V / (_) | | | < | | (_| | |_) |
|
// | |\ | __/ |_ \ V V / (_) | | | < | | (_| | |_) |
|
||||||
// |_| \_|\___|\__| \_/\_/ \___/|_| |_|\_\ |_|\__,_|_.__/
|
// |_| \_|\___|\__| \_/\_/ \___/|_| |_|\_\ |_|\__,_|_.__/
|
||||||
|
|
||||||
|
// Edits
|
||||||
|
|
||||||
|
xemu_settings->EnhanceEdit(ui->edit_dns, emu_settings::DNSAddress);
|
||||||
|
SubscribeTooltip(ui->edit_dns, tooltips.settings.dns);
|
||||||
|
|
||||||
|
xemu_settings->EnhanceEdit(ui->edit_npid, emu_settings::PSNNPID);
|
||||||
|
SubscribeTooltip(ui->edit_npid, tooltips.settings.psn_npid);
|
||||||
|
|
||||||
|
xemu_settings->EnhanceEdit(ui->edit_swaps, emu_settings::IpSwapList);
|
||||||
|
SubscribeTooltip(ui->edit_swaps, tooltips.settings.dns_swap);
|
||||||
|
|
||||||
// Comboboxes
|
// Comboboxes
|
||||||
|
|
||||||
xemu_settings->EnhanceComboBox(ui->netStatusBox, emu_settings::ConnectionStatus);
|
xemu_settings->EnhanceComboBox(ui->netStatusBox, emu_settings::InternetStatus);
|
||||||
SubscribeTooltip(ui->gb_network_status, tooltips.settings.net_status);
|
SubscribeTooltip(ui->netStatusBox, tooltips.settings.net_status);
|
||||||
|
|
||||||
|
connect(ui->netStatusBox, QOverload<int>::of(&QComboBox::currentIndexChanged), [this](int index)
|
||||||
|
{
|
||||||
|
ui->edit_dns->setEnabled(index > 0);
|
||||||
|
});
|
||||||
|
ui->edit_dns->setEnabled(ui->netStatusBox->currentIndex() > 0);
|
||||||
|
|
||||||
|
connect(ui->psnStatusBox, QOverload<int>::of(&QComboBox::currentIndexChanged), [this](int index)
|
||||||
|
{
|
||||||
|
ui->edit_npid->setEnabled(index > 0);
|
||||||
|
|
||||||
|
if (index > 0 && ui->edit_npid->text() == "")
|
||||||
|
{
|
||||||
|
QString gen_npid = "RPCS3_";
|
||||||
|
|
||||||
|
constexpr char list_chars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
|
||||||
|
'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
|
||||||
|
|
||||||
|
std::srand(time(0));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
gen_npid += list_chars[std::rand() % (sizeof(list_chars) - 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->edit_npid->setText(gen_npid);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
xemu_settings->EnhanceComboBox(ui->psnStatusBox, emu_settings::PSNStatus);
|
||||||
|
SubscribeTooltip(ui->psnStatusBox, tooltips.settings.psn_status);
|
||||||
|
|
||||||
// _ _ _______ _
|
// _ _ _______ _
|
||||||
// /\ | | | | |__ __| | |
|
// /\ | | | | |__ __| | |
|
||||||
|
@ -1487,24 +1487,145 @@
|
|||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_40">
|
<layout class="QVBoxLayout" name="verticalLayout_40">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_16" stretch="1,1,1">
|
<layout class="QHBoxLayout" name="horizontalLayout_16" stretch="0,0">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="gb_network_status">
|
<widget class="QGroupBox" name="gb_network_status">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Network Status</string>
|
<string>Network Configuration</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_38">
|
<layout class="QVBoxLayout" name="verticalLayout_38" stretch="0,0,0,0">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="netStatusBox"/>
|
<widget class="QGroupBox" name="groupBox_10">
|
||||||
|
<property name="title">
|
||||||
|
<string>Network Status</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_90">
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="netStatusBox"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_12">
|
||||||
|
<property name="title">
|
||||||
|
<string>DNS</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_92">
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="edit_dns">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_13">
|
||||||
|
<property name="title">
|
||||||
|
<string>IP/Hosts switches</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_93">
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="edit_swaps">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer_24">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="widget_10" native="true"/>
|
<widget class="QGroupBox" name="groupBox">
|
||||||
</item>
|
<property name="title">
|
||||||
<item>
|
<string>PSN Configuration</string>
|
||||||
<widget class="QWidget" name="widget_5" native="true"/>
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_88">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_11">
|
||||||
|
<property name="title">
|
||||||
|
<string>PSN Status</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_91">
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="psnStatusBox"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_15">
|
||||||
|
<property name="title">
|
||||||
|
<string>PSN settings</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_95">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_31">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_10">
|
||||||
|
<property name="text">
|
||||||
|
<string>NPID:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="edit_npid">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="maxLength">
|
||||||
|
<number>16</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer_25">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
@ -170,7 +170,11 @@ public:
|
|||||||
|
|
||||||
// network
|
// network
|
||||||
|
|
||||||
const QString net_status = tr("Leave as disconnected unless you're debugging.\nRPCS3 has no online support.");
|
const QString net_status = tr("If set to Connected, RPCS3 will allow programs to use your internet connection.");
|
||||||
|
const QString psn_status = tr("If set to Simulated, RPCS3 will fake PSN connection as best as it can.");
|
||||||
|
const QString dns = tr("DNS used to resolve hostnames by applications");
|
||||||
|
const QString psn_npid = tr("Identifier representing your account");
|
||||||
|
const QString dns_swap = tr("DNS Swap List");
|
||||||
|
|
||||||
// system
|
// system
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user