diff --git a/src/core/hle/service/ac/ac.cpp b/src/core/hle/service/ac/ac.cpp index 8e6e7f803..233dbbf49 100644 --- a/src/core/hle/service/ac/ac.cpp +++ b/src/core/hle/service/ac/ac.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include #include "common/archives.h" #include "common/common_types.h" #include "common/logging/log.h" @@ -18,7 +19,10 @@ #include "core/hle/service/ac/ac.h" #include "core/hle/service/ac/ac_i.h" #include "core/hle/service/ac/ac_u.h" +#include "core/hle/service/nwm/nwm_inf.h" #include "core/hle/service/soc/soc_u.h" +#include "network/network.h" +#include "network/room.h" #include "core/memory.h" SERIALIZE_EXPORT_IMPL(Service::AC::Module) @@ -182,20 +186,69 @@ void Module::Interface::GetStatus(Kernel::HLERequestContext& ctx) { void Module::Interface::ScanAPs(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx); - const u32 arg1 = rp.Pop(); - LOG_WARNING(Service_AC, "val1: {}", arg1); - const u32 arg2 = rp.Pop(); - LOG_WARNING(Service_AC, "val2: {}", arg2); - const u32 arg3 = rp.Pop(); - LOG_WARNING(Service_AC, "val3: {}", arg3); - const u32 arg4 = rp.Pop(); - LOG_WARNING(Service_AC, "val4: {}", arg4); - const u32 arg5 = rp.Pop(); - LOG_WARNING(Service_AC, "val5: {}", arg5); - IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); - rb.Push(ResultUnknown); - LOG_WARNING(Service_AC, "(STUBBED) called"); + // I used 3dbrew.org for the information on the individual request inputs + + // Arg 0 is Header code, which is ignored + // Arg 1 is Size + const u32 size = rp.Pop(); + LOG_WARNING(Service_AC, "Size: {}", size); + // Arg 2 is CallingPID value (PID Header) + // Arg 3 is PID + const u32 pid = rp.PopPID(); + LOG_WARNING(Service_AC, "PID: {}", pid); + // Likely time transpired between consecutive calls of this method. + // First call has value 0 or 1. Second call has value 0xFFFF0000. + const u32 unknown = rp.Pop(); + LOG_WARNING(Service_AC, "val4: {}", unknown); + + std::vector buffer(size); + + Network::MacAddress mac = Network::BroadcastMac; + u32 mac1 = (mac[0] << 8) | (mac[1]); + u32 mac2 = (mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | (mac[5]); + + std::array cmd_buf; + cmd_buf[0] = 0x000603C4; + cmd_buf[1] = size; + cmd_buf[2] = 0; // dummy data + cmd_buf[3] = 0; // dummy data + cmd_buf[4] = mac1; + cmd_buf[5] = mac2; + cmd_buf[16] = 0; + cmd_buf[17] = 0; // set to 0 to ignore it + cmd_buf[18] = (size << 4) | 12; // should be considered correct for mapped buffer + cmd_buf[19] = 0; // if i interpreted the code correctly, this value won't matter + + LOG_WARNING(Service_AC, "Finished setting up command buffer"); + std::shared_ptr thread = ctx.ClientThread(); + auto current_process = thread->owner_process.lock(); + LOG_WARNING(Service_AC, "Retrieved thread and process"); + + auto context = + std::make_shared(Core::System::GetInstance().Kernel(), + ctx.Session(), thread); + LOG_WARNING(Service_AC, "Created context"); + context->PopulateFromIncomingCommandBuffer(cmd_buf.data(), current_process); + + LOG_WARNING(Service_AC, "Finished setting up context"); + + auto nwm_inf = + Core::System::GetInstance().ServiceManager().GetService("nwm::INF"); + LOG_WARNING(Service_AC, "Calling NWM_INF::RecvBeaconBroadcastData"); + nwm_inf->HandleSyncRequest(*context); + LOG_WARNING(Service_AC, "Returned to AC::ScanAPs"); + // Response should be + // 0: Header Code (ignored) + // 1: Result Code (Success/Unknown/etc.) + // 2: ¿Parsed? beacon data + IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); + IPC::RequestParser rp2(*context); + rb.Push(rp2.Pop()); + Kernel::MappedBuffer mapped_buffer = rp2.PopMappedBuffer(); + mapped_buffer.Read(buffer.data(), 0, buffer.size()); + rb.PushStaticBuffer(buffer, 0); + LOG_WARNING(Service_AC, "(STUBBED) called, pid={}, unknown={}", pid, unknown); } void Module::Interface::GetInfraPriority(Kernel::HLERequestContext& ctx) { diff --git a/src/core/hle/service/nwm/nwm_inf.cpp b/src/core/hle/service/nwm/nwm_inf.cpp index 69ffd7d64..5ccb36cef 100644 --- a/src/core/hle/service/nwm/nwm_inf.cpp +++ b/src/core/hle/service/nwm/nwm_inf.cpp @@ -2,8 +2,12 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include #include "common/archives.h" +#include "common/logging/log.h" #include "core/core.h" +#include "core/hle/ipc.h" +#include "core/hle/ipc_helpers.h" #include "core/hle/service/nwm/nwm_inf.h" #include "core/hle/service/nwm/nwm_uds.h" @@ -12,9 +16,46 @@ SERIALIZE_EXPORT_IMPL(Service::NWM::NWM_INF) namespace Service::NWM { void NWM_INF::RecvBeaconBroadcastData(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp(ctx); // TODO(PTR) Update implementation to cover differences between NWM_INF and NWM_UDS + + LOG_WARNING(Service_NWM, "Started NWM_INF::RecvBeaconBroadcastData"); + + // adding in extra context value for transition from INF to UDS + std::array cmd_buf; + cmd_buf[0] = 0x000F0404; + int i; + for (i = 1; i < 15; i++) { + cmd_buf[i] = rp.Pop(); + } + rp.Pop(); + cmd_buf[15] = 0; // dummy wlan_comm_id + cmd_buf[16] = 0; // dummy id + for (i = 17; i <= 20; i++) { + cmd_buf[i] = rp.Pop(); + } + + std::shared_ptr thread = ctx.ClientThread(); + auto current_process = thread->owner_process.lock(); + auto context = + std::make_shared(Core::System::GetInstance().Kernel(), + ctx.Session(), thread); + context->PopulateFromIncomingCommandBuffer(cmd_buf.data(), current_process); + LOG_WARNING(Service_NWM, "Finished converting context"); + auto nwm_uds = Core::System::GetInstance().ServiceManager().GetService("nwm::UDS"); - nwm_uds->HandleSyncRequest(ctx); + + LOG_WARNING(Service_NWM, "Calling NWM_UDS::RecvBeaconBroadcastData"); + nwm_uds->HandleSyncRequest(*context); + LOG_WARNING(Service_NWM, "Returned to NWM_INF::RecvBeaconBroadcastData"); + + IPC::RequestParser rp2(*context); + + IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); + rb.Push(rp2.Pop()); + rb.PushMappedBuffer(rp2.PopMappedBuffer()); + + LOG_WARNING(Service_NWM, "Finished NWM_INF::RecvBeaconBroadcastData"); } NWM_INF::NWM_INF() : ServiceFramework("nwm::INF") { diff --git a/src/core/hle/service/nwm/nwm_uds.cpp b/src/core/hle/service/nwm/nwm_uds.cpp index 58b2f4e35..bd2c038f1 100644 --- a/src/core/hle/service/nwm/nwm_uds.cpp +++ b/src/core/hle/service/nwm/nwm_uds.cpp @@ -14,6 +14,7 @@ #include "core/core_timing.h" #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/event.h" +#include "core/hle/kernel/handle_table.h" #include "core/hle/kernel/shared_memory.h" #include "core/hle/kernel/shared_page.h" #include "core/hle/result.h"