LDN services: Difference between revisions
(One intermediate revision by the same user not shown) | |||
Line 402: | Line 402: | ||
Takes an input PID, a s32 version, and an u64 pid_placeholder. | Takes an input PID, a s32 version, and an u64 pid_placeholder. | ||
The | The priority is determined by whether the interface is User/System: System = 0x38, User = 0x5A. | ||
It then calls the init func, with the cmd input params and the above priority, returning the Result on failure. | |||
On newer sysvers this then adds an entry for the state array used by [[#RegisterClient|RegisterClient]]. | |||
Lastly the input PID and version are written into state, then this returns. | |||
[[# | The init func does the following: | ||
* The PID must be non-zero, and the version must not be negative. The priority must be 0x5A or 0x38. | |||
* An error is returned if state fields are invalid. | |||
* The input PID and version are written into state (a state field is also set to interface == User). | |||
* Lastly, a vfunc is called with the input priority, returning the Result from that. | |||
The vfunc does the following: | |||
* On newer sysvers, this uses [[Shared_Database_services|pl:s]] RequestApplicationFunctionAuthorizationByProcessId with the input PID and [[Shared_Database_services|ApplicationFunctionAuthorizationId]] = 2 (SecureLdnLocalCommunication), returning the Result on failure. | |||
* Then a message is sent to a msg-queue with the input priority. | |||
The handler for the above message does the following: | |||
* When state is already initialized, runs handling for that. An error is also thrown if the input priority is larger than a state field. | |||
* Initializes state, etc. | |||
* Various [[Network_Interface_services|nifm]] funcs are eventually used. The input priority is used to determine the value for [[Network_Interface_services#CreateRequest|nn::nifm::RequestParameters]]: value 0x4 or value 0x8 is used, depending on priority > 0x59. | |||
** Newer versions also handle ldn lan_emulation [[System_Settings|sys-settings]] here. For the above value, when lan_emulation is enabled it uses value 0x17, with 0x18 additionally used for priority <= 0x59. | |||
* The rest is state init, including setting [[#State|State]] to value 1. Then 0 is returned. | |||
On old sysvers the cmd impl for User/System are identical, except different params are used for the funcs called internally. With newer sysvers the cmd impl is now identical. | |||
Version values passed by official sw: | Version values passed by official sw: | ||
Line 428: | Line 445: | ||
=== InitializeWithPriority === | === InitializeWithPriority === | ||
Takes an input PID, a s32 version, a s32, and an u64 pid_placeholder. | Takes an input PID, a s32 version, a s32 priority, and an u64 pid_placeholder. | ||
This is similar to [[#InitializeWithVersion|InitializeWithVersion]]. The input priority is passed directly to the init func which is called here, instead of determining it from whether the interface is User/System. | |||
Official sw passes input value 0x38 for the priority as the default, when the user doesn't specify the priority. | |||
=== EnableActionFrame === | === EnableActionFrame === |