Changes

1,807 bytes added ,  18:54, 8 October 2024
no edit summary
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]]
|}
  −
  −
=== GetState ===
  −
No input, returns an output u32.
  −
  −
sdknso implements this by <code>return</code>ing the u32, with 0 being returned on error / when service isn't initialized.
  −
  −
{| class="wikitable" border="1"
  −
|-
  −
!  Value
  −
!  Description
   
|-
 
|-
| 0 || None
+
| 404 || [19.0.0+]
 
|-
 
|-
| 1 || Initialized
+
| 500 || [18.0.0+] EnableActionFrame
 
|-
 
|-
| 2 || AccessPointOpened
+
| 501 || [18.0.0+] DisableActionFrame
 
|-
 
|-
| 3 || AccessPointCreated
+
| 502 || [18.0.0+] SendActionFrame
 
|-
 
|-
| 4 || StationOpened
+
| 503 || [18.0.0+] RecvActionFrame
 
|-
 
|-
| 5 || StationConnected
+
| 505 || [18.0.0+] SetHomeChannel
 
|-
 
|-
| 6 || Error
+
| 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 s16.
+
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.
   −
{| class="wikitable" border="1"
+
=== GetSecurityParameter ===
|-
+
No input, returns an output [[#SecurityParameter]].
!  Value
  −
!  Description
  −
|-
  −
| -1 || See above.
  −
|-
  −
| 0 || None
  −
|-
  −
| 1 || User
  −
|-
  −
| 2 || SystemRequest
  −
|-
  −
| 3 || DestroyedByAdmin
  −
|-
  −
| 4 || DestroyedBySystemRequest
  −
|-
  −
| 5 || Admin
  −
|-
  −
| 6 || SignalLost
  −
|}
  −
 
  −
=== 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::INetworkServiceCreator".
+
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 [[#INetworkService]].
+
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 [[#INetworkServiceMonitor]].
+
Takes a PID-descriptor and a reserved input u64. Returns an output [[#ISfServiceMonitor]].
   −
== INetworkService ==
+
== ISfService ==
This is "nn::lp2p::detail::INetworkService".
+
This is "nn::lp2p::detail::ISfService".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 703: Line 722:  
No input/output.
 
No input/output.
   −
== INetworkServiceMonitor ==
+
== ISfServiceMonitor ==
This is "nn::lp2p::detail::INetworkServiceMonitor".
+
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::IMonitorServiceCreator".
+
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 [[#IMonitorService]].
+
Takes a PID-descriptor, a reserved input u64 and an input u64. Returns an [[#ISfMonitorService]].
   −
== IMonitorService ==
+
== ISfMonitorService ==
This is "nn::lp2p::detail::IMonitorService".
+
This is "nn::lp2p::monitor::detail::ISfMonitorService".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 830: Line 849:  
Returns 0.
 
Returns 0.
   −
= Ipv4Address =
+
= State =
This is "nn::ldn::Ipv4Address". This is a 0x4-byte struct with 4-byte alignment.
+
This is "nn::ldn::State".
 
  −
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.
+
{| 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 || Flags. Masked with 0x37 for [[#Scan]], with [[#ScanPrivate]] this is masked with 0x3F.
+
| 0x5C || 0x4 || [[#ScanFilterFlag|Flag]] (masked with 0x37 for [[#Scan]], with [[#ScanPrivate]] this is masked with 0x3F)
 
|}
 
|}
   −
Flags:
+
= ScanFilterFlag =
 +
This is "nn::ldn::ScanFilterFlag".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Bit
+
! Value
! Description
+
! Description
 +
|-
 +
| 0x0 || None
 
|-
 
|-
| 0 || When set, enables using ScanFilter+0.
+
| 0x1 || LocalCommunicationId
 
|-
 
|-
| 1 || When set, enables using ScanFilter+0x10.
+
| 0x2 || SessionId
 
|-
 
|-
| 2 || When set, enables using ScanFilter+0x20.
+
| 0x4 || NetworkType
 
|-
 
|-
| 3 || When set, enables using the ScanFilter [[#MacAddress|MacAddress]].
+
| 0x8 || Bssid
 
|-
 
|-
| 4 || When set, enables using the ScanFilter [[#Ssid]].
+
| 0x10 || Ssid
 
|-
 
|-
| 5 || When set, enables using ScanFilter+0xA.
+
| 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 the default.
+
| 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 || Type, a default of value 1 can be used here. Overwritten by [[#CreateNetwork]]/[[#CreateNetworkPrivate]] and [[#Connect]]/[[#ConnectPrivate]]. The value used internally by these cmds must be 1-3.
+
| 0x0 || 0x2 || [[#SecurityMode|SecurityMode]] (overwritten by [[#CreateNetwork]]/[[#CreateNetworkPrivate]] and [[#Connect]]/[[#ConnectPrivate]], the value used internally by these cmds must be 1-3)
 
|-
 
|-
| 0x2 || 0x2 || Data size. Must be 0x10-0x40.
+
| 0x2 || 0x2 || PassphraseSize (must be 0x10-0x40)
 
|-
 
|-
| 0x4 || 0x40 || Data, used with key derivation.
+
| 0x4 || 0x40 || Passphrase (used with key derivation)
 
|}
 
|}
   Line 1,061: Line 1,143:  
! Description
 
! Description
 
|-
 
|-
| 0x0 || 0x10 || Data, used with the same key derivation as [[#SecurityConfig]].
+
| 0x0 || 0x10 || ServerRandom (used with the same key derivation as [[#SecurityConfig]])
 
|-
 
|-
| 0x10 || 0x10 || NetworkId, see [[#NetworkInfo]].
+
| 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 || 0x20 || NUL-terminated string for the user nickname.
+
| 0x0 || 0x21 || UserName (NUL-terminated string for the user nickname)
 
|-
 
|-
| 0x20 || 0x10 || Cleared to zero during the copy.
+
| 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 || Padding
+
| 0xA || 0x2 || Reserved
 
|}
 
|}
   Line 1,106: Line 1,200:  
!  Description
 
!  Description
 
|-
 
|-
| 0 || Allow all.
+
| 0 || AlwaysAccept
 
|-
 
|-
| 1 || Deny all.
+
| 1 || AlwaysReject
 
|-
 
|-
| 2 || Blacklist, addresses in the [[#AddAcceptFilterEntry|list]] are not allowed.
+
| 2 || BlackList (addresses in the [[#AddAcceptFilterEntry|list]] are not allowed)
 
|-
 
|-
| 3 || Whitelist, only addresses in the [[#AddAcceptFilterEntry|list]] are allowed.
+
| 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 || s8 ID / index
+
| 0xA || 0x1 || NodeId
|-
+
|-
| 0xB || 0x1 || IsConnected
+
| 0xB || 0x1 || IsConnected
|-
+
|-
| 0xC || 0x20 || First 0x20-bytes of [[#UserConfig]].
+
| 0xC || 0x21 || UserName (first 0x21-bytes of [[#UserConfig]])
|-
+
|-
| 0x2C || 0x2 || Reserved
+
| 0x2D || 0x1 || Reserved
|-
+
|-
| 0x2E || 0x2 || s16 LocalCommunicationVersion
+
| 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
 
|}
 
|}
  −
= 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]].
      
= OperationMode =
 
= OperationMode =
Line 1,167: Line 1,286:  
!  Description
 
!  Description
 
|-
 
|-
| 0 || This is the default.
+
| 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: Traffic Indication Map (TIM)": "DTIM count" for lp2p is 1, with ldn it's 0.
   
* "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.