diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index efb699c948cd..80acfd3f3615 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -618,6 +618,13 @@ error_code sceNpTerm() nph.terminate_NP(); nph.is_NP_init = false; + idm::clear(); + + auto& sigh = g_fxo->get>(); + sigh.clear_sig_ctx(); + + // TODO: Other contexts(special handling for transaction contexts?) + return CELL_OK; } @@ -6636,15 +6643,17 @@ error_code sceNpSignalingCreateCtx(vm::ptr npId, vm::ptr SCE_NP_SIGNALING_CTX_MAX) - //{ - // return SCE_NP_SIGNALING_ERROR_CTX_MAX; - //} + u32 id = create_signaling_context(npId, handler, arg); + + if (!id) + { + return SCE_NP_SIGNALING_ERROR_CTX_MAX; + } - *ctx_id = create_signaling_context(npId, handler, arg); + *ctx_id = id; auto& sigh = g_fxo->get>(); - sigh.set_sig_cb(*ctx_id, handler, arg); + sigh.add_sig_ctx(id); return CELL_OK; } @@ -6665,6 +6674,9 @@ error_code sceNpSignalingDestroyCtx(u32 ctx_id) return SCE_NP_SIGNALING_ERROR_CTX_NOT_FOUND; } + auto& sigh = g_fxo->get>(); + sigh.remove_sig_ctx(ctx_id); + return CELL_OK; } @@ -6679,8 +6691,16 @@ error_code sceNpSignalingAddExtendedHandler(u32 ctx_id, vm::ptrget>(); - sigh.set_ext_sig_cb(ctx_id, handler, arg); + auto ctx = get_signaling_context(ctx_id); + + if (!ctx) + { + return SCE_NP_SIGNALING_ERROR_CTX_NOT_FOUND; + } + + std::lock_guard lock(ctx->mutex); + ctx->ext_handler = handler; + ctx->ext_arg = arg; return CELL_OK; } @@ -6701,6 +6721,15 @@ error_code sceNpSignalingSetCtxOpt(u32 ctx_id, s32 optname, s32 optval) return SCE_NP_SIGNALING_ERROR_INVALID_ARGUMENT; } + auto ctx = get_signaling_context(ctx_id); + + if (!ctx) + { + return SCE_NP_SIGNALING_ERROR_CTX_NOT_FOUND; + } + + // TODO + return CELL_OK; } @@ -6720,6 +6749,15 @@ error_code sceNpSignalingGetCtxOpt(u32 ctx_id, s32 optname, vm::ptr optval) return SCE_NP_SIGNALING_ERROR_INVALID_ARGUMENT; } + auto ctx = get_signaling_context(ctx_id); + + if (!ctx) + { + return SCE_NP_SIGNALING_ERROR_CTX_NOT_FOUND; + } + + // TODO + return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/sceNp2.cpp b/rpcs3/Emu/Cell/Modules/sceNp2.cpp index 117d50e3bd78..db1622353325 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp2.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp2.cpp @@ -313,7 +313,10 @@ error_code sceNpMatching2Term2() nph.is_NP2_Match2_init = false; } - // TODO: for all contexts: sceNpMatching2DestroyContext + idm::clear(); + + auto& sigh = g_fxo->get>(); + sigh.clear_match2_ctx(); return CELL_OK; } @@ -332,6 +335,9 @@ error_code sceNpMatching2DestroyContext(SceNpMatching2ContextId ctxId) if (!destroy_match2_context(ctxId)) return SCE_NP_MATCHING2_ERROR_CONTEXT_NOT_FOUND; + auto& sigh = g_fxo->get>(); + sigh.remove_match2_ctx(ctxId); + return CELL_OK; } @@ -439,7 +445,7 @@ error_code sceNpMatching2SearchRoom( } error_code sceNpMatching2SignalingGetConnectionStatus( - SceNpMatching2ContextId ctxId, SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId memberId, vm::ptr connStatus, vm::ptr peerAddr, vm::ptr peerPort) + SceNpMatching2ContextId ctxId, SceNpMatching2RoomId roomId, SceNpMatching2RoomMemberId memberId, vm::ptr connStatus, vm::ptr peerAddr, vm::ptr peerPort) { sceNp2.warning("sceNpMatching2SignalingGetConnectionStatus(ctxId=%d, roomId=%d, memberId=%d, connStatus=*0x%x, peerAddr=*0x%x, peerPort=*0x%x)", ctxId, roomId, memberId, connStatus, peerAddr, peerPort); @@ -1333,8 +1339,19 @@ error_code sceNpMatching2RegisterSignalingCallback(SceNpMatching2ContextId ctxId return SCE_NP_MATCHING2_ERROR_NOT_INITIALIZED; } + auto ctx = get_match2_context(ctxId); + + if (!ctx) + { + return SCE_NP_MATCHING2_ERROR_CONTEXT_NOT_FOUND; + } + + std::lock_guard lock(ctx->mutex); + ctx->signaling_cb = cbFunc; + ctx->signaling_cb_arg = cbFuncArg; + auto& sigh = g_fxo->get>(); - sigh.set_sig2_cb(ctxId, cbFunc, cbFuncArg); + sigh.add_match2_ctx(ctxId); return CELL_OK; } diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index 722ee446b98f..ed879028f7d3 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -329,9 +329,14 @@ void lv2_socket::save(utils::serial& ar, bool save_only_this_class) } } -void sys_net_dump_data(std::string_view desc, const u8* data, s32 len) +void sys_net_dump_data(std::string_view desc, const u8* data, s32 len, const void* addr) { - sys_net_dump.trace("%s:%s", desc, fmt::buf_to_hexstring(data, len)); + const sys_net_sockaddr_in_p2p* p2p_addr = reinterpret_cast(addr); + + if (p2p_addr) + sys_net_dump.trace("%s(%s:%d:%d): %s", desc, np::ip_to_string(std::bit_cast(p2p_addr->sin_addr)), p2p_addr->sin_port, p2p_addr->sin_vport, fmt::buf_to_hexstring(data, len)); + else + sys_net_dump.trace("%s: %s", desc, fmt::buf_to_hexstring(data, len)); } error_code sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr addr, vm::ptr paddrlen) @@ -797,7 +802,7 @@ error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr buf, u32 { sn_addr = res_addr; std::memcpy(buf.get_ptr(), vec.data(), res); - sys_net_dump_data("recvfrom", vec.data(), res); + sys_net_dump_data("recvfrom", vec.data(), res, &res_addr); } result = res; @@ -819,7 +824,7 @@ error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr buf, u32 { sn_addr = res_addr; std::memcpy(buf.get_ptr(), vec.data(), res); - sys_net_dump_data("recvfrom", vec.data(), res); + sys_net_dump_data("recvfrom", vec.data(), res, &res_addr); } result = res; lv2_obj::awake(&ppu); @@ -1003,7 +1008,7 @@ error_code sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr buf, u32 l return -SYS_NET_EAFNOSUPPORT; } - sys_net_dump_data("sendto", static_cast(buf.get_ptr()), len); + sys_net_dump_data("sendto", static_cast(buf.get_ptr()), len, addr ? addr.get_ptr() : nullptr); const std::optional sn_addr = addr ? std::optional(*addr) : std::nullopt; const std::vector buf_copy(vm::_ptr(buf.addr()), vm::_ptr(buf.addr()) + len); diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp index b77d08773a3c..d061996abef2 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp @@ -241,8 +241,6 @@ std::optional, sys_net_sockaddr>> lv2_socket_p2p lock.lock(); } - sys_net.trace("[P2P] p2p_data for vport %d contains %d elements", vport, data.size()); - if (data.empty()) { if (so_nbio || (flags & SYS_NET_MSG_DONTWAIT)) @@ -251,6 +249,8 @@ std::optional, sys_net_sockaddr>> lv2_socket_p2p return std::nullopt; } + sys_net.trace("[P2P] p2p_data for vport %d contains %d elements", vport, data.size()); + std::vector res_buf(len); const auto& p2p_data = data.front(); @@ -288,9 +288,11 @@ std::optional lv2_socket_p2p::sendto(s32 flags, const std::vector& buf, std::vector p2p_data(buf.size() + VPORT_P2P_HEADER_SIZE); const le_t p2p_vport_le = p2p_vport; + const le_t src_vport_le = vport; const le_t p2p_flags_le = P2P_FLAG_P2P; memcpy(p2p_data.data(), &p2p_vport_le, sizeof(u16)); - memcpy(p2p_data.data() + sizeof(u16), &p2p_flags_le, sizeof(u16)); + memcpy(p2p_data.data() + sizeof(u16), &src_vport_le, sizeof(u16)); + memcpy(p2p_data.data() + sizeof(u16) + sizeof(u16), &p2p_flags_le, sizeof(u16)); memcpy(p2p_data.data() + VPORT_P2P_HEADER_SIZE, buf.data(), buf.size()); int native_flags = 0; @@ -363,7 +365,7 @@ s32 lv2_socket_p2p::poll(sys_net_pollfd& sn_pfd, [[maybe_unused]] pollfd& native { std::lock_guard lock(mutex); ensure(vport); - sys_net.trace("[P2P] poll checking for 0x%X", sn_pfd.events); + // Check if it's a bound P2P socket if ((sn_pfd.events & SYS_NET_POLLIN) && !data.empty()) { @@ -396,7 +398,6 @@ std::tuple lv2_socket_p2p::select(bs_t sel if (selected & lv2_socket::poll_t::write) { - sys_net.trace("[P2P] p2p_data for vport %d contains %d elements", vport, data.size()); write_set = true; } diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp index 4553d736143c..f1b341f494c6 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp @@ -225,10 +225,12 @@ std::vector generate_u2s_packet(const p2ps_encapsulated_tcp& header, const u std::vector packet(packet_size); u8* packet_data = packet.data(); le_t dst_port_le = +header.dst_port; + le_t src_port_le = +header.src_port; le_t p2p_flags_le = P2P_FLAG_P2PS; memcpy(packet_data, &dst_port_le, sizeof(u16)); - memcpy(packet_data + sizeof(u16), &p2p_flags_le, sizeof(u16)); + memcpy(packet_data + sizeof(u16), &src_port_le, sizeof(u16)); + memcpy(packet_data + sizeof(u16) + sizeof(u16), &p2p_flags_le, sizeof(u16)); memcpy(packet_data + VPORT_P2P_HEADER_SIZE, &header, sizeof(p2ps_encapsulated_tcp)); if (datasize) memcpy(packet_data + VPORT_P2P_HEADER_SIZE + sizeof(p2ps_encapsulated_tcp), data, datasize); diff --git a/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp b/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp index 024106623b5a..e216435c7b4d 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.cpp @@ -204,7 +204,8 @@ bool nt_p2p_port::recv_data() return true; } - const u16 vport_flags = *reinterpret_cast*>(p2p_recv_data.data() + sizeof(u16)); + const u16 src_vport = *reinterpret_cast*>(p2p_recv_data.data() + sizeof(u16)); + const u16 vport_flags = *reinterpret_cast*>(p2p_recv_data.data() + sizeof(u16) + sizeof(u16)); std::vector p2p_data(recv_res - VPORT_P2P_HEADER_SIZE); memcpy(p2p_data.data(), p2p_recv_data.data() + VPORT_P2P_HEADER_SIZE, p2p_data.size()); @@ -218,7 +219,7 @@ bool nt_p2p_port::recv_data() p2p_addr.sin_len = sizeof(sys_net_sockaddr_in); p2p_addr.sin_family = SYS_NET_AF_INET; p2p_addr.sin_addr = std::bit_cast, u32>(reinterpret_cast(&native_addr)->sin_addr.s_addr); - p2p_addr.sin_vport = dst_vport; + p2p_addr.sin_vport = src_vport; p2p_addr.sin_port = std::bit_cast, u16>(reinterpret_cast(&native_addr)->sin_port); auto& bound_sockets = ::at32(bound_p2p_vports, dst_vport); @@ -313,6 +314,6 @@ bool nt_p2p_port::recv_data() } } - sys_net.notice("Received a STREAM-P2P packet with no bound target"); + sys_net.notice("Received a P2P packet with no bound target(dst_vport = %d)", dst_vport); return true; } diff --git a/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.h b/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.h index c8141825440e..9d80b633374c 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/nt_p2p_port.h @@ -20,7 +20,8 @@ #endif #endif -constexpr s32 VPORT_P2P_HEADER_SIZE = sizeof(u16) + sizeof(u16); +// dst_vport src_vport flags +constexpr s32 VPORT_P2P_HEADER_SIZE = sizeof(u16) + sizeof(u16) + sizeof(u16); enum VPORT_P2P_FLAGS { diff --git a/rpcs3/Emu/NP/np_contexts.cpp b/rpcs3/Emu/NP/np_contexts.cpp index 2e72e60e65f7..112d926e9059 100644 --- a/rpcs3/Emu/NP/np_contexts.cpp +++ b/rpcs3/Emu/NP/np_contexts.cpp @@ -221,3 +221,7 @@ bool destroy_signaling_context(s32 ctx_id) { return idm::remove(static_cast(ctx_id)); } +std::shared_ptr get_signaling_context(u32 ctx_id) +{ + return idm::get_unlocked(ctx_id); +} diff --git a/rpcs3/Emu/NP/np_contexts.h b/rpcs3/Emu/NP/np_contexts.h index 9903ed77d3f3..236974d36a3f 100644 --- a/rpcs3/Emu/NP/np_contexts.h +++ b/rpcs3/Emu/NP/np_contexts.h @@ -7,6 +7,7 @@ #include "Utilities/mutex.h" +#include "Emu/IdManager.h" #include "Emu/Memory/vm_ptr.h" #include "Emu/Cell/Modules/sceNp.h" #include "Emu/Cell/Modules/sceNp2.h" @@ -190,6 +191,8 @@ struct match2_ctx static const u32 id_count = 255; // TODO: constant here? SAVESTATE_INIT_POS(27); + shared_mutex mutex; + SceNpCommunicationId communicationId{}; SceNpCommunicationPassphrase passphrase{}; @@ -197,6 +200,9 @@ struct match2_ctx vm::ptr context_callback_param{}; SceNpMatching2RequestOptParam default_match2_optparam{}; + + vm::ptr signaling_cb{}; + vm::ptr signaling_cb_arg{}; }; u16 create_match2_context(vm::cptr communicationId, vm::cptr passphrase); bool check_match2_context(u16 ctx_id); @@ -259,9 +265,14 @@ struct signaling_ctx static const u32 id_count = SCE_NP_SIGNALING_CTX_MAX; SAVESTATE_INIT_POS(31); + shared_mutex mutex; + SceNpId npid{}; vm::ptr handler{}; vm::ptr arg{}; + vm::ptr ext_handler{}; + vm::ptr ext_arg{}; }; s32 create_signaling_context(vm::ptr npid, vm::ptr handler, vm::ptr arg); +std::shared_ptr get_signaling_context(u32 ctx_id); bool destroy_signaling_context(s32 ctx_id); diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index c42845ba9fe9..fd6eaeb432f9 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -84,7 +84,7 @@ namespace rpcn rpcn_log.notice("online: %s, pr_com_id: %s, pr_title: %s, pr_status: %s, pr_comment: %s, pr_data: %s", online ? "true" : "false", pr_com_id.data, pr_title, pr_status, pr_comment, fmt::buf_to_hexstring(pr_data.data(), pr_data.size())); } - constexpr u32 RPCN_PROTOCOL_VERSION = 23; + constexpr u32 RPCN_PROTOCOL_VERSION = 24; constexpr usz RPCN_HEADER_SIZE = 15; bool is_error(ErrorType err) diff --git a/rpcs3/Emu/NP/signaling_handler.cpp b/rpcs3/Emu/NP/signaling_handler.cpp index bb1e8fb9a4c4..9381e9505f73 100644 --- a/rpcs3/Emu/NP/signaling_handler.cpp +++ b/rpcs3/Emu/NP/signaling_handler.cpp @@ -46,69 +46,112 @@ signaling_handler::signaling_handler() //// SIGNALING CALLBACKS //// ///////////////////////////// -void signaling_handler::set_sig_cb(u32 sig_cb_ctx, vm::ptr sig_cb, vm::ptr sig_cb_arg) +void signaling_handler::add_sig_ctx(u32 ctx_id) { std::lock_guard lock(data_mutex); - this->sig_cb_ctx = sig_cb_ctx; - this->sig_cb = sig_cb; - this->sig_cb_arg = sig_cb_arg; + sig_ctx_lst.insert(ctx_id); } -void signaling_handler::set_ext_sig_cb(u32 sig_ext_cb_ctx, vm::ptr sig_ext_cb, vm::ptr sig_ext_cb_arg) +void signaling_handler::remove_sig_ctx(u32 ctx_id) { std::lock_guard lock(data_mutex); - this->sig_ext_cb_ctx = sig_ext_cb_ctx; - this->sig_ext_cb = sig_ext_cb; - this->sig_ext_cb_arg = sig_ext_cb_arg; + sig_ctx_lst.erase(ctx_id); } -void signaling_handler::set_sig2_cb(u16 sig2_cb_ctx, vm::ptr sig2_cb, vm::ptr sig2_cb_arg) +void signaling_handler::clear_sig_ctx() { std::lock_guard lock(data_mutex); - this->sig2_cb_ctx = sig2_cb_ctx; - this->sig2_cb = sig2_cb; - this->sig2_cb_arg = sig2_cb_arg; + sig_ctx_lst.clear(); } -void signaling_handler::signal_sig_callback(u32 conn_id, int event, int error_code) +void signaling_handler::add_match2_ctx(u16 ctx_id) { - if (sig_cb) + std::lock_guard lock(data_mutex); + match2_ctx_lst.insert(ctx_id); +} + +void signaling_handler::remove_match2_ctx(u16 ctx_id) +{ + std::lock_guard lock(data_mutex); + match2_ctx_lst.erase(ctx_id); +} + +void signaling_handler::clear_match2_ctx() +{ + std::lock_guard lock(data_mutex); + match2_ctx_lst.clear(); +} + +void signaling_handler::signal_sig_callback(u32 conn_id, s32 event, s32 error_code) +{ + for (const auto& ctx_id : sig_ctx_lst) { - sysutil_register_cb([sig_cb = this->sig_cb, sig_cb_ctx = this->sig_cb_ctx, conn_id, event, error_code, sig_cb_arg = this->sig_cb_arg](ppu_thread& cb_ppu) -> s32 - { - sig_cb(cb_ppu, sig_cb_ctx, conn_id, event, error_code, sig_cb_arg); - return 0; - }); - sign_log.notice("Called sig CB: 0x%x (conn_id: %d)", event, conn_id); + const auto ctx = get_signaling_context(ctx_id); + + if (!ctx) + continue; + + std::lock_guard lock(ctx->mutex); + + if (ctx->handler) + { + sysutil_register_cb([sig_cb = ctx->handler, sig_cb_ctx = ctx_id, conn_id, event, error_code, sig_cb_arg = ctx->arg](ppu_thread& cb_ppu) -> s32 + { + sig_cb(cb_ppu, sig_cb_ctx, conn_id, event, error_code, sig_cb_arg); + return 0; + }); + sign_log.notice("Called sig CB: 0x%x (conn_id: %d)", event, conn_id); + } } // extended callback also receives normal events signal_ext_sig_callback(conn_id, event, error_code); } -void signaling_handler::signal_ext_sig_callback(u32 conn_id, int event, int error_code) const +void signaling_handler::signal_ext_sig_callback(u32 conn_id, s32 event, s32 error_code) const { - if (sig_ext_cb) + for (const auto ctx_id : sig_ctx_lst) { - sysutil_register_cb([sig_ext_cb = this->sig_ext_cb, sig_ext_cb_ctx = this->sig_ext_cb_ctx, conn_id, event, error_code, sig_ext_cb_arg = this->sig_ext_cb_arg](ppu_thread& cb_ppu) -> s32 - { - sig_ext_cb(cb_ppu, sig_ext_cb_ctx, conn_id, event, error_code, sig_ext_cb_arg); - return 0; - }); - sign_log.notice("Called EXT sig CB: 0x%x (conn_id: %d)", event, conn_id); + const auto ctx = get_signaling_context(ctx_id); + + if (!ctx) + continue; + + std::lock_guard lock(ctx->mutex); + + if (ctx->ext_handler) + { + sysutil_register_cb([sig_ext_cb = ctx->ext_handler, sig_ext_cb_ctx = ctx_id, conn_id, event, error_code, sig_ext_cb_arg = ctx->ext_arg](ppu_thread& cb_ppu) -> s32 + { + sig_ext_cb(cb_ppu, sig_ext_cb_ctx, conn_id, event, error_code, sig_ext_cb_arg); + return 0; + }); + sign_log.notice("Called EXT sig CB: 0x%x (conn_id: %d)", event, conn_id); + } } } -void signaling_handler::signal_sig2_callback(u64 room_id, u16 member_id, SceNpMatching2Event event, int error_code) const +void signaling_handler::signal_sig2_callback(u64 room_id, u16 member_id, SceNpMatching2Event event, s32 error_code) const { - if (room_id && sig2_cb) + if (room_id) { - sysutil_register_cb([sig2_cb = this->sig2_cb, sig2_cb_ctx = this->sig2_cb_ctx, room_id, member_id, event, error_code, sig2_cb_arg = this->sig2_cb_arg](ppu_thread& cb_ppu) -> s32 + for (const auto ctx_id : match2_ctx_lst) + { + const auto ctx = get_match2_context(ctx_id); + + if (!ctx) + continue; + + if (ctx->signaling_cb) { - sig2_cb(cb_ppu, sig2_cb_ctx, room_id, member_id, event, error_code, sig2_cb_arg); - return 0; - }); - sign_log.notice("Called sig2 CB: 0x%x (room_id: %d, member_id: %d)", event, room_id, member_id); + sysutil_register_cb([sig2_cb = ctx->signaling_cb, sig2_cb_ctx = ctx_id, room_id, member_id, event, error_code, sig2_cb_arg = ctx->signaling_cb_arg](ppu_thread& cb_ppu) -> s32 + { + sig2_cb(cb_ppu, sig2_cb_ctx, room_id, member_id, event, error_code, sig2_cb_arg); + return 0; + }); + sign_log.notice("Called sig2 CB: 0x%x (room_id: %d, member_id: %d)", event, room_id, member_id); + } + } } } @@ -524,7 +567,7 @@ void signaling_handler::update_si_mapped_addr(std::shared_ptr& s } } -void signaling_handler::update_si_status(std::shared_ptr& si, s32 new_status, int error_code) +void signaling_handler::update_si_status(std::shared_ptr& si, s32 new_status, s32 error_code) { if (!si) return; @@ -666,7 +709,10 @@ void signaling_handler::stop_sig_nl(u32 conn_id, bool forceful) // If forceful we don't go through any transition and don't call any CB if (forceful) + { si->conn_status = SCE_NP_SIGNALING_CONN_STATUS_INACTIVE; + si->op_activated = false; + } // Do not queue packets for an already dead connection if (si->conn_status == SCE_NP_SIGNALING_CONN_STATUS_INACTIVE) diff --git a/rpcs3/Emu/NP/signaling_handler.h b/rpcs3/Emu/NP/signaling_handler.h index fb90fdb8d79d..209daa9cac0e 100644 --- a/rpcs3/Emu/NP/signaling_handler.h +++ b/rpcs3/Emu/NP/signaling_handler.h @@ -68,9 +68,12 @@ class signaling_handler std::optional get_conn_id_from_npid(const SceNpId& npid); std::optional get_conn_id_from_addr(u32 addr, u16 port); - void set_sig_cb(u32 sig_cb_ctx, vm::ptr sig_cb, vm::ptr sig_cb_arg); - void set_ext_sig_cb(u32 sig_ext_cb_ctx, vm::ptr sig_ext_cb, vm::ptr sig_ext_cb_arg); - void set_sig2_cb(u16 sig2_cb_ctx, vm::ptr sig2_cb, vm::ptr sig2_cb_arg); + void add_sig_ctx(u32 ctx_id); + void remove_sig_ctx(u32 ctx_id); + void clear_sig_ctx(); + void add_match2_ctx(u16 ctx_id); + void remove_match2_ctx(u16 ctx_id); + void clear_match2_ctx(); void start_sig(u32 conn_id, u32 addr, u16 port); void stop_sig(u32 conn_id, bool forceful); @@ -106,28 +109,19 @@ class signaling_handler std::shared_ptr sig_info; }; - u32 sig_cb_ctx = 0; - vm::ptr sig_cb{}; - vm::ptr sig_cb_arg{}; - - u32 sig_ext_cb_ctx = 0; - vm::ptr sig_ext_cb{}; - vm::ptr sig_ext_cb_arg{}; - - u16 sig2_cb_ctx = 0; - vm::ptr sig2_cb{}; - vm::ptr sig2_cb_arg{}; + std::set sig_ctx_lst; + std::set match2_ctx_lst; static u64 get_micro_timestamp(const std::chrono::steady_clock::time_point& time_point); u32 get_always_conn_id(const SceNpId& npid); static void update_si_addr(std::shared_ptr& si, u32 new_addr, u16 new_port); static void update_si_mapped_addr(std::shared_ptr& si, u32 new_addr, u16 new_port); - void update_si_status(std::shared_ptr& si, s32 new_status, int error_code); + void update_si_status(std::shared_ptr& si, s32 new_status, s32 error_code); void update_ext_si_status(std::shared_ptr& si, bool op_activated); - void signal_sig_callback(u32 conn_id, int event, int error_code); - void signal_ext_sig_callback(u32 conn_id, int event, int error_code) const; - void signal_sig2_callback(u64 room_id, u16 member_id, SceNpMatching2Event event, int error_code) const; + void signal_sig_callback(u32 conn_id, s32 event, s32 error_code); + void signal_ext_sig_callback(u32 conn_id, s32 event, s32 error_code) const; + void signal_sig2_callback(u64 room_id, u16 member_id, SceNpMatching2Event event, s32 error_code) const; static bool validate_signaling_packet(const signaling_packet* sp); void reschedule_packet(std::shared_ptr& si, SignalingCommand cmd, steady_clock::time_point new_timepoint);