LDN services: Difference between revisions
No edit summary |
|||
Line 647: | Line 647: | ||
=== CreateGroup === | === CreateGroup === | ||
Takes a type-0x31 input buffer containing a | Takes a type-0x31 input buffer containing a [[#GroupInfo]], no output. | ||
[[Mario Kart Live: Home Circuit|mklive]] uses the following string with this: "Failed to create a group: %08X". | [[Mario Kart Live: Home Circuit|mklive]] uses the following string with this: "Failed to create a group: %08X". | ||
Line 765: | Line 765: | ||
=== Join === | === Join === | ||
Takes a type-0x32 output buffer containing a [[#GroupInfo]] and a type-0x31 input buffer containing a | Takes a type-0x32 output buffer containing a [[#GroupInfo]] and a type-0x31 input buffer containing a [[#GroupInfo]]. | ||
This runs the same code as [[#CreateGroup]] to generate the [[#GroupInfo]] for the input struct (which with [[#CreateGroup]] would be available with [[#GetGroupInfo]]). The input struct is the same as [[#CreateGroup]]. | This runs the same code as [[#CreateGroup]] to generate the [[#GroupInfo]] for the input struct (which with [[#CreateGroup]] would be available with [[#GetGroupInfo]]). The input struct is the same as [[#CreateGroup]]. | ||
Line 1,192: | Line 1,192: | ||
= GroupInfo = | = GroupInfo = | ||
This is "nn::lp2p::GroupInfo". This is a 0x200-byte struct. | This is "nn::lp2p::GroupInfo". This is a 0x200-byte struct. | ||
[[Mario Kart Live: Home Circuit|mklive]] sets the SSID to a string generated from random data, the key-data is also set to random data. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 1,199: | Line 1,201: | ||
! Description | ! Description | ||
|- | |- | ||
| 0x10 || 0x8 || LocalCommunicationId | | 0x0 || 0x10 || When zero, this is set to randomly-generated data. | ||
|- | |||
| 0x10 || 0x8 || LocalCommunicationId. When zero, the value from control.nacp is loaded. | |||
|- | |||
| 0x18 || 0x6 || "GROUP ID (BSSID)" [[#GroupId]]. When zero, the default is used. | |||
|- | |- | ||
| | | 0x1E || 0x15 || "GROUP NAME (SSID)" NUL-terminated string. | ||
|- | |- | ||
| | | 0x3F || 0x1 || s8 Flags_mask count. | ||
|- | |||
| 0x40 || {above count} || Array of s8 with the above count. Each entry is an array index used to load a set of flags from a global array with the specified index. loaded_flags below is masked with the flags loaded here. global_flags are also masked with flags loaded from here. | |||
|- | |- | ||
| 0x84 || 0x2 || Wifi frequency: 24 = 2.4GHz, 50 = 5.0GHz. | | 0x84 || 0x2 || Wifi frequency: 24 = 2.4GHz, 50 = 5.0GHz. | ||
Line 1,210: | Line 1,218: | ||
* 24: 1, 6, 11. | * 24: 1, 6, 11. | ||
* 50: 36, 40, 44, 48. | * 50: 36, 40, 44, 48. | ||
|- | |||
| 0x8A || 0x1 || Security type. 0 = use defaults, 2 = encrypted, other-values = plaintext. | |||
|- | |||
| 0x8B || 0x1 || | |||
|- | |||
| 0x8E || 0x1 || Bool flag, controls whether the SSID is hidden. | |||
|- | |||
| 0x8F || 0x1 || If zero, a default value of 0x20 is used. | |||
|- | |||
| 0x10F || 0x1 || Flags count. | |||
|- | |||
| 0x110 || {above count} || Array of s8 with the above count for total entries. The flags are loaded by: <nowiki>"loaded_flags |= BIT(s8_entryvalue)"</nowiki>, with each entry. Afterwards, loaded_flags is masked with 0x7. loaded_flags must be non-zero. | |||
|- | |||
| 0x1C0 || 0x1 || Key data size. Must be 0x20. | |||
|- | |||
| 0x1C1 || 0x20 || Key data. | |||
|} | |} | ||
The above loaded_flags are used when +0x8A is 0. global_flags are loaded from global data. Flags: | |||
* Bit2 clear: | |||
** global_flags must be non-zero, and loaded_flags bit1 must be set. | |||
** u8 +0x8A is set to value 1. | |||
** When the cached [[SPL_services#IsDevelopment|IsDevelopment]] value is false (retail), an error is thrown. | |||
** u8 +0x8B is set to value 0. | |||
* Otherwise, if bit2 is set: | |||
** u8 +0x8A is set to value 2. | |||
** global_flags bit1 set: | |||
*** u8 +0x8B is set to value 1. | |||
** Otherwise, if global_flags bit2 is set: | |||
*** u8 +0x8B is set to value 2. | |||
= ScanResult = | = ScanResult = |