mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 13:20:03 +00:00 
			
		
		
		
	Revert "Implement some missing/wrong AC functionality." (#5)
* Revert "Implement some missing/wrong AC functionality." * Remove setting wifi level from nwm
This commit is contained in:
		
							parent
							
								
									cb75e1d637
								
							
						
					
					
						commit
						f5316532e6
					
				
					 5 changed files with 52 additions and 334 deletions
				
			
		|  | @ -13,7 +13,6 @@ | ||||||
| #include "core/hle/kernel/event.h" | #include "core/hle/kernel/event.h" | ||||||
| #include "core/hle/kernel/handle_table.h" | #include "core/hle/kernel/handle_table.h" | ||||||
| #include "core/hle/kernel/resource_limit.h" | #include "core/hle/kernel/resource_limit.h" | ||||||
| #include "core/hle/kernel/shared_page.h" |  | ||||||
| #include "core/hle/result.h" | #include "core/hle/result.h" | ||||||
| #include "core/hle/service/ac/ac.h" | #include "core/hle/service/ac/ac.h" | ||||||
| #include "core/hle/service/ac/ac_i.h" | #include "core/hle/service/ac/ac_i.h" | ||||||
|  | @ -41,143 +40,76 @@ void Module::Interface::CreateDefaultConfig(Kernel::HLERequestContext& ctx) { | ||||||
| void Module::Interface::ConnectAsync(Kernel::HLERequestContext& ctx) { | void Module::Interface::ConnectAsync(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp(ctx); |     IPC::RequestParser rp(ctx); | ||||||
| 
 | 
 | ||||||
|     const u32 pid = rp.PopPID(); |     rp.Skip(2, false); // ProcessId descriptor
 | ||||||
|     ac->connect_event = rp.PopObject<Kernel::Event>(); |     ac->connect_event = rp.PopObject<Kernel::Event>(); | ||||||
|     rp.Skip(2, false); // Buffer descriptor
 |     rp.Skip(2, false); // Buffer descriptor
 | ||||||
| 
 | 
 | ||||||
|     ac->Connect(pid); |     if (ac->connect_event) { | ||||||
|  |         ac->connect_event->SetName("AC:connect_event"); | ||||||
|  |         ac->connect_event->Signal(); | ||||||
|  |         ac->ac_connected = true; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|     rb.Push(ResultSuccess); |     rb.Push(ResultSuccess); | ||||||
| 
 | 
 | ||||||
|     LOG_WARNING(Service_AC, "(STUBBED) called, pid={}", pid); |     LOG_WARNING(Service_AC, "(STUBBED) called"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Module::Interface::GetConnectResult(Kernel::HLERequestContext& ctx) { | void Module::Interface::GetConnectResult(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp(ctx); |     IPC::RequestParser rp(ctx); | ||||||
|     [[maybe_unused]] const u32 pid = rp.PopPID(); |     rp.Skip(2, false); // ProcessId descriptor
 | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|     rb.Push(ac->connect_result); |     rb.Push(ResultSuccess); | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void Module::Interface::CancelConnectAsync(Kernel::HLERequestContext& ctx) { |  | ||||||
|     IPC::RequestParser rp(ctx); |  | ||||||
|     const u32 pid = rp.PopPID(); |  | ||||||
| 
 |  | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |  | ||||||
|     rb.Push(ac->ac_connected ? ErrorAlreadyConnected : ErrorNotConnected); |  | ||||||
| 
 |  | ||||||
|     LOG_WARNING(Service_AC, "(STUBBED) called, pid={}", pid); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Module::Interface::CloseAsync(Kernel::HLERequestContext& ctx) { | void Module::Interface::CloseAsync(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp(ctx); |     IPC::RequestParser rp(ctx); | ||||||
|     const u32 pid = rp.PopPID(); |     rp.Skip(2, false); // ProcessId descriptor
 | ||||||
| 
 | 
 | ||||||
|     ac->close_event = rp.PopObject<Kernel::Event>(); |     ac->close_event = rp.PopObject<Kernel::Event>(); | ||||||
| 
 | 
 | ||||||
|     ac->Disconnect(pid); |     if (ac->ac_connected && ac->disconnect_event) { | ||||||
|  |         ac->disconnect_event->Signal(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (ac->close_event) { | ||||||
|  |         ac->close_event->SetName("AC:close_event"); | ||||||
|  |         ac->close_event->Signal(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     ac->ac_connected = false; | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|     rb.Push(ResultSuccess); |     rb.Push(ResultSuccess); | ||||||
| 
 |  | ||||||
|     LOG_WARNING(Service_AC, "(STUBBED) called, pid={}", pid); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Module::Interface::GetCloseResult(Kernel::HLERequestContext& ctx) { | void Module::Interface::GetCloseResult(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp(ctx); |     IPC::RequestParser rp(ctx); | ||||||
|     [[maybe_unused]] const u32 pid = rp.PopPID(); |     rp.Skip(2, false); // ProcessId descriptor
 | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|     rb.Push(ac->close_result); |     rb.Push(ResultSuccess); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_AC, "(STUBBED) called"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Module::Interface::GetWifiStatus(Kernel::HLERequestContext& ctx) { | void Module::Interface::GetWifiStatus(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp(ctx); |     IPC::RequestParser rp(ctx); | ||||||
|  |     bool can_reach_internet = false; | ||||||
| 
 | 
 | ||||||
|     if (!ac->ac_connected) { |     std::shared_ptr<SOC::SOC_U> socu_module = SOC::GetService(ac->system); | ||||||
|         IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |     if (socu_module) { | ||||||
|         rb.Push(ErrorNotConnected); |         can_reach_internet = socu_module->GetDefaultInterfaceInfo().has_value(); | ||||||
|         return; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|     rb.Push(ResultSuccess); |     rb.Push(ResultSuccess); | ||||||
|     rb.Push<u32>(static_cast<u32>(WifiStatus::STATUS_CONNECTED_SLOT1)); |     rb.Push<u32>(static_cast<u32>(can_reach_internet ? (Settings::values.is_new_3ds | ||||||
| 
 |                                                             ? WifiStatus::STATUS_CONNECTED_N3DS | ||||||
|     LOG_WARNING(Service_AC, "(STUBBED) called"); |                                                             : WifiStatus::STATUS_CONNECTED_O3DS) | ||||||
| } |                                                      : WifiStatus::STATUS_DISCONNECTED)); | ||||||
| 
 |  | ||||||
| void Module::Interface::GetCurrentAPInfo(Kernel::HLERequestContext& ctx) { |  | ||||||
|     IPC::RequestParser rp(ctx); |  | ||||||
|     const u32 len = rp.Pop<u32>(); |  | ||||||
|     const u32 pid = rp.PopPID(); |  | ||||||
| 
 |  | ||||||
|     if (!ac->ac_connected) { |  | ||||||
|         IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |  | ||||||
|         rb.Push(ErrorNotConnected); |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     constexpr const char* citra_ap = "Citra_AP"; |  | ||||||
|     constexpr s16 good_signal_strength = 60; |  | ||||||
|     constexpr u8 unknown1_value = 6; |  | ||||||
|     constexpr u8 unknown2_value = 5; |  | ||||||
|     constexpr u8 unknown3_value = 5; |  | ||||||
|     constexpr u8 unknown4_value = 0; |  | ||||||
| 
 |  | ||||||
|     SharedPage::Handler& shared_page = ac->system.Kernel().GetSharedPageHandler(); |  | ||||||
|     SharedPage::MacAddress mac = shared_page.GetMacAddress(); |  | ||||||
| 
 |  | ||||||
|     APInfo info{ |  | ||||||
|         .ssid_len = static_cast<u32>(std::strlen(citra_ap)), |  | ||||||
|         .bssid = mac, |  | ||||||
|         .padding = 0, |  | ||||||
|         .signal_strength = good_signal_strength, |  | ||||||
|         .link_level = static_cast<u8>(shared_page.GetWifiLinkLevel()), |  | ||||||
|         .unknown1 = unknown1_value, |  | ||||||
|         .unknown2 = unknown2_value, |  | ||||||
|         .unknown3 = unknown3_value, |  | ||||||
|         .unknown4 = unknown4_value, |  | ||||||
|     }; |  | ||||||
|     std::strncpy(info.ssid.data(), citra_ap, info.ssid.size()); |  | ||||||
| 
 |  | ||||||
|     std::vector<u8> out_info(len); |  | ||||||
|     std::memcpy(out_info.data(), &info, std::min(len, static_cast<u32>(sizeof(info)))); |  | ||||||
| 
 |  | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); |  | ||||||
|     rb.Push(ResultSuccess); |  | ||||||
|     rb.PushStaticBuffer(out_info, 0); |  | ||||||
| 
 |  | ||||||
|     LOG_WARNING(Service_AC, "(STUBBED) called, pid={}", pid); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void Module::Interface::GetConnectingInfraPriority(Kernel::HLERequestContext& ctx) { |  | ||||||
|     IPC::RequestParser rp(ctx); |  | ||||||
| 
 |  | ||||||
|     if (!ac->ac_connected) { |  | ||||||
|         IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |  | ||||||
|         rb.Push(ErrorNotConnected); |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |  | ||||||
|     rb.Push(ResultSuccess); |  | ||||||
|     rb.Push<u32>(static_cast<u32>(InfraPriority::PRIORITY_HIGH)); |  | ||||||
| 
 |  | ||||||
|     LOG_WARNING(Service_AC, "(STUBBED) called"); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void Module::Interface::GetStatus(Kernel::HLERequestContext& ctx) { |  | ||||||
|     IPC::RequestParser rp(ctx); |  | ||||||
| 
 |  | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |  | ||||||
|     rb.Push(ResultSuccess); |  | ||||||
|     rb.Push<u32>(static_cast<u32>(ac->ac_connected ? NetworkStatus::STATUS_INTERNET |  | ||||||
|                                                    : NetworkStatus::STATUS_DISCONNECTED)); |  | ||||||
| 
 |  | ||||||
|     LOG_WARNING(Service_AC, "(STUBBED) called"); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Module::Interface::GetInfraPriority(Kernel::HLERequestContext& ctx) { | void Module::Interface::GetInfraPriority(Kernel::HLERequestContext& ctx) { | ||||||
|  | @ -186,28 +118,16 @@ void Module::Interface::GetInfraPriority(Kernel::HLERequestContext& ctx) { | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|     rb.Push(ResultSuccess); |     rb.Push(ResultSuccess); | ||||||
|     rb.Push<u32>(static_cast<u32>(InfraPriority::PRIORITY_HIGH)); |     rb.Push<u32>(0); // Infra Priority, default 0
 | ||||||
| 
 | 
 | ||||||
|     LOG_WARNING(Service_AC, "(STUBBED) called"); |     LOG_WARNING(Service_AC, "(STUBBED) called"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Module::Interface::SetFromApplication(Kernel::HLERequestContext& ctx) { |  | ||||||
|     IPC::RequestParser rp(ctx); |  | ||||||
|     const u32 unknown = rp.Pop<u32>(); |  | ||||||
|     auto config = rp.PopStaticBuffer(); |  | ||||||
| 
 |  | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); |  | ||||||
|     rb.Push(ResultSuccess); |  | ||||||
|     rb.PushStaticBuffer(config, 0); |  | ||||||
| 
 |  | ||||||
|     LOG_WARNING(Service_AC, "(STUBBED) called, unknown={}", unknown); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void Module::Interface::SetRequestEulaVersion(Kernel::HLERequestContext& ctx) { | void Module::Interface::SetRequestEulaVersion(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp(ctx); |     IPC::RequestParser rp(ctx); | ||||||
| 
 | 
 | ||||||
|     const u32 major = rp.Pop<u8>(); |     u32 major = rp.Pop<u8>(); | ||||||
|     const u32 minor = rp.Pop<u8>(); |     u32 minor = rp.Pop<u8>(); | ||||||
| 
 | 
 | ||||||
|     const std::vector<u8>& ac_config = rp.PopStaticBuffer(); |     const std::vector<u8>& ac_config = rp.PopStaticBuffer(); | ||||||
| 
 | 
 | ||||||
|  | @ -220,19 +140,6 @@ void Module::Interface::SetRequestEulaVersion(Kernel::HLERequestContext& ctx) { | ||||||
|     LOG_WARNING(Service_AC, "(STUBBED) called, major={}, minor={}", major, minor); |     LOG_WARNING(Service_AC, "(STUBBED) called, major={}, minor={}", major, minor); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Module::Interface::GetNZoneBeaconNotFoundEvent(Kernel::HLERequestContext& ctx) { |  | ||||||
|     IPC::RequestParser rp(ctx); |  | ||||||
|     rp.PopPID(); |  | ||||||
|     auto event = rp.PopObject<Kernel::Event>(); |  | ||||||
| 
 |  | ||||||
|     event->Signal(); |  | ||||||
| 
 |  | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |  | ||||||
|     rb.Push(ResultSuccess); |  | ||||||
| 
 |  | ||||||
|     LOG_WARNING(Service_AC, "(STUBBED) called"); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void Module::Interface::RegisterDisconnectEvent(Kernel::HLERequestContext& ctx) { | void Module::Interface::RegisterDisconnectEvent(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp(ctx); |     IPC::RequestParser rp(ctx); | ||||||
|     rp.Skip(2, false); // ProcessId descriptor
 |     rp.Skip(2, false); // ProcessId descriptor
 | ||||||
|  | @ -261,93 +168,30 @@ void Module::Interface::GetConnectingProxyEnable(Kernel::HLERequestContext& ctx) | ||||||
| 
 | 
 | ||||||
| void Module::Interface::IsConnected(Kernel::HLERequestContext& ctx) { | void Module::Interface::IsConnected(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp(ctx); |     IPC::RequestParser rp(ctx); | ||||||
|     const u32 unk = rp.Pop<u32>(); |     u32 unk = rp.Pop<u32>(); | ||||||
|     const u32 pid = rp.PopPID(); |     u32 unk_descriptor = rp.Pop<u32>(); | ||||||
|  |     u32 unk_param = rp.Pop<u32>(); | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|     rb.Push(ResultSuccess); |     rb.Push(ResultSuccess); | ||||||
|     rb.Push(ac->ac_connected); |     rb.Push(ac->ac_connected); | ||||||
| 
 | 
 | ||||||
|     LOG_DEBUG(Service_AC, "(STUBBED) called unk=0x{:08X} pid={}", unk, pid); |     LOG_WARNING(Service_AC, "(STUBBED) called unk=0x{:08X} descriptor=0x{:08X} param=0x{:08X}", unk, | ||||||
|  |                 unk_descriptor, unk_param); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Module::Interface::SetClientVersion(Kernel::HLERequestContext& ctx) { | void Module::Interface::SetClientVersion(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp(ctx); |     IPC::RequestParser rp(ctx); | ||||||
| 
 | 
 | ||||||
|     const u32 version = rp.Pop<u32>(); |     u32 version = rp.Pop<u32>(); | ||||||
|     rp.PopPID(); |     rp.Skip(2, false); // ProcessId descriptor
 | ||||||
| 
 | 
 | ||||||
|     LOG_DEBUG(Service_AC, "(STUBBED) called, version: 0x{:08X}", version); |     LOG_WARNING(Service_AC, "(STUBBED) called, version: 0x{:08X}", version); | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|     rb.Push(ResultSuccess); |     rb.Push(ResultSuccess); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Module::Connect(u32 pid) { |  | ||||||
|     if (connect_event) { |  | ||||||
|         connect_event->SetName("AC:connect_event"); |  | ||||||
|         connect_event->Signal(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (connected_pids.size() == 0) { |  | ||||||
|         // TODO(PabloMK7) Publish to subscriber 0x300
 |  | ||||||
| 
 |  | ||||||
|         ac_connected = true; |  | ||||||
| 
 |  | ||||||
|         // TODO(PabloMK7) Move shared page modification to NWM once it is implemented.
 |  | ||||||
|         SharedPage::Handler& shared_page = system.Kernel().GetSharedPageHandler(); |  | ||||||
|         const bool can_access_internet = CanAccessInternet(); |  | ||||||
|         if (can_access_internet) { |  | ||||||
|             shared_page.SetWifiState(SharedPage::WifiState::Internet); |  | ||||||
|             shared_page.SetWifiLinkLevel(SharedPage::WifiLinkLevel::Best); |  | ||||||
|         } else { |  | ||||||
|             shared_page.SetWifiState(SharedPage::WifiState::Enabled); |  | ||||||
|             shared_page.SetWifiLinkLevel(SharedPage::WifiLinkLevel::Off); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (connected_pids.find(pid) == connected_pids.end()) { |  | ||||||
|         connected_pids.insert(pid); |  | ||||||
|         connect_result = ResultSuccess; |  | ||||||
|     } else { |  | ||||||
|         connect_result = ErrorAlreadyConnected; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void Module::Disconnect(u32 pid) { |  | ||||||
|     if (close_event) { |  | ||||||
|         close_event->SetName("AC:close_event"); |  | ||||||
|         close_event->Signal(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (connected_pids.find(pid) != connected_pids.end()) { |  | ||||||
|         connected_pids.erase(pid); |  | ||||||
|         close_result = ResultSuccess; |  | ||||||
|     } else { |  | ||||||
|         close_result = ErrorNotConnected; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (connected_pids.size() == 0) { |  | ||||||
|         ac_connected = false; |  | ||||||
|         if (disconnect_event) { |  | ||||||
|             disconnect_event->Signal(); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // TODO(PabloMK7) Move shared page modification to NWM once it is implemented.
 |  | ||||||
|         SharedPage::Handler& shared_page = system.Kernel().GetSharedPageHandler(); |  | ||||||
|         shared_page.SetWifiState(SharedPage::WifiState::Enabled); |  | ||||||
|         shared_page.SetWifiLinkLevel(SharedPage::WifiLinkLevel::Off); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool Module::CanAccessInternet() { |  | ||||||
|     std::shared_ptr<SOC::SOC_U> socu_module = SOC::GetService(system); |  | ||||||
|     if (socu_module) { |  | ||||||
|         return socu_module->GetDefaultInterfaceInfo().has_value(); |  | ||||||
|     } |  | ||||||
|     return false; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Module::Interface::Interface(std::shared_ptr<Module> ac, const char* name, u32 max_session) | Module::Interface::Interface(std::shared_ptr<Module> ac, const char* name, u32 max_session) | ||||||
|     : ServiceFramework(name, max_session), ac(std::move(ac)) {} |     : ServiceFramework(name, max_session), ac(std::move(ac)) {} | ||||||
| 
 | 
 | ||||||
|  | @ -358,10 +202,6 @@ void InstallInterfaces(Core::System& system) { | ||||||
|     std::make_shared<AC_U>(ac)->InstallAsService(service_manager); |     std::make_shared<AC_U>(ac)->InstallAsService(service_manager); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::shared_ptr<AC_U> GetService(Core::System& system) { |  | ||||||
|     return system.ServiceManager().GetService<AC_U>("ac:u"); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Module::Module(Core::System& system_) : system(system_) {} | Module::Module(Core::System& system_) : system(system_) {} | ||||||
| 
 | 
 | ||||||
| template <class Archive> | template <class Archive> | ||||||
|  | @ -370,13 +210,6 @@ void Module::serialize(Archive& ar, const unsigned int) { | ||||||
|     ar& close_event; |     ar& close_event; | ||||||
|     ar& connect_event; |     ar& connect_event; | ||||||
|     ar& disconnect_event; |     ar& disconnect_event; | ||||||
|     u32 connect_result_32 = connect_result.raw; |  | ||||||
|     ar& connect_result_32; |  | ||||||
|     connect_result.raw = connect_result_32; |  | ||||||
|     u32 close_result_32 = close_result.raw; |  | ||||||
|     ar& close_result_32; |  | ||||||
|     close_result.raw = close_result_32; |  | ||||||
|     ar& connected_pids; |  | ||||||
|     // default_config is never written to
 |     // default_config is never written to
 | ||||||
| } | } | ||||||
| SERIALIZE_IMPL(Module) | SERIALIZE_IMPL(Module) | ||||||
|  |  | ||||||
|  | @ -17,7 +17,6 @@ class Event; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| namespace Service::AC { | namespace Service::AC { | ||||||
| class AC_U; |  | ||||||
| class Module final { | class Module final { | ||||||
| public: | public: | ||||||
|     explicit Module(Core::System& system_); |     explicit Module(Core::System& system_); | ||||||
|  | @ -59,15 +58,6 @@ public: | ||||||
|          */ |          */ | ||||||
|         void GetConnectResult(Kernel::HLERequestContext& ctx); |         void GetConnectResult(Kernel::HLERequestContext& ctx); | ||||||
| 
 | 
 | ||||||
|         /**
 |  | ||||||
|          * AC::CancelConnectAsync service function |  | ||||||
|          *  Inputs: |  | ||||||
|          *      1 : ProcessId Header |  | ||||||
|          *  Outputs: |  | ||||||
|          *      1 : Result of function, 0 on success, otherwise error code |  | ||||||
|          */ |  | ||||||
|         void CancelConnectAsync(Kernel::HLERequestContext& ctx); |  | ||||||
| 
 |  | ||||||
|         /**
 |         /**
 | ||||||
|          * AC::CloseAsync service function |          * AC::CloseAsync service function | ||||||
|          *  Inputs: |          *  Inputs: | ||||||
|  | @ -88,40 +78,14 @@ public: | ||||||
|          */ |          */ | ||||||
|         void GetCloseResult(Kernel::HLERequestContext& ctx); |         void GetCloseResult(Kernel::HLERequestContext& ctx); | ||||||
| 
 | 
 | ||||||
|         /**
 |  | ||||||
|          * AC::GetStatus service function |  | ||||||
|          *  Outputs: |  | ||||||
|          *      1 : Result of function, 0 on success, otherwise error code |  | ||||||
|          *      2 : Output status |  | ||||||
|          */ |  | ||||||
|         void GetStatus(Kernel::HLERequestContext& ctx); |  | ||||||
| 
 |  | ||||||
|         /**
 |         /**
 | ||||||
|          * AC::GetWifiStatus service function |          * AC::GetWifiStatus service function | ||||||
|          *  Outputs: |          *  Outputs: | ||||||
|          *      1 : Result of function, 0 on success, otherwise error code |          *      1 : Result of function, 0 on success, otherwise error code | ||||||
|          *      2 : Output wifi status |          *      2 : Output connection type, 0 = none, 1 = Old3DS Internet, 2 = New3DS Internet. | ||||||
|          */ |          */ | ||||||
|         void GetWifiStatus(Kernel::HLERequestContext& ctx); |         void GetWifiStatus(Kernel::HLERequestContext& ctx); | ||||||
| 
 | 
 | ||||||
|         /**
 |  | ||||||
|          * AC::GetCurrentAPInfo service function |  | ||||||
|          *  Inputs: |  | ||||||
|          *      1 : Size |  | ||||||
|          *      2-3 : ProcessID |  | ||||||
|          *  Outputs: |  | ||||||
|          *      1 : Result of function, 0 on success, otherwise error code |  | ||||||
|          */ |  | ||||||
|         void GetCurrentAPInfo(Kernel::HLERequestContext& ctx); |  | ||||||
| 
 |  | ||||||
|         /**
 |  | ||||||
|          * AC::GetConnectingInfraPriority service function |  | ||||||
|          *  Outputs: |  | ||||||
|          *      1 : Result of function, 0 on success, otherwise error code |  | ||||||
|          *      2 : Output connecting priority |  | ||||||
|          */ |  | ||||||
|         void GetConnectingInfraPriority(Kernel::HLERequestContext& ctx); |  | ||||||
| 
 |  | ||||||
|         /**
 |         /**
 | ||||||
|          * AC::GetInfraPriority service function |          * AC::GetInfraPriority service function | ||||||
|          *  Inputs: |          *  Inputs: | ||||||
|  | @ -133,15 +97,6 @@ public: | ||||||
|          */ |          */ | ||||||
|         void GetInfraPriority(Kernel::HLERequestContext& ctx); |         void GetInfraPriority(Kernel::HLERequestContext& ctx); | ||||||
| 
 | 
 | ||||||
|         /**
 |  | ||||||
|          * AC::SetFromApplication service function |  | ||||||
|          *  Inputs: |  | ||||||
|          *      1-2 : Input config |  | ||||||
|          *  Outputs: |  | ||||||
|          *      1-2 : Output config |  | ||||||
|          */ |  | ||||||
|         void SetFromApplication(Kernel::HLERequestContext& ctx); |  | ||||||
| 
 |  | ||||||
|         /**
 |         /**
 | ||||||
|          * AC::SetRequestEulaVersion service function |          * AC::SetRequestEulaVersion service function | ||||||
|          *  Inputs: |          *  Inputs: | ||||||
|  | @ -157,17 +112,6 @@ public: | ||||||
|          */ |          */ | ||||||
|         void SetRequestEulaVersion(Kernel::HLERequestContext& ctx); |         void SetRequestEulaVersion(Kernel::HLERequestContext& ctx); | ||||||
| 
 | 
 | ||||||
|         /**
 |  | ||||||
|          * AC::GetNZoneBeaconNotFoundEvent service function |  | ||||||
|          *  Inputs: |  | ||||||
|          *      1 : ProcessId Header |  | ||||||
|          *      3 : Copy Handle Header |  | ||||||
|          *      4 : Event handle, should be signaled when AC cannot find NZone |  | ||||||
|          *  Outputs: |  | ||||||
|          *      1 : Result of function, 0 on success, otherwise error code |  | ||||||
|          */ |  | ||||||
|         void GetNZoneBeaconNotFoundEvent(Kernel::HLERequestContext& ctx); |  | ||||||
| 
 |  | ||||||
|         /**
 |         /**
 | ||||||
|          * AC::RegisterDisconnectEvent service function |          * AC::RegisterDisconnectEvent service function | ||||||
|          *  Inputs: |          *  Inputs: | ||||||
|  | @ -209,46 +153,12 @@ public: | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
|     static constexpr Result ErrorNotConnected = |  | ||||||
|         Result(302, ErrorModule::AC, ErrorSummary::InvalidState, ErrorLevel::Usage); |  | ||||||
| 
 |  | ||||||
|     static constexpr Result ErrorAlreadyConnected = |  | ||||||
|         Result(301, ErrorModule::AC, ErrorSummary::InvalidState, ErrorLevel::Usage); |  | ||||||
| 
 |  | ||||||
|     enum class NetworkStatus { |  | ||||||
|         STATUS_DISCONNECTED = 0, |  | ||||||
|         STATUS_ENABLED = 1, |  | ||||||
|         STATUS_LOCAL = 2, |  | ||||||
|         STATUS_INTERNET = 3, |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     enum class WifiStatus { |     enum class WifiStatus { | ||||||
|         STATUS_DISCONNECTED = 0, |         STATUS_DISCONNECTED = 0, | ||||||
|         STATUS_CONNECTED_SLOT1 = (1 << 0), |         STATUS_CONNECTED_O3DS = 1, | ||||||
|         STATUS_CONNECTED_SLOT2 = (1 << 1), |         STATUS_CONNECTED_N3DS = 2, | ||||||
|         STATUS_CONNECTED_SLOT3 = (1 << 2), |  | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     enum class InfraPriority { |  | ||||||
|         PRIORITY_HIGH = 0, |  | ||||||
|         PRIORITY_LOW = 1, |  | ||||||
|         PRIORITY_NONE = 2, |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct APInfo { |  | ||||||
|         u32 ssid_len; |  | ||||||
|         std::array<char, 0x20> ssid; |  | ||||||
|         std::array<u8, 0x6> bssid; |  | ||||||
|         u16 padding; |  | ||||||
|         s16 signal_strength; |  | ||||||
|         u8 link_level; |  | ||||||
|         u8 unknown1; |  | ||||||
|         u8 unknown2; |  | ||||||
|         u8 unknown3; |  | ||||||
|         u16 unknown4; |  | ||||||
|     }; |  | ||||||
|     static_assert(sizeof(APInfo) == 0x34, "Invalid APInfo size"); |  | ||||||
| 
 |  | ||||||
|     struct ACConfig { |     struct ACConfig { | ||||||
|         std::array<u8, 0x200> data; |         std::array<u8, 0x200> data; | ||||||
|     }; |     }; | ||||||
|  | @ -260,15 +170,6 @@ protected: | ||||||
|     std::shared_ptr<Kernel::Event> close_event; |     std::shared_ptr<Kernel::Event> close_event; | ||||||
|     std::shared_ptr<Kernel::Event> connect_event; |     std::shared_ptr<Kernel::Event> connect_event; | ||||||
|     std::shared_ptr<Kernel::Event> disconnect_event; |     std::shared_ptr<Kernel::Event> disconnect_event; | ||||||
|     Result connect_result = ResultSuccess; |  | ||||||
|     Result close_result = ResultSuccess; |  | ||||||
|     std::set<u32> connected_pids; |  | ||||||
| 
 |  | ||||||
|     void Connect(u32 pid); |  | ||||||
| 
 |  | ||||||
|     void Disconnect(u32 pid); |  | ||||||
| 
 |  | ||||||
|     bool CanAccessInternet(); |  | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     Core::System& system; |     Core::System& system; | ||||||
|  | @ -280,8 +181,6 @@ private: | ||||||
| 
 | 
 | ||||||
| void InstallInterfaces(Core::System& system); | void InstallInterfaces(Core::System& system); | ||||||
| 
 | 
 | ||||||
| std::shared_ptr<AC_U> GetService(Core::System& system); |  | ||||||
| 
 |  | ||||||
| } // namespace Service::AC
 | } // namespace Service::AC
 | ||||||
| 
 | 
 | ||||||
| BOOST_CLASS_EXPORT_KEY(Service::AC::Module) | BOOST_CLASS_EXPORT_KEY(Service::AC::Module) | ||||||
|  |  | ||||||
|  | @ -13,22 +13,19 @@ AC_I::AC_I(std::shared_ptr<Module> ac) : Module::Interface(std::move(ac), "ac:i" | ||||||
|         {0x0001, &AC_I::CreateDefaultConfig, "CreateDefaultConfig"}, |         {0x0001, &AC_I::CreateDefaultConfig, "CreateDefaultConfig"}, | ||||||
|         {0x0004, &AC_I::ConnectAsync, "ConnectAsync"}, |         {0x0004, &AC_I::ConnectAsync, "ConnectAsync"}, | ||||||
|         {0x0005, &AC_I::GetConnectResult, "GetConnectResult"}, |         {0x0005, &AC_I::GetConnectResult, "GetConnectResult"}, | ||||||
|         {0x0007, &AC_I::CancelConnectAsync, "CancelConnectAsync"}, |         {0x0007, nullptr, "CancelConnectAsync"}, | ||||||
|         {0x0008, &AC_I::CloseAsync, "CloseAsync"}, |         {0x0008, &AC_I::CloseAsync, "CloseAsync"}, | ||||||
|         {0x0009, &AC_I::GetCloseResult, "GetCloseResult"}, |         {0x0009, &AC_I::GetCloseResult, "GetCloseResult"}, | ||||||
|         {0x000A, nullptr, "GetLastErrorCode"}, |         {0x000A, nullptr, "GetLastErrorCode"}, | ||||||
|         {0x000C, &AC_I::GetStatus, "GetStatus"}, |         {0x000C, nullptr, "GetStatus"}, | ||||||
|         {0x000D, &AC_I::GetWifiStatus, "GetWifiStatus"}, |         {0x000D, &AC_I::GetWifiStatus, "GetWifiStatus"}, | ||||||
|         {0x000E, &AC_I::GetCurrentAPInfo, "GetCurrentAPInfo"}, |         {0x000E, nullptr, "GetCurrentAPInfo"}, | ||||||
|         {0x000F, &AC_I::GetConnectingInfraPriority, "GetConnectingInfraPriority"}, |  | ||||||
|         {0x0010, nullptr, "GetCurrentNZoneInfo"}, |         {0x0010, nullptr, "GetCurrentNZoneInfo"}, | ||||||
|         {0x0011, nullptr, "GetNZoneApNumService"}, |         {0x0011, nullptr, "GetNZoneApNumService"}, | ||||||
|         {0x001D, nullptr, "ScanAPs"}, |         {0x001D, nullptr, "ScanAPs"}, | ||||||
|         {0x0024, nullptr, "AddDenyApType"}, |         {0x0024, nullptr, "AddDenyApType"}, | ||||||
|         {0x0027, &AC_I::GetInfraPriority, "GetInfraPriority"}, |         {0x0027, &AC_I::GetInfraPriority, "GetInfraPriority"}, | ||||||
|         {0x002C, &AC_I::SetFromApplication, "SetFromApplication"}, |  | ||||||
|         {0x002D, &AC_I::SetRequestEulaVersion, "SetRequestEulaVersion"}, |         {0x002D, &AC_I::SetRequestEulaVersion, "SetRequestEulaVersion"}, | ||||||
|         {0x002F, &AC_I::GetNZoneBeaconNotFoundEvent, "GetNZoneBeaconNotFoundEvent"}, |  | ||||||
|         {0x0030, &AC_I::RegisterDisconnectEvent, "RegisterDisconnectEvent"}, |         {0x0030, &AC_I::RegisterDisconnectEvent, "RegisterDisconnectEvent"}, | ||||||
|         {0x0036, &AC_I::GetConnectingProxyEnable, "GetConnectingProxyEnable"}, |         {0x0036, &AC_I::GetConnectingProxyEnable, "GetConnectingProxyEnable"}, | ||||||
|         {0x003C, nullptr, "GetAPSSIDList"}, |         {0x003C, nullptr, "GetAPSSIDList"}, | ||||||
|  |  | ||||||
|  | @ -13,22 +13,19 @@ AC_U::AC_U(std::shared_ptr<Module> ac) : Module::Interface(std::move(ac), "ac:u" | ||||||
|         {0x0001, &AC_U::CreateDefaultConfig, "CreateDefaultConfig"}, |         {0x0001, &AC_U::CreateDefaultConfig, "CreateDefaultConfig"}, | ||||||
|         {0x0004, &AC_U::ConnectAsync, "ConnectAsync"}, |         {0x0004, &AC_U::ConnectAsync, "ConnectAsync"}, | ||||||
|         {0x0005, &AC_U::GetConnectResult, "GetConnectResult"}, |         {0x0005, &AC_U::GetConnectResult, "GetConnectResult"}, | ||||||
|         {0x0007, &AC_U::CancelConnectAsync, "CancelConnectAsync"}, |         {0x0007, nullptr, "CancelConnectAsync"}, | ||||||
|         {0x0008, &AC_U::CloseAsync, "CloseAsync"}, |         {0x0008, &AC_U::CloseAsync, "CloseAsync"}, | ||||||
|         {0x0009, &AC_U::GetCloseResult, "GetCloseResult"}, |         {0x0009, &AC_U::GetCloseResult, "GetCloseResult"}, | ||||||
|         {0x000A, nullptr, "GetLastErrorCode"}, |         {0x000A, nullptr, "GetLastErrorCode"}, | ||||||
|         {0x000C, &AC_U::GetStatus, "GetStatus"}, |         {0x000C, nullptr, "GetStatus"}, | ||||||
|         {0x000D, &AC_U::GetWifiStatus, "GetWifiStatus"}, |         {0x000D, &AC_U::GetWifiStatus, "GetWifiStatus"}, | ||||||
|         {0x000E, &AC_U::GetCurrentAPInfo, "GetCurrentAPInfo"}, |         {0x000E, nullptr, "GetCurrentAPInfo"}, | ||||||
|         {0x000F, &AC_U::GetConnectingInfraPriority, "GetConnectingInfraPriority"}, |  | ||||||
|         {0x0010, nullptr, "GetCurrentNZoneInfo"}, |         {0x0010, nullptr, "GetCurrentNZoneInfo"}, | ||||||
|         {0x0011, nullptr, "GetNZoneApNumService"}, |         {0x0011, nullptr, "GetNZoneApNumService"}, | ||||||
|         {0x001D, nullptr, "ScanAPs"}, |         {0x001D, nullptr, "ScanAPs"}, | ||||||
|         {0x0024, nullptr, "AddDenyApType"}, |         {0x0024, nullptr, "AddDenyApType"}, | ||||||
|         {0x0027, &AC_U::GetInfraPriority, "GetInfraPriority"}, |         {0x0027, &AC_U::GetInfraPriority, "GetInfraPriority"}, | ||||||
|         {0x002C, &AC_U::SetFromApplication, "SetFromApplication"}, |  | ||||||
|         {0x002D, &AC_U::SetRequestEulaVersion, "SetRequestEulaVersion"}, |         {0x002D, &AC_U::SetRequestEulaVersion, "SetRequestEulaVersion"}, | ||||||
|         {0x002F, &AC_U::GetNZoneBeaconNotFoundEvent, "GetNZoneBeaconNotFoundEvent"}, |  | ||||||
|         {0x0030, &AC_U::RegisterDisconnectEvent, "RegisterDisconnectEvent"}, |         {0x0030, &AC_U::RegisterDisconnectEvent, "RegisterDisconnectEvent"}, | ||||||
|         {0x0036, &AC_U::GetConnectingProxyEnable, "GetConnectingProxyEnable"}, |         {0x0036, &AC_U::GetConnectingProxyEnable, "GetConnectingProxyEnable"}, | ||||||
|         {0x003C, nullptr, "GetAPSSIDList"}, |         {0x003C, nullptr, "GetAPSSIDList"}, | ||||||
|  |  | ||||||
|  | @ -575,10 +575,6 @@ void NWM_UDS::Shutdown(Kernel::HLERequestContext& ctx) { | ||||||
| 
 | 
 | ||||||
|     recv_buffer_memory.reset(); |     recv_buffer_memory.reset(); | ||||||
| 
 | 
 | ||||||
|     SharedPage::Handler& shared_page = system.Kernel().GetSharedPageHandler(); |  | ||||||
|     shared_page.SetWifiLinkLevel(SharedPage::WifiLinkLevel::Off); |  | ||||||
|     shared_page.SetWifiState(SharedPage::WifiState::Enabled); |  | ||||||
| 
 |  | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|     rb.Push(ResultSuccess); |     rb.Push(ResultSuccess); | ||||||
|     LOG_DEBUG(Service_NWM, "called"); |     LOG_DEBUG(Service_NWM, "called"); | ||||||
|  | @ -671,10 +667,6 @@ ResultVal<std::shared_ptr<Kernel::Event>> NWM_UDS::Initialize( | ||||||
|         channel_data.clear(); |         channel_data.clear(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     SharedPage::Handler& shared_page = system.Kernel().GetSharedPageHandler(); |  | ||||||
|     shared_page.SetWifiLinkLevel(SharedPage::WifiLinkLevel::Best); |  | ||||||
|     shared_page.SetWifiState(SharedPage::WifiState::Local1); |  | ||||||
| 
 |  | ||||||
|     return connection_status_event; |     return connection_status_event; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue