LDN services: Difference between revisions
No edit summary |
No edit summary |
||
(9 intermediate revisions by 3 users not shown) | |||
Line 90: | Line 90: | ||
|- | |- | ||
| 0 || [[#CreateSystemLocalCommunicationService]] | | 0 || [[#CreateSystemLocalCommunicationService]] | ||
|- | |||
| 1 || [18.0.0+] [[#CreateClientProcessMonitor]] | |||
|} | |} | ||
== CreateSystemLocalCommunicationService == | == CreateSystemLocalCommunicationService == | ||
Returns an [[#ISystemLocalCommunicationService]]. | No input. Returns an [[#ISystemLocalCommunicationService]]. | ||
The user-process closes the ISystemServiceCreator object immediately after using this cmd. Official sw ignores errors from this cmd. | The user-process closes the ISystemServiceCreator object immediately after using this cmd. Official sw ignores errors from this cmd. | ||
== CreateClientProcessMonitor == | |||
No input. Returns an [[#IClientProcessMonitor]]. | |||
== ISystemLocalCommunicationService == | == ISystemLocalCommunicationService == | ||
Line 125: | Line 130: | ||
|- | |- | ||
| 104 || [5.0.0+] [[#SetWirelessControllerRestriction]] | | 104 || [5.0.0+] [[#SetWirelessControllerRestriction]] | ||
|- | |||
| 105 || [13.1.0+] [[#SetBluetoothAudioDeviceConnectableMode]] | |||
|- | |||
| 106 || [18.0.0+] | |||
|- | |- | ||
| 200 || [[#OpenAccessPoint]] | | 200 || [[#OpenAccessPoint]] | ||
Line 163: | Line 172: | ||
|- | |- | ||
| 403 || [7.0.0+] [[#InitializeSystem2]] | | 403 || [7.0.0+] [[#InitializeSystem2]] | ||
|- | |- | ||
| | | 404 || [19.0.0+] | ||
|- | |- | ||
| | | 500 || [18.0.0+] EnableActionFrame | ||
|- | |- | ||
| | | 501 || [18.0.0+] DisableActionFrame | ||
|- | |- | ||
| | | 502 || [18.0.0+] SendActionFrame | ||
|- | |- | ||
| | | 503 || [18.0.0+] RecvActionFrame | ||
|- | |- | ||
| | | 505 || [18.0.0+] SetHomeChannel | ||
|- | |- | ||
| | | 600 || [18.0.0+] SetTxPower | ||
|- | |- | ||
| 601 || [18.0.0+] ResetTxPower | |||
|} | |} | ||
=== GetState === | |||
No input, returns an output [[#State]]. | |||
sdknso implements this by <code>return</code>ing the u32, with 0 being returned on error / when service isn't initialized. | |||
=== GetNetworkInfo === | === GetNetworkInfo === | ||
Line 198: | Line 202: | ||
=== GetDisconnectReason === | === GetDisconnectReason === | ||
No input, returns an output | No input, returns an output [[#DisconnectReason]]. | ||
sdknso implements this by <code>return</code>ing the s16 as a s32, with -1 being returned on error. | sdknso implements this by <code>return</code>ing the s16 as a s32, with -1 being returned on error. | ||
=== GetSecurityParameter === | |||
No input, returns an output [[#SecurityParameter]]. | |||
=== GetSecurityParameter === | |||
No input, returns an output [[#SecurityParameter]]. | |||
=== GetNetworkConfig === | === GetNetworkConfig === | ||
Line 266: | Line 248: | ||
The input value is written into state. | The input value is written into state. | ||
=== SetBluetoothAudioDeviceConnectableMode === | |||
Takes an input [[#BluetoothAudioDeviceConnectableMode]], no output. | |||
=== OpenAccessPoint === | === OpenAccessPoint === | ||
Line 399: | Line 384: | ||
[[#GetState|State]] must be 0, this cmd eventually sets the State to value 1. | [[#GetState|State]] must be 0, this cmd eventually sets the State to value 1. | ||
== IClientProcessMonitor == | |||
This is "nn::ldn::detail::IClientProcessMonitor". | |||
This was added with [18.0.0+]. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Cmd || Name | |||
|- | |||
| 0 || RegisterClient | |||
|} | |||
= ldn:u = | = ldn:u = | ||
Line 408: | Line 405: | ||
|- | |- | ||
| 0 || [[#CreateUserLocalCommunicationService]] | | 0 || [[#CreateUserLocalCommunicationService]] | ||
|- | |||
| 1 || [18.0.0+] [[#CreateClientProcessMonitor]] | |||
|} | |} | ||
Line 445: | Line 444: | ||
|- | |- | ||
| 104 || [5.0.0+] [[#SetWirelessControllerRestriction]] | | 104 || [5.0.0+] [[#SetWirelessControllerRestriction]] | ||
|- | |||
| 105 || [13.1.0+] [[#SetBluetoothAudioDeviceConnectableMode]] | |||
|- | |||
| 106 || [18.0.0+] | |||
|- | |- | ||
| 200 || [[#OpenAccessPoint]] | | 200 || [[#OpenAccessPoint]] | ||
Line 481: | Line 484: | ||
|- | |- | ||
| 402 || [7.0.0+] [[#Initialize2]] | | 402 || [7.0.0+] [[#Initialize2]] | ||
|- | |||
| 403 || [19.0.0+] | |||
|- | |||
| 500 || [18.0.0+] EnableActionFrame | |||
|- | |||
| 501 || [18.0.0+] DisableActionFrame | |||
|- | |||
| 502 || [18.0.0+] SendActionFrame | |||
|- | |||
| 503 || [18.0.0+] RecvActionFrame | |||
|- | |||
| 505 || [18.0.0+] SetHomeChannel | |||
|- | |||
| 600 || [18.0.0+] SetTxPower | |||
|- | |||
| 601 || [18.0.0+] ResetTxPower | |||
|} | |} | ||
Line 569: | Line 588: | ||
= lp2p:app, lp2p:sys = | = lp2p:app, lp2p:sys = | ||
These are "nn::lp2p::detail:: | These are "nn::lp2p::detail::ISfServiceCreator". | ||
These were added with [9.0.0+]. | These were added with [9.0.0+]. | ||
Line 585: | Line 604: | ||
== CreateNetworkService == | == CreateNetworkService == | ||
Takes a PID-descriptor, a reserved input u64 and an input u32. Returns an output [[# | Takes a PID-descriptor, a reserved input u64 and an input u32. Returns an output [[#ISfService]]. | ||
The input u32 must be value 0x1. | The input u32 must be value 0x1. | ||
== CreateNetworkServiceMonitor == | == CreateNetworkServiceMonitor == | ||
Takes a PID-descriptor and a reserved input u64. Returns an output [[# | Takes a PID-descriptor and a reserved input u64. Returns an output [[#ISfServiceMonitor]]. | ||
== | == ISfService == | ||
This is "nn::lp2p::detail:: | This is "nn::lp2p::detail::ISfService". | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 703: | Line 722: | ||
No input/output. | No input/output. | ||
== | == ISfServiceMonitor == | ||
This is "nn::lp2p::detail:: | This is "nn::lp2p::detail::ISfServiceMonitor". | ||
This interface has no commands, until [9.1.0+] which added actual commands. | This interface has no commands, until [9.1.0+] which added actual commands. | ||
Line 799: | Line 818: | ||
= lp2p:m = | = lp2p:m = | ||
This is "nn::lp2p::detail:: | This is "nn::lp2p::monitor::detail::ISfMonitorServiceCreator". | ||
This was added with [9.1.0+]. | This was added with [9.1.0+]. | ||
Line 811: | Line 830: | ||
== CreateMonitorService == | == CreateMonitorService == | ||
Takes a PID-descriptor, a reserved input u64 and an input u64. Returns an [[# | Takes a PID-descriptor, a reserved input u64 and an input u64. Returns an [[#ISfMonitorService]]. | ||
== | == ISfMonitorService == | ||
This is "nn::lp2p::detail:: | This is "nn::lp2p::monitor::detail::ISfMonitorService". | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 830: | Line 849: | ||
Returns 0. | Returns 0. | ||
= | = State = | ||
This is "nn::ldn:: | This is "nn::ldn::State". | ||
This is generally "169.254.XXX.{...}", where XXX is random per created network. | {| class="wikitable" border="1" | ||
|- | |||
= SubnetMask = | ! Value | ||
This is "nn::ldn::SubnetMask". This is a 0x4-byte struct with 4-byte alignment. | ! Description | ||
|- | |||
| 0 || None | |||
|- | |||
| 1 || Initialized | |||
|- | |||
| 2 || AccessPoint | |||
|- | |||
| 3 || AccessPointCreated | |||
|- | |||
| 4 || Station | |||
|- | |||
| 5 || StationConnected | |||
|- | |||
| 6 || Error | |||
|- | |||
|} | |||
= Ipv4Address = | |||
This is "nn::ldn::Ipv4Address". This is a 0x4-byte struct with 4-byte alignment. | |||
This is essentially the same as <code>struct in_addr</code>, except this is little-endian. | |||
This is generally "169.254.XXX.{...}", where XXX is random per created network. | |||
= SubnetMask = | |||
This is "nn::ldn::SubnetMask". This is a 0x4-byte struct with 4-byte alignment. | |||
This is essentially the same as <code>struct in_addr</code>, except this is little-endian. | This is essentially the same as <code>struct in_addr</code>, except this is little-endian. | ||
Line 853: | Line 896: | ||
! Description | ! Description | ||
|- | |- | ||
| 0x0 || 0x1 || Length excluding NUL-terminator, must be 0x1-0x20 | | 0x0 || 0x1 || Length (excluding NUL-terminator, must be 0x1-0x20) | ||
|- | |- | ||
| 0x1 || 0x21 || SSID string including NUL-terminator, str[{above length}] must be 0 | | 0x1 || 0x21 || Raw (SSID string including NUL-terminator, str[{above length}] must be 0) | ||
|} | |} | ||
Line 947: | Line 990: | ||
| 0x4C || 0x10 || Cleared to zero for the tmp struct. | | 0x4C || 0x10 || Cleared to zero for the tmp struct. | ||
|- | |- | ||
| 0x5C || 0x4 || | | 0x5C || 0x4 || [[#ScanFilterFlag|Flag]] (masked with 0x37 for [[#Scan]], with [[#ScanPrivate]] this is masked with 0x3F) | ||
|} | |} | ||
= ScanFilterFlag = | |||
This is "nn::ldn::ScanFilterFlag". | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! | ! Value | ||
! Description | ! Description | ||
|- | |||
| 0x0 || None | |||
|- | |- | ||
| | | 0x1 || LocalCommunicationId | ||
|- | |- | ||
| | | 0x2 || SessionId | ||
|- | |- | ||
| | | 0x4 || NetworkType | ||
|- | |- | ||
| | | 0x8 || Bssid | ||
|- | |- | ||
| | | 0x10 || Ssid | ||
|- | |- | ||
| | | 0x20 || SceneId | ||
|} | |- | ||
| 0x21 || IntentId | |||
|- | |||
| 0x23 || NetworkId | |||
|- | |||
| 0x3F || All | |||
|} | |||
= NetworkConfig = | = NetworkConfig = | ||
Line 1,024: | Line 1,076: | ||
! Description | ! Description | ||
|- | |- | ||
| 0 || | | 0 || Disabled | ||
|- | |||
| 1 || Enabled | |||
|} | |||
= BluetoothAudioDeviceConnectableMode = | |||
This is "nn::ldn::BluetoothAudioDeviceConnectableMode". This is an u32 enum. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value | |||
! Description | |||
|- | |||
| 0 || Disabled | |||
|- | |- | ||
| 1 || This is | | 1 || Enabled | ||
|} | |||
= SecurityMode = | |||
This is "nn::ldn::SecurityMode". This is an u32 enum. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value | |||
! Description | |||
|- | |||
| 0 || Any | |||
|- | |||
| 1 || Product | |||
|- | |||
| 2 || Debug | |||
|- | |||
| 3 || SystemDebug | |||
|} | |} | ||
Line 1,038: | Line 1,120: | ||
! Description | ! Description | ||
|- | |- | ||
| 0x0 || 0x2 || | | 0x0 || 0x2 || [[#SecurityMode|SecurityMode]] (overwritten by [[#CreateNetwork]]/[[#CreateNetworkPrivate]] and [[#Connect]]/[[#ConnectPrivate]], the value used internally by these cmds must be 1-3) | ||
|- | |- | ||
| 0x2 || 0x2 || | | 0x2 || 0x2 || PassphraseSize (must be 0x10-0x40) | ||
|- | |- | ||
| 0x4 || 0x40 || | | 0x4 || 0x40 || Passphrase (used with key derivation) | ||
|} | |} | ||
Line 1,061: | Line 1,143: | ||
! Description | ! Description | ||
|- | |- | ||
| 0x0 || 0x10 || | | 0x0 || 0x10 || ServerRandom (used with the same key derivation as [[#SecurityConfig]]) | ||
|- | |- | ||
| 0x10 || 0x10 || | | 0x10 || 0x10 || [[#SessionId|SessionId]] | ||
|} | |} | ||
= UserConfig = | = SessionId = | ||
This is "nn::ldn::UserConfig". This is a 0x30-byte struct with 1-byte alignment. | This is "nn::ldn::SessionId". | ||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x10 || Random | |||
|} | |||
= UserConfig = | |||
This is "nn::ldn::UserConfig". This is a 0x30-byte struct with 1-byte alignment. | |||
sdknso copies the input UserConfig to a tmp struct on stack, which is then used with the cmd. | sdknso copies the input UserConfig to a tmp struct on stack, which is then used with the cmd. | ||
Line 1,077: | Line 1,171: | ||
! Description | ! Description | ||
|- | |- | ||
| 0x0 || | | 0x0 || 0x21 || UserName (NUL-terminated string for the user nickname) | ||
|- | |- | ||
| | | 0x21 || 0xF || Reserved (cleared to zero during the copy) | ||
|} | |} | ||
Line 1,095: | Line 1,189: | ||
| 0x4 || 0x6 || [[#MacAddress|MacAddress]] | | 0x4 || 0x6 || [[#MacAddress|MacAddress]] | ||
|- | |- | ||
| 0xA || 0x2 || | | 0xA || 0x2 || Reserved | ||
|} | |} | ||
Line 1,106: | Line 1,200: | ||
! Description | ! Description | ||
|- | |- | ||
| 0 || | | 0 || AlwaysAccept | ||
|- | |- | ||
| 1 || | | 1 || AlwaysReject | ||
|- | |- | ||
| 2 || | | 2 || BlackList (addresses in the [[#AddAcceptFilterEntry|list]] are not allowed) | ||
|- | |- | ||
| 3 || | | 3 || WhiteList (only addresses in the [[#AddAcceptFilterEntry|list]] are allowed) | ||
|} | |} | ||
Line 1,126: | Line 1,220: | ||
|- | |- | ||
! Offset | ! Offset | ||
! Size | ! Size | ||
! Description | ! Description | ||
|- | |- | ||
| 0x0 || 0x4 || [[#Ipv4Address]] | | 0x0 || 0x4 || [[#Ipv4Address]] | ||
|- | |- | ||
| 0x4 || 0x6 || [[#MacAddress|MacAddress]] | | 0x4 || 0x6 || [[#MacAddress|MacAddress]] | ||
|- | |- | ||
| 0xA || 0x1 || | | 0xA || 0x1 || NodeId | ||
|- | |- | ||
| 0xB || 0x1 || IsConnected | | 0xB || 0x1 || IsConnected | ||
|- | |- | ||
| 0xC || | | 0xC || 0x21 || UserName (first 0x21-bytes of [[#UserConfig]]) | ||
|- | |- | ||
| | | 0x2D || 0x1 || Reserved | ||
|- | |- | ||
| 0x2E || 0x2 || | | 0x2E || 0x2 || LocalCommunicationVersion | ||
|- | |- | ||
| 0x30 || 0x10 || Reserved | | 0x30 || 0x10 || Reserved | ||
|} | |||
= ConnectOption = | |||
This is "nn::ldn::ConnectOption". This is an u32 bitmask. | |||
There's two versions of the sdknso funcs for [[#Connect]]/[[#ConnectPrivate]]: the version where the ConnectOption isn't user-specified uses a default value of 0x1 for it, with the same ShowError code without the bit0 check. | |||
When bit0 here is set after using the above cmds, the sdknso funcs will use [[Error_Applet|ShowError]] with the returned Result if: (rc & 0x3FE1FF) == 0xE0CB. | |||
This must be <=0x1, besides this validation ConnectOption is ignored by [[#Connect]]/[[#ConnectPrivate]]. | |||
= DisconnectReason = | |||
This is "nn::ldn::DisconnectReason". | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value | |||
! Description | |||
|- | |||
| -1 || Unknown | |||
|- | |||
| 0 || None | |||
|- | |||
| 1 || DisconnectedByUser | |||
|- | |||
| 2 || DisconnectedBySystem | |||
|- | |||
| 3 || DestroyedByUser | |||
|- | |||
| 4 || DestroyedBySystem | |||
|- | |||
| 5 || Rejected | |||
|- | |||
| 6 || SignalLost | |||
|} | |} | ||
= OperationMode = | = OperationMode = | ||
Line 1,167: | Line 1,286: | ||
! Description | ! Description | ||
|- | |- | ||
| 0 || | | 0 || Stable | ||
|- | |- | ||
| 1 || | | 1 || HighSpeed | ||
|} | |} | ||
Line 1,273: | Line 1,392: | ||
** All string characters which were already written are summed same way as above. Then: <code>return character_lookup_table[sum % 0x2B];</code> (If the length passed to this function is 0, this will instead just return character_lookup_table[0]) | ** All string characters which were already written are summed same way as above. Then: <code>return character_lookup_table[sum % 0x2B];</code> (If the length passed to this function is 0, this will instead just return character_lookup_table[0]) | ||
*** character_lookup_table contains 0x2B entries: [V-A][k-a][5-0][Z-W]. | *** character_lookup_table contains 0x2B entries: [V-A][k-a][5-0][Z-W]. | ||
loaded_flags are first loaded from elsewhere, then masked with the above flags when available. loaded_flags are used when +0x8A is 0. global_flags are loaded from global data. These flags are only used with [[#CreateGroup]]/[[#Join]]. Flags (note that the following was updated with [11.0.0+], and differs from below): | loaded_flags are first loaded from elsewhere, then masked with the above flags when available. loaded_flags are used when +0x8A is 0. global_flags are loaded from global data. These flags are only used with [[#CreateGroup]]/[[#Join]]. Flags (note that the following was updated with [11.0.0+], and differs from below): | ||
Line 1,556: | Line 1,673: | ||
The beacon is identical to ldn, except for the following (besides SSID length difference and the lp2p-only Nintendo tags): | The beacon is identical to ldn, except for the following (besides SSID length difference and the lp2p-only Nintendo tags): | ||
* "Tag: HT Capabilities (802.11n D1.10)": "HT Short GI for 20MHz" is set to "Not supported", for ldn it's "Supported". | * "Tag: HT Capabilities (802.11n D1.10)": "HT Short GI for 20MHz" is set to "Not supported", for ldn it's "Supported". | ||
* "Tag: Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element" "Ac Parameters ACI 0": "CW Min: 15" for lp2p, "CW Min: 63" for ldn. | * "Tag: Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element" "Ac Parameters ACI 0": "CW Min: 15" for lp2p, "CW Min: 63" for ldn. |