NIM services: Difference between revisions

No edit summary
 
(10 intermediate revisions by the same user not shown)
Line 288: Line 288:
| 141 || [15.0.0+] IsNetworkConnectionEnabledToUseApplicationCore
| 141 || [15.0.0+] IsNetworkConnectionEnabledToUseApplicationCore
|-
|-
| 142 || [17.0.0+] RequestCheckSafeSystemVersion
| 142 || [17.0.0+] [[#RequestCheckSafeSystemVersion]]
|-
|-
| 143 || [17.0.0+] [[#RequestApplicationIcon]]
| 143 || [17.0.0+] [[#RequestApplicationIcon]]
Line 450: Line 450:


== CreateSystemUpdateTask ==
== CreateSystemUpdateTask ==
Takes an input u32 firmware_variation, an u32 '''unk''', a [[NCM_services#ContentMetaKey|ContentMetaKey]], returns an output [[#SystemUpdateTaskId]].
Takes an input u32 firmware_variation, a [[NCM_services#ContentMetaKey|ContentMetaKey]], returns an output [[#SystemUpdateTaskId]].
 
[8.0.0+] Takes an input u32 firmware_variation, an u32 '''unk''', a [[NCM_services#ContentMetaKey|ContentMetaKey]], returns an output [[#SystemUpdateTaskId]].


Official sw sets '''unk''' to: <code>unk = inflag & 1 ? 0xC : 0x4</code>.
Official sw sets '''unk''' to: <code>unk = inflag & 1 ? 0xC : 0x4</code>.
Line 473: Line 475:
== GetNetworkInstallTaskInfo ==
== GetNetworkInstallTaskInfo ==
Takes an input [[#NetworkInstallTaskId]], returns an output [[#NetworkInstallTaskInfo]].
Takes an input [[#NetworkInstallTaskId]], returns an output [[#NetworkInstallTaskInfo]].
[10.0.0+] This now returns a total of 0x48-bytes of output instead of 0x40-bytes.


== GetDownloadedSystemDataPath ==
== GetDownloadedSystemDataPath ==
Line 511: Line 511:


This is the SendApplication version of [[#CreateLocalCommunicationSendSystemUpdateTask]].
This is the SendApplication version of [[#CreateLocalCommunicationSendSystemUpdateTask]].
The struct for the input array contains: {[[NCM_services|ContentMetaKey]], u8 [[NCM_services|StorageId]], the rest is padding}.


== RequestLocalCommunicationSendApplicationTaskRun ==
== RequestLocalCommunicationSendApplicationTaskRun ==
Line 533: Line 535:


== CreateLocalCommunicationReceiveSystemUpdateTask ==
== CreateLocalCommunicationReceiveSystemUpdateTask ==
Takes an input u16 port, an u32 Ipv4Address, an u32 firmware_variation, an u32 '''unk''', a [[NCM_services#ContentMetaKey|ContentMetaKey]], returns an output [[#LocalCommunicationReceiveSystemUpdateTaskId]].
Takes an input u16 port, an u32 Ipv4Address, an u32 firmware_variation, a [[NCM_services#ContentMetaKey|ContentMetaKey]], returns an output [[#LocalCommunicationReceiveSystemUpdateTaskId]].


Official sw sets '''unk''' to: <code>unk = stateflag==0 ? 0x4 : 0xC</code>. The port/Ipv4Address params originate from the [[NS_Services#RequestReceiveSystemUpdate|RequestReceiveSystemUpdate]] params.
[8.0.0+] Takes an input u16 port, an u32 Ipv4Address, an u32 firmware_variation, an u32 '''unk''', a [[NCM_services#ContentMetaKey|ContentMetaKey]], returns an output [[#LocalCommunicationReceiveSystemUpdateTaskId]].
 
The port/Ipv4Address params originate from the [[NS_Services#RequestReceiveSystemUpdate|RequestReceiveSystemUpdate]] params, see [[NS_Services#RequestReceiveSystemUpdate|RequestReceiveSystemUpdate]] regarding the rest of the input params.


This is the ReceiveSystemUpdate version of [[#CreateSystemUpdateTask]].
This is the ReceiveSystemUpdate version of [[#CreateSystemUpdateTask]].
Line 578: Line 582:


== CreateLocalCommunicationSendSystemUpdateTask ==
== CreateLocalCommunicationSendSystemUpdateTask ==
Takes an input u16 port, an u32 Ipv4Address, an u32 firmware_variation, and a [[NCM_services#ContentMetaKey|ContentMetaKey]], returns an output [[#LocalCommunicationSendSystemUpdateTaskId]].
Takes an input u16 port, an u32 Ipv4Address, and a [[NCM_services#ContentMetaKey|ContentMetaKey]], returns an output [[#LocalCommunicationSendSystemUpdateTaskId]].


[8.0.0+] This now takes an additional 0x8-bytes of input.
[8.0.0+] Takes an input u16 port, an u32 Ipv4Address, an u32 firmware_variation, and a [[NCM_services#ContentMetaKey|ContentMetaKey]], returns an output [[#LocalCommunicationSendSystemUpdateTaskId]].


The port/Ipv4Address params originate from the [[NS_Services#RequestSendSystemUpdate|RequestSendSystemUpdate]] params.
The port/Ipv4Address params originate from the [[NS_Services#RequestSendSystemUpdate|RequestSendSystemUpdate]] params.
Line 622: Line 626:
== GetApplyDeltaTaskAllAppliedContentMeta ==
== GetApplyDeltaTaskAllAppliedContentMeta ==
[20.0.0+] Now takes a 0x18-bytes type-0x6 output buffer and returns 4-bytes of output instead of 0x18-bytes.
[20.0.0+] Now takes a 0x18-bytes type-0x6 output buffer and returns 4-bytes of output instead of 0x18-bytes.
== RequestCheckSafeSystemVersion ==
No input, returns an output Event and an [[#IAsyncResult]].
The async task does a network request with [[Network|bvc]].


== RequestApplicationIcon ==
== RequestApplicationIcon ==
Line 869: Line 878:


[3.0.0+] This is a 0x40-byte struct.
[3.0.0+] This is a 0x40-byte struct.
[10.0.0+] This is a 0x48-byte struct.
[14.0.0+] This is a 0x58-byte struct.
[16.0.0+] This is a 0x60-byte struct.


= ApplyDeltaTaskId =
= ApplyDeltaTaskId =
Line 889: Line 904:
= SendSystemUpdateTaskInfo =
= SendSystemUpdateTaskInfo =
This is "nn::nim::LocalCommunicationSendSystemUpdateTaskInfo". This is a 0x20-byte struct.
This is "nn::nim::LocalCommunicationSendSystemUpdateTaskInfo". This is a 0x20-byte struct.
[[NS_services|ns]] swaps the two u64s when copying from this struct into SystemUpdateProgress.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 933: Line 950:
= LocalCommunicationSendApplicationTaskInfo =
= LocalCommunicationSendApplicationTaskInfo =
This is "nn::nim::LocalCommunicationSendApplicationTaskInfo". This is a 0x20-byte struct.
This is "nn::nim::LocalCommunicationSendApplicationTaskInfo". This is a 0x20-byte struct.
[[NS_services|ns]] swaps the two u64s when copying from this struct into SendApplicationProgress.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,032: Line 1,051:


The Receive async [[#RequestLocalCommunicationReceiveSystemUpdateTaskRun|thread]] does the following:
The Receive async [[#RequestLocalCommunicationReceiveSystemUpdateTaskRun|thread]] does the following:
* Sets the <code>nn::fs::PriorityRaw</code> using a value loaded from state.
* [5.0.0+] Sets the <code>nn::fs::PriorityRaw</code> using a value loaded from state.
* Calls a func, and writes the returned Result into state.
* Calls a func, and writes the returned Result into state.
* Signals the async Event and returns.
* Signals the async Event and returns.
Line 1,041: Line 1,060:
* This is identical to the Receive thread except the called func is different.
* This is identical to the Receive thread except the called func is different.
** That func does:
** That func does:
** Gets [[System_Settings|system-setting]] <code>nim.errorsimulate!error_localcommunication_result</code>, returning that as an error if set + non-zero.
** [5.0.0+] Gets [[System_Settings|system-setting]] <code>nim.errorsimulate!error_localcommunication_result</code>, returning that as an error if set + non-zero.
** Does socket setup:
** Does socket setup:
** Calls a func.
** Calls a func.
Line 1,060: Line 1,079:
* The following is done after the loop:
* The following is done after the loop:
* u64 tmpval=1; setsockopt(sockfd, SOL_SOCKET, SO_VENDOR + 0x1, &tmpval, sizeof(tmpval)); {handle error on fail}
* u64 tmpval=1; setsockopt(sockfd, SOL_SOCKET, SO_VENDOR + 0x1, &tmpval, sizeof(tmpval)); {handle error on fail}
* Uses [[Network_Interface_services|nifm]] GetInternetConnectionStatus, returning an error if this is successful. Hence, the output from this is ignored.
* [4.0.0-16.1.0] Uses [[Network_Interface_services|nifm]] GetInternetConnectionStatus, returning an error when the Result is 0xD46E ([6.0.0+] error is thrown when successful). Hence, the output from this is ignored.
* Uses fcntl with F_GETFL/F_SETFL to clear O_NONBLOCK with sockfd, handling error on fail.
* Uses fcntl with F_GETFL/F_SETFL to clear O_NONBLOCK with sockfd, handling error on fail.
* u32 tmpval2=0x4000;
* [4.0.0-10.2.0] u32 tmpval2=0x4000; u32 tmpval3=0x20000;
* u32 tmpval3=0x20000;
* [4.0.0-10.2.0] setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &tmpval2, sizeof(tmpval2)); {error is ignored}
* setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &tmpval2, sizeof(tmpval2)); {error is ignored}
* [4.0.0-10.2.0] setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &tmpval3, sizeof(tmpval3)); {error is ignored}
* setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &tmpval3, sizeof(tmpval3)); {error is ignored}
* Writes sockfd to the output state sockfd and returns 0.
* Writes sockfd to the output state sockfd and returns 0.
** The func used with the above loop does the following:
** The func used with the above loop does the following:
Line 1,093: Line 1,111:


With SystemUpdate the server only uses StorageId=BuiltInSystem.
With SystemUpdate the server only uses StorageId=BuiltInSystem.
With SystemUpdate, when the server handles message 0x1 prior to loading the PackagedContentInfo, it first loads the [[CNMT]] ContentMetaInfo array with the ContentMetaKey from [[#CreateLocalCommunicationSendSystemUpdateTask|CreateLocalCommunicationSendSystemUpdateTask]]. The input message ContentMetaKey [[NCM_services|ContentInstallType]] must be 0x0 (Full), otherwise it skips the following loop. It then loops through the ContentMetaInfo array comparing against the input message ContentMetaKey, for verifying that one of the entries match. After the loop if a valid entry wasn't found, the input message ContentMetaKey must match the ContentMetaKey from [[#CreateLocalCommunicationSendSystemUpdateTask|CreateLocalCommunicationSendSystemUpdateTask]], otherwise an error is thrown. It then loads the PackagedContentInfo.
With Application, when the server handles message 0x1 prior to loading the PackagedContentInfo, it first loops through the input array from [[#CreateLocalCommunicationSendApplicationTask|CreateLocalCommunicationSendApplicationTask]], throwing an error if the input ContentMetaKey doesn't match an entry from here. It then loads the PackagedContentInfo with the StorageId from the located entry.
With Application, when the server handles message 0x2 for determining what StorageId to use, it loops through the input array from [[#CreateLocalCommunicationSendApplicationTask|CreateLocalCommunicationSendApplicationTask]]. [[NCM_services|ncm]] IContentMetaDatabase HasContent is used with the array entry ContentMetaKey and the message input [[NCM_services#ContentId|ContentId]]. When cmd output indicates the content is present, the entry StorageId is written to output. Otherwise an error is thrown if none found with all array entries.


Messages:
Messages:
Line 1,104: Line 1,128:
| 0x1 || [[NCM_services#ContentMetaKey|ContentMetaKey]] || [[CNMT#Content_Records|PackagedContentInfo]] || Gets the PackagedContentInfo with type==Meta for the specified ContentMetaKey. The SystemUpdate client uses the ContentMetaKey from [[#CreateLocalCommunicationReceiveSystemUpdateTask]].
| 0x1 || [[NCM_services#ContentMetaKey|ContentMetaKey]] || [[CNMT#Content_Records|PackagedContentInfo]] || Gets the PackagedContentInfo with type==Meta for the specified ContentMetaKey. The SystemUpdate client uses the ContentMetaKey from [[#CreateLocalCommunicationReceiveSystemUpdateTask]].
|-
|-
| 0x2 || 0x18-bytes: [[NCM_services#ContentId|ContentId]], u8 flag, u8 pad[7]. When flag is 0, during the transfer [[#LocalCommunicationSendSystemUpdateTaskInfo]] [[NS_Services#SystemUpdateProgress|SystemUpdateProgress]] current_size is increased using the size of the current chunk. Once the transfer is finished, the end result is that it would be increased by the total content-size. The only time the nim client sets this flag to 1 with SystemUpdate is with the SystemUpdate Meta content. [?+] The flag is now unused. || Size from [[NCM_services#GetSizeFromContentId|GetSizeFromContentId]] with data from [[NCM_services#ReadContentIdFile|ReadContentIdFile]]. || Gets the entire content data for the specified ContentId. The client uses each received chunk of data during the transfer with [[NCM_services|WritePlaceHolder]].
| 0x2 || 0x18-bytes: [[NCM_services#ContentId|ContentId]], u8 flag, u8 pad[7]. When flag is 0, during the transfer [[#LocalCommunicationSendSystemUpdateTaskInfo]] [[NS_Services#SystemUpdateProgress|SystemUpdateProgress]] current_size is increased using the size of the current chunk. Once the transfer is finished, the end result is that it would be increased by the total content-size. The only time the nim client sets this flag to 1 with SystemUpdate is with the SystemUpdate Meta content. || Size from [[NCM_services#GetSizeFromContentId|GetSizeFromContentId]] with data from [[NCM_services#ReadContentIdFile|ReadContentIdFile]]. || Gets the entire content data for the specified ContentId. The client uses each received chunk of data during the transfer with [[NCM_services|WritePlaceHolder]].
|-
|-
| 0x3 || 0x10-byte input for [[ETicket_services|es]] GetCommonTicketAndCertificateSize/GetCommonTicketAndCertificateData ([?+] also GetTicketInfo). || 0x8-bytes: two size u32s. Then two blocks of data with the sizes specified by the u32s. The server loads the sizes and data from [[ETicket_services|es]] GetCommonTicketAndCertificateSize/GetCommonTicketAndCertificateData. || The two blocks of data are used as the buffers for [[ETicket_services|es]] ImportTicket by the client. This is used for transferring the specified Application Patch CommonTicket.
| 0x3 || 0x10-byte input for [[ETicket_services|es]] GetCommonTicketAndCertificateSize/GetCommonTicketAndCertificateData ([10.1.0+] also GetTicketInfo). || 0x8-bytes: two size u32s. Then two blocks of data with the sizes specified by the u32s. The server loads the sizes and data from [[ETicket_services|es]] GetCommonTicketAndCertificateSize/GetCommonTicketAndCertificateData. || The two blocks of data are used as the buffers for [[ETicket_services|es]] ImportTicket by the client. This is used for transferring the specified Application Patch CommonTicket.
[?+] Prior to using GetCommonTicketAndCertificate*, additional functionality with [[ETicket_services|es]] GetTicketInfo was added. This loops through the output array to locate an entry with u64 +0 == 0x0, throwing an error if not found. Then in the located entry, u16 +0x32 bit4 must be clear otherwise an error is thrown.
[10.1.0+] Prior to using GetCommonTicketAndCertificate*, additional functionality with [[ETicket_services|es]] GetTicketInfo was added. This loops through the output array to locate an entry with u64 +0 == 0x0, throwing an error if not found. Then in the located entry, u16 +0x32 bit4 must be clear otherwise an error is thrown.
|-
|-
| 0x4 || s64 total_size || 0x0 || The input data is copied into the server state, for [[#LocalCommunicationSendSystemUpdateTaskInfo]] [[NS_Services#SystemUpdateProgress|SystemUpdateProgress]] total_size.
| 0x4 || s64 total_size || 0x0 || The input data is copied into the server state, for [[#LocalCommunicationSendSystemUpdateTaskInfo]] [[NS_Services#SystemUpdateProgress|SystemUpdateProgress]] total_size.