nwm_uds.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "common/logging/log.h"
  5. #include "core/hle/hle.h"
  6. #include "core/hle/kernel/event.h"
  7. #include "core/hle/service/nwm_uds.h"
  8. ////////////////////////////////////////////////////////////////////////////////////////////////////
  9. // Namespace NWM_UDS
  10. namespace NWM_UDS {
  11. static Kernel::SharedPtr<Kernel::Event> handle_event;
  12. /**
  13. * NWM_UDS::Shutdown service function
  14. * Inputs:
  15. * 1 : None
  16. * Outputs:
  17. * 0 : Return header
  18. * 1 : Result of function, 0 on success, otherwise error code
  19. */
  20. static void Shutdown(Service::Interface* self) {
  21. u32* cmd_buff = Kernel::GetCommandBuffer();
  22. // TODO(purpasmart): Verify return header on HW
  23. cmd_buff[1] = RESULT_SUCCESS.raw;
  24. LOG_WARNING(Service_NWM, "(STUBBED) called");
  25. }
  26. /**
  27. * NWM_UDS::RecvBeaconBroadcastData service function
  28. * Inputs:
  29. * 1 : Output buffer max size
  30. * 2 : Unknown
  31. * 3 : Unknown
  32. * 4 : MAC address?
  33. * 6-14 : Unknown, usually zero / uninitialized?
  34. * 15 : WLan Comm ID
  35. * 16 : This is the ID also located at offset 0xE in the CTR-generation structure.
  36. * 17 : Value 0
  37. * 18 : Input handle
  38. * 19 : (Size<<4) | 12
  39. * 20 : Output buffer ptr
  40. * Outputs:
  41. * 0 : Return header
  42. * 1 : Result of function, 0 on success, otherwise error code
  43. */
  44. static void RecvBeaconBroadcastData(Service::Interface* self) {
  45. u32* cmd_buff = Kernel::GetCommandBuffer();
  46. u32 out_buffer_size = cmd_buff[1];
  47. u32 unk1 = cmd_buff[2];
  48. u32 unk2 = cmd_buff[3];
  49. u32 mac_address = cmd_buff[4];
  50. u32 unk3 = cmd_buff[6];
  51. u32 wlan_comm_id = cmd_buff[15];
  52. u32 ctr_gen_id = cmd_buff[16];
  53. u32 value = cmd_buff[17];
  54. u32 input_handle = cmd_buff[18];
  55. u32 new_buffer_size = cmd_buff[19];
  56. u32 out_buffer_ptr = cmd_buff[20];
  57. cmd_buff[1] = RESULT_SUCCESS.raw;
  58. LOG_WARNING(Service_NWM, "(STUBBED) called out_buffer_size=0x%08X, unk1=0x%08X, unk2=0x%08X,"
  59. "mac_address=0x%08X, unk3=0x%08X, wlan_comm_id=0x%08X, ctr_gen_id=0x%08X,"
  60. "value=%u, input_handle=0x%08X, new_buffer_size=0x%08X, out_buffer_ptr=0x%08X",
  61. out_buffer_size, unk1, unk2, mac_address, unk3, wlan_comm_id, ctr_gen_id, value,
  62. input_handle, new_buffer_size, out_buffer_ptr);
  63. }
  64. /**
  65. * NWM_UDS::Initialize service function
  66. * Inputs:
  67. * 1 : Unknown
  68. * 2-11 : Input Structure
  69. * 12 : Unknown u16
  70. * 13 : Value 0
  71. * 14 : Handle
  72. * Outputs:
  73. * 0 : Return header
  74. * 1 : Result of function, 0 on success, otherwise error code
  75. * 2 : Value 0
  76. * 3 : Output handle
  77. */
  78. static void Initialize(Service::Interface* self) {
  79. u32* cmd_buff = Kernel::GetCommandBuffer();
  80. u32 unk1 = cmd_buff[1];
  81. u32 unk2 = cmd_buff[12];
  82. u32 value = cmd_buff[13];
  83. u32 handle = cmd_buff[14];
  84. cmd_buff[1] = RESULT_SUCCESS.raw;
  85. cmd_buff[2] = 0;
  86. cmd_buff[3] = Kernel::g_handle_table.Create(handle_event).MoveFrom(); //TODO(purpasmart): Verify if this is a event handle
  87. LOG_WARNING(Service_NWM, "(STUBBED) called unk1=0x%08X, unk2=0x%08X, value=%u, handle=0x%08X",
  88. unk1, unk2, value, handle);
  89. }
  90. const Interface::FunctionInfo FunctionTable[] = {
  91. {0x00030000, Shutdown, "Shutdown"},
  92. {0x000F0404, RecvBeaconBroadcastData, "RecvBeaconBroadcastData"},
  93. {0x00100042, nullptr, "SetBeaconAdditionalData"},
  94. {0x001400C0, nullptr, "RecvBroadcastDataFrame"},
  95. {0x001B0302, Initialize, "Initialize"},
  96. {0x001D0044, nullptr, "BeginHostingNetwork"},
  97. {0x001E0084, nullptr, "ConnectToNetwork"},
  98. {0x001F0006, nullptr, "DecryptBeaconData"},
  99. };
  100. ////////////////////////////////////////////////////////////////////////////////////////////////////
  101. // Interface class
  102. Interface::Interface() {
  103. handle_event = Kernel::Event::Create(RESETTYPE_ONESHOT, "NWM_UDS::handle_event");
  104. Register(FunctionTable);
  105. }
  106. Interface::~Interface() {
  107. handle_event = nullptr;
  108. }
  109. } // namespace