NIM services: Difference between revisions
No edit summary |
|||
(10 intermediate revisions by 2 users not shown) | |||
Line 253: | Line 253: | ||
== GetApplyDeltaTaskInfo == | == GetApplyDeltaTaskInfo == | ||
Takes an input [[#ApplyDeltaTask]], returns an output [[#ApplyDeltaTaskInfo]]. | Takes an input [[#ApplyDeltaTask]], returns an output [[#ApplyDeltaTaskInfo]]. | ||
== Cmd53 == | |||
Takes an input [[NCM_services#StorageId|StorageId]], an u16 port, an u32 Ipv4Address, an u32 '''unk''', an u64 <code>nn::ncm::ApplicationId</code>, a type-0x5 input buffer containing an array of [[NCM_services#ContentMetaKey|ContentMetaKey]], returns an output [[#ReceiveApplicationTask]]. | |||
This is the ReceiveApplication version of [[#Cmd69]]. | |||
The wrapper used by official sw passes hard-coded value 0x2 for '''unk'''. | |||
== Cmd56 == | |||
Takes an input [[#ReceiveApplicationTask]], returns an output Event and an [[#IAsyncResult]]. | |||
This is the ReceiveApplication version of [[#Cmd72]]. | |||
== Cmd57 == | |||
Takes an input [[#ReceiveApplicationTask]], returns an output [[#ReceiveApplicationTaskInfo]]. | |||
This is the ReceiveApplication version of [[#GetSystemUpdateTaskInfo]]. | |||
== Cmd60 == | |||
Takes an input u16 port, an u32 Ipv4Address, an u64 <code>nn::ncm::ApplicationId</code>, a type-0x5 input buffer containing an array of {unknown}, returns an output [[#SendApplicationTask]]. | |||
This is the SendApplication version of [[#Cmd69]]. | |||
== Cmd61 == | |||
Takes an input [[#SendApplicationTask]], returns an output Event and an [[#IAsyncResult]]. | |||
This is the SendApplicationTask version of [[#Cmd72]]. | |||
== Cmd63 == | |||
Takes an input [[#SendApplicationTask]], returns an output [[#SendApplicationTaskInfo]]. | |||
This is the SendApplication version of [[#GetSystemUpdateTaskInfo]]. | |||
== Cmd67 == | |||
Takes a type-0x6 output buffer containing an array of [[#ReceiveApplicationTask]] and an input u64 <code>nn::ncm::ApplicationId</code>. Returns a s32 for total output entries. | |||
This is the ReceiveApplication version of [[#Cmd71]]. | |||
== Cmd68 == | |||
Takes a type-0x6 output buffer containing an array of [[#SendApplicationTask]] and an input u64 <code>nn::ncm::ApplicationId</code>. Returns a s32 for total output entries. | |||
This is the SendApplication version of [[#Cmd71]]. | |||
== Cmd69 == | == Cmd69 == | ||
Line 259: | Line 301: | ||
Official sw sets '''unk''' to: <code>unk = stateflag==0 ? 0x4 : 0xC</code>. The port/Ipv4Address params originate from the [[NS_Services#RequestReceiveSystemUpdate|RequestReceiveSystemUpdate]] params. | Official sw sets '''unk''' to: <code>unk = stateflag==0 ? 0x4 : 0xC</code>. The port/Ipv4Address params originate from the [[NS_Services#RequestReceiveSystemUpdate|RequestReceiveSystemUpdate]] params. | ||
This is the | This is the ReceiveSystemUpdate version of [[#CreateSystemUpdateTask]]. | ||
The ContentMetaKey is for the SystemUpdate Meta. | The ContentMetaKey is for the SystemUpdate Meta. | ||
Line 285: | Line 327: | ||
Takes a type-0x6 output buffer, for an array of [[#ReceiveSystemUpdateTask]]. Returns a s32 for total output entries. | Takes a type-0x6 output buffer, for an array of [[#ReceiveSystemUpdateTask]]. Returns a s32 for total output entries. | ||
This is the | This is the ReceiveSystemUpdate version of [[#ListSystemUpdateTask]]. | ||
== Cmd72 == | == Cmd72 == | ||
Takes an input [[#ReceiveSystemUpdateTask]], returns an output Event and an [[#IAsyncResult]]. | Takes an input [[#ReceiveSystemUpdateTask]], returns an output Event and an [[#IAsyncResult]]. | ||
This is the | This is the ReceiveSystemUpdate version of RequestSystemUpdateTaskRun. | ||
This creates the [[#IAsyncResult]] object + the async [[#Contents_Delivery|thread]] which handles the [[#IAsyncResult]] operation, which uses the state previously setup by [[#Cmd69]]. This throws an error if the object was already created. | This creates the [[#IAsyncResult]] object + the async [[#Contents_Delivery|thread]] which handles the [[#IAsyncResult]] operation, which uses the state previously setup by [[#Cmd69]]. This throws an error if the object was already created. | ||
Line 297: | Line 339: | ||
Takes an input [[#ReceiveSystemUpdateTask]], returns an output [[#ReceiveSystemUpdateTaskInfo]]. | Takes an input [[#ReceiveSystemUpdateTask]], returns an output [[#ReceiveSystemUpdateTaskInfo]]. | ||
This is the | This is the ReceiveSystemUpdate version of [[#GetSystemUpdateTaskInfo]]. | ||
== Cmd76 == | == Cmd76 == | ||
Line 336: | Line 378: | ||
== Cmd81 == | == Cmd81 == | ||
Takes a type-0x6 output buffer, for an array of [[# | Takes a type-0x6 output buffer, for an array of [[#SendSystemUpdateTask]]. Returns a s32 for total output entries. | ||
This is the Send version of [[#Cmd71]]. | This is the Send version of [[#Cmd71]]. | ||
Line 364: | Line 406: | ||
| 0x24 || 0x4 || ? | | 0x24 || 0x4 || ? | ||
|- | |- | ||
| 0x28 || 0x8 || | | 0x28 || 0x8 || BytesPerSecond | ||
|- | |- | ||
| 0x30 || 0x8 || | | 0x30 || 0x8 || BytesPerMB | ||
|- | |- | ||
| 0x38 || 0x8 || ? | | 0x38 || 0x8 || ? | ||
Line 414: | Line 456: | ||
|- | |- | ||
| 0x19 || 0x7 || Padding | | 0x19 || 0x7 || Padding | ||
|} | |||
This is a 0x20-byte struct. | |||
== ReceiveApplicationTask == | |||
This is a 0x10-byte struct. | |||
== ReceiveApplicationTaskInfo == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x1 || Status | |||
|- | |||
| 0x1 || 0x7 || ? | |||
|- | |||
| 0x8 || 0x10 || [[NS_Services#ReceiveApplicationProgress|ReceiveApplicationProgress]] | |||
|- | |||
| 0x18 || 0x20 || Unknown | |||
|} | |||
This is a 0x38-byte struct. | |||
== SendApplicationTask == | |||
This is a 0x10-byte struct. | |||
== SendApplicationTaskInfo == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Offset | |||
! Size | |||
! Description | |||
|- | |||
| 0x0 || 0x1 || Status | |||
|- | |||
| 0x1 || 0x7 || ? | |||
|- | |||
| 0x8 || 0x10 || [[NS_Services#SendApplicationProgress|SendApplicationProgress]] | |||
|- | |||
| 0x18 || 0x8 || Unknown | |||
|} | |} | ||
Line 660: | Line 744: | ||
= Contents Delivery = | = Contents Delivery = | ||
Content can be transferred with a custom protocol over the network. This is intended for use with local [[LDN_services|ldn]] networks, however the used IP addresses can be | Content can be transferred with a custom protocol over the network. This is intended for use with local [[LDN_services|ldn]] networks, however the used IP addresses can be arbitrary. This can be used for SystemUpdates via the above Send/Receive commands (which are then used via [[NS_Services#ns:su|ns:su]]). Application Patch content can also be transferred with this. | ||
See [[#Cmd69]]/[[#Cmd76]] for the socket setup during Receive/Send task creation. Receive system = client, while Send system = server. | See [[#Cmd69]]/[[#Cmd76]] for the socket setup during Receive/Send task creation. Receive system = client, while Send system = server. | ||
Line 671: | Line 755: | ||
** This handles installation, with messages being used via vtable funcptrs. | ** This handles installation, with messages being used via vtable funcptrs. | ||
The Send async [[#Cmd77|thread]] does the following: | The Send async [[#Cmd77|thread]] does the following (the SendApplication [[#Cmd61|thread]] is identical except it uses different previously setup state): | ||
* 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: | ||
Line 682: | Line 766: | ||
*** This repeatedly receives requests, processes them, and sends the replies. This loop (and func) will only exit when an error occurs, or when request ID 0x0 is used (the latter causes the func to return 0). | *** This repeatedly receives requests, processes them, and sends the replies. This loop (and func) will only exit when an error occurs, or when request ID 0x0 is used (the latter causes the func to return 0). | ||
*** This handles the requests as required by the ID, no particular order is required by the server. | *** This handles the requests as required by the ID, no particular order is required by the server. | ||
*** All IDs in the below table are implemented by the server, | *** All IDs in the below table are implemented by the server, for both SystemUpdate and Application. | ||
*** An error is thrown if the ID is unrecognized | *** An error is thrown if the ID is unrecognized. | ||
The above socket setup for the Send async thread does the following: | The above socket setup for the Send async thread does the following: | ||
Line 693: | Line 777: | ||
* 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 | * Uses [[Network_Interface_services|nifm]] GetInternetConnectionStatus, returning an error if this is 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; | * u32 tmpval2=0x4000; | ||
Line 716: | Line 800: | ||
| 0x5 || 0x1 || Padding | | 0x5 || 0x1 || Padding | ||
|- | |- | ||
| 0x6 || 0x2 || u16 | | 0x6 || 0x2 || u16 meta_size. Must be <=0x1000. | ||
|- | |- | ||
| 0x8 || 0x8 || s64 | | 0x8 || 0x8 || s64 data_size. Must not be negative. During message-specific handling with request/reply this must also match the expected value (except for ID 0x0 which is ignored in this case). | ||
|} | |} | ||
After the header is the associated data for | After the header is the associated data for meta_size and data_size. The functions which generate the header always leave meta_size at value 0, when receiving the data for meta_size the received data is unused. | ||
The first message used by the client with SystemUpdate is ID 0x1. | The first message used by the client with SystemUpdate is ID 0x1. | ||
With SystemUpdate the server only uses StorageId= | With SystemUpdate the server only uses StorageId=BuiltInSystem. | ||
Messages: | Messages: | ||
Line 731: | Line 815: | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! ID || Request | ! ID || Request data_size / data || Reply data_size / data || Description | ||
|- | |- | ||
| 0x0 || 0x0 || 0x0 || Tells the server to exit. When handling this the handler func will immediately return 0, without sending a reply. | | 0x0 || 0x0 || 0x0 || Tells the server to exit. When handling this the handler func will immediately return 0, without sending a reply. | ||
|- | |- | ||
| 0x1 || [[NCM_services#ContentMetaKey|ContentMetaKey]] || | | 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 [[#Cmd69]]. | ||
|- | |- | ||
| 0x2 || 0x18-bytes: [[NCM_services#ContentId|ContentId]] u8 flag, u8 pad[7]. When flag is 0, during the transfer [[#SendSystemUpdateTaskInfo]] [[NS_Services#SystemUpdateProgress|SystemUpdateProgress]] | | 0x2 || 0x18-bytes: [[NCM_services#ContentId|ContentId]], u8 flag, u8 pad[7]. When flag is 0, during the transfer [[#SendSystemUpdateTaskInfo]] [[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. || 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. || | | 0x3 || 0x10-byte input for [[ETicket_services|es]] GetCommonTicketAndCertificateSize/GetCommonTicketAndCertificateData. || 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. | ||
|- | |- | ||
| 0x4 || s64 | | 0x4 || s64 total_size || 0x0 || The input data is copied into the server state, for [[#SendSystemUpdateTaskInfo]] [[NS_Services#SystemUpdateProgress|SystemUpdateProgress]] total_size. | ||
|} | |} | ||
[[Category:Services]] | [[Category:Services]] |