nifm.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "core/core.h"
  5. #include "core/hle/ipc_helpers.h"
  6. #include "core/hle/kernel/event.h"
  7. #include "core/hle/service/nifm/nifm.h"
  8. #include "core/hle/service/service.h"
  9. namespace Service::NIFM {
  10. class IScanRequest final : public ServiceFramework<IScanRequest> {
  11. public:
  12. explicit IScanRequest() : ServiceFramework("IScanRequest") {
  13. static const FunctionInfo functions[] = {
  14. {0, nullptr, "Submit"},
  15. {1, nullptr, "IsProcessing"},
  16. {2, nullptr, "GetResult"},
  17. {3, nullptr, "GetSystemEventReadableHandle"},
  18. };
  19. RegisterHandlers(functions);
  20. }
  21. };
  22. class IRequest final : public ServiceFramework<IRequest> {
  23. public:
  24. explicit IRequest() : ServiceFramework("IRequest") {
  25. static const FunctionInfo functions[] = {
  26. {0, &IRequest::GetRequestState, "GetRequestState"},
  27. {1, &IRequest::GetResult, "GetResult"},
  28. {2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"},
  29. {3, &IRequest::Cancel, "Cancel"},
  30. {4, &IRequest::Submit, "Submit"},
  31. {5, nullptr, "SetRequirement"},
  32. {6, nullptr, "SetRequirementPreset"},
  33. {8, nullptr, "SetPriority"},
  34. {9, nullptr, "SetNetworkProfileId"},
  35. {10, nullptr, "SetRejectable"},
  36. {11, &IRequest::SetConnectionConfirmationOption, "SetConnectionConfirmationOption"},
  37. {12, nullptr, "SetPersistent"},
  38. {13, nullptr, "SetInstant"},
  39. {14, nullptr, "SetSustainable"},
  40. {15, nullptr, "SetRawPriority"},
  41. {16, nullptr, "SetGreedy"},
  42. {17, nullptr, "SetSharable"},
  43. {18, nullptr, "SetRequirementByRevision"},
  44. {19, nullptr, "GetRequirement"},
  45. {20, nullptr, "GetRevision"},
  46. {21, nullptr, "GetAppletInfo"},
  47. {22, nullptr, "GetAdditionalInfo"},
  48. {23, nullptr, "SetKeptInSleep"},
  49. {24, nullptr, "RegisterSocketDescriptor"},
  50. {25, nullptr, "UnregisterSocketDescriptor"},
  51. };
  52. RegisterHandlers(functions);
  53. auto& kernel = Core::System::GetInstance().Kernel();
  54. event1 = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IRequest:Event1");
  55. event2 = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IRequest:Event2");
  56. }
  57. private:
  58. void Submit(Kernel::HLERequestContext& ctx) {
  59. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  60. IPC::ResponseBuilder rb{ctx, 2};
  61. rb.Push(RESULT_SUCCESS);
  62. }
  63. void GetRequestState(Kernel::HLERequestContext& ctx) {
  64. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  65. IPC::ResponseBuilder rb{ctx, 3};
  66. rb.Push(RESULT_SUCCESS);
  67. rb.Push<u32>(3);
  68. }
  69. void GetResult(Kernel::HLERequestContext& ctx) {
  70. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  71. IPC::ResponseBuilder rb{ctx, 2};
  72. rb.Push(RESULT_SUCCESS);
  73. }
  74. void GetSystemEventReadableHandles(Kernel::HLERequestContext& ctx) {
  75. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  76. IPC::ResponseBuilder rb{ctx, 2, 2};
  77. rb.Push(RESULT_SUCCESS);
  78. rb.PushCopyObjects(event1, event2);
  79. }
  80. void Cancel(Kernel::HLERequestContext& ctx) {
  81. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  82. IPC::ResponseBuilder rb{ctx, 2};
  83. rb.Push(RESULT_SUCCESS);
  84. }
  85. void SetConnectionConfirmationOption(Kernel::HLERequestContext& ctx) {
  86. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  87. IPC::ResponseBuilder rb{ctx, 2};
  88. rb.Push(RESULT_SUCCESS);
  89. }
  90. Kernel::SharedPtr<Kernel::Event> event1, event2;
  91. };
  92. class INetworkProfile final : public ServiceFramework<INetworkProfile> {
  93. public:
  94. explicit INetworkProfile() : ServiceFramework("INetworkProfile") {
  95. static const FunctionInfo functions[] = {
  96. {0, nullptr, "Update"},
  97. {1, nullptr, "PersistOld"},
  98. {2, nullptr, "Persist"},
  99. };
  100. RegisterHandlers(functions);
  101. }
  102. };
  103. class IGeneralService final : public ServiceFramework<IGeneralService> {
  104. public:
  105. IGeneralService();
  106. private:
  107. void GetClientId(Kernel::HLERequestContext& ctx) {
  108. static constexpr u32 client_id = 1;
  109. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  110. IPC::ResponseBuilder rb{ctx, 4};
  111. rb.Push(RESULT_SUCCESS);
  112. rb.Push<u64>(client_id); // Client ID needs to be non zero otherwise it's considered invalid
  113. }
  114. void CreateScanRequest(Kernel::HLERequestContext& ctx) {
  115. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  116. rb.Push(RESULT_SUCCESS);
  117. rb.PushIpcInterface<IScanRequest>();
  118. LOG_DEBUG(Service_NIFM, "called");
  119. }
  120. void CreateRequest(Kernel::HLERequestContext& ctx) {
  121. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  122. rb.Push(RESULT_SUCCESS);
  123. rb.PushIpcInterface<IRequest>();
  124. LOG_DEBUG(Service_NIFM, "called");
  125. }
  126. void RemoveNetworkProfile(Kernel::HLERequestContext& ctx) {
  127. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  128. IPC::ResponseBuilder rb{ctx, 2};
  129. rb.Push(RESULT_SUCCESS);
  130. }
  131. void CreateTemporaryNetworkProfile(Kernel::HLERequestContext& ctx) {
  132. ASSERT_MSG(ctx.GetReadBufferSize() == 0x17c, "NetworkProfileData is not the correct size");
  133. u128 uuid{};
  134. auto buffer = ctx.ReadBuffer();
  135. std::memcpy(&uuid, buffer.data() + 8, sizeof(u128));
  136. IPC::ResponseBuilder rb{ctx, 6, 0, 1};
  137. rb.Push(RESULT_SUCCESS);
  138. rb.PushIpcInterface<INetworkProfile>();
  139. rb.PushRaw<u128>(uuid);
  140. LOG_DEBUG(Service_NIFM, "called");
  141. }
  142. void IsWirelessCommunicationEnabled(Kernel::HLERequestContext& ctx) {
  143. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  144. IPC::ResponseBuilder rb{ctx, 3};
  145. rb.Push(RESULT_SUCCESS);
  146. rb.Push<u8>(0);
  147. }
  148. void IsEthernetCommunicationEnabled(Kernel::HLERequestContext& ctx) {
  149. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  150. IPC::ResponseBuilder rb{ctx, 3};
  151. rb.Push(RESULT_SUCCESS);
  152. rb.Push<u8>(0);
  153. }
  154. void IsAnyInternetRequestAccepted(Kernel::HLERequestContext& ctx) {
  155. LOG_WARNING(Service_NIFM, "(STUBBED) called");
  156. IPC::ResponseBuilder rb{ctx, 3};
  157. rb.Push(RESULT_SUCCESS);
  158. rb.Push<u8>(0);
  159. }
  160. };
  161. IGeneralService::IGeneralService() : ServiceFramework("IGeneralService") {
  162. static const FunctionInfo functions[] = {
  163. {1, &IGeneralService::GetClientId, "GetClientId"},
  164. {2, &IGeneralService::CreateScanRequest, "CreateScanRequest"},
  165. {4, &IGeneralService::CreateRequest, "CreateRequest"},
  166. {5, nullptr, "GetCurrentNetworkProfile"},
  167. {6, nullptr, "EnumerateNetworkInterfaces"},
  168. {7, nullptr, "EnumerateNetworkProfiles"},
  169. {8, nullptr, "GetNetworkProfile"},
  170. {9, nullptr, "SetNetworkProfile"},
  171. {10, &IGeneralService::RemoveNetworkProfile, "RemoveNetworkProfile"},
  172. {11, nullptr, "GetScanDataOld"},
  173. {12, nullptr, "GetCurrentIpAddress"},
  174. {13, nullptr, "GetCurrentAccessPointOld"},
  175. {14, &IGeneralService::CreateTemporaryNetworkProfile, "CreateTemporaryNetworkProfile"},
  176. {15, nullptr, "GetCurrentIpConfigInfo"},
  177. {16, nullptr, "SetWirelessCommunicationEnabled"},
  178. {17, &IGeneralService::IsWirelessCommunicationEnabled, "IsWirelessCommunicationEnabled"},
  179. {18, nullptr, "GetInternetConnectionStatus"},
  180. {19, nullptr, "SetEthernetCommunicationEnabled"},
  181. {20, &IGeneralService::IsEthernetCommunicationEnabled, "IsEthernetCommunicationEnabled"},
  182. {21, &IGeneralService::IsAnyInternetRequestAccepted, "IsAnyInternetRequestAccepted"},
  183. {22, nullptr, "IsAnyForegroundRequestAccepted"},
  184. {23, nullptr, "PutToSleep"},
  185. {24, nullptr, "WakeUp"},
  186. {25, nullptr, "GetSsidListVersion"},
  187. {26, nullptr, "SetExclusiveClient"},
  188. {27, nullptr, "GetDefaultIpSetting"},
  189. {28, nullptr, "SetDefaultIpSetting"},
  190. {29, nullptr, "SetWirelessCommunicationEnabledForTest"},
  191. {30, nullptr, "SetEthernetCommunicationEnabledForTest"},
  192. {31, nullptr, "GetTelemetorySystemEventReadableHandle"},
  193. {32, nullptr, "GetTelemetryInfo"},
  194. {33, nullptr, "ConfirmSystemAvailability"},
  195. {34, nullptr, "SetBackgroundRequestEnabled"},
  196. {35, nullptr, "GetScanData"},
  197. {36, nullptr, "GetCurrentAccessPoint"},
  198. {37, nullptr, "Shutdown"},
  199. };
  200. RegisterHandlers(functions);
  201. }
  202. class NetworkInterface final : public ServiceFramework<NetworkInterface> {
  203. public:
  204. explicit NetworkInterface(const char* name) : ServiceFramework{name} {
  205. static const FunctionInfo functions[] = {
  206. {4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"},
  207. {5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"},
  208. };
  209. RegisterHandlers(functions);
  210. }
  211. void CreateGeneralServiceOld(Kernel::HLERequestContext& ctx) {
  212. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  213. rb.Push(RESULT_SUCCESS);
  214. rb.PushIpcInterface<IGeneralService>();
  215. LOG_DEBUG(Service_NIFM, "called");
  216. }
  217. void CreateGeneralService(Kernel::HLERequestContext& ctx) {
  218. IPC::ResponseBuilder rb{ctx, 2, 0, 1};
  219. rb.Push(RESULT_SUCCESS);
  220. rb.PushIpcInterface<IGeneralService>();
  221. LOG_DEBUG(Service_NIFM, "called");
  222. }
  223. };
  224. void InstallInterfaces(SM::ServiceManager& service_manager) {
  225. std::make_shared<NetworkInterface>("nifm:a")->InstallAsService(service_manager);
  226. std::make_shared<NetworkInterface>("nifm:s")->InstallAsService(service_manager);
  227. std::make_shared<NetworkInterface>("nifm:u")->InstallAsService(service_manager);
  228. }
  229. } // namespace Service::NIFM