= 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
arbitary. This can be used for SystemUpdates via the above Send/Receive commands (which are then used via [[NS_Services#ns:su|ns:su]]). Application content can also be transferred , which uses a similar (?) protocol.
See [[#Cmd69]]/[[#Cmd76]] for the socket setup during Receive/Send task creation. Receive system = client, while Send system = server.
** This handles installation, with messages being used via vtable funcptrs.
The Send async [[#Cmd77|thread]] does the following:
* This is identical to the Receive thread except the called func is different.
** That func does:
*** 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.
*** All IDs in the below table are implemented by the server,
even 0x3 for SystemUpdate.
*** An error is thrown if the ID is unrecognized. An error is thrown if the value of the request size1 doesn't match the expected fixed value (except for ID 0x0).
The first message used by the client with SystemUpdate is ID 0x1.
With SystemUpdate the server only uses StorageId=
| 0x2 || 0x18-bytes: [[NCM_services#ContentId|ContentId]] u8 flag, u8 pad. When flag is 0, during the transfer [[#SendSystemUpdateTaskInfo]] [[NS_Services#SystemUpdateProgress|SystemUpdateProgress]] total_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. || Size from [[NCM_services#GetSizeFromContentId|GetSizeFromContentId]] with data from [[NCM_services#ReadContentIdFile|ReadContentIdFile]]. || Gets the entire content data for the specified ContentId.
| 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. ||
This is presumably used by the client for Application-Delivery. The two blocks of data are used as the buffers for [[ETicket_services|es]] ImportTicket by the client.
| 0x4 || s64 current_size || 0x0 || The input data is copied into the server state, for [[#SendSystemUpdateTaskInfo]] [[NS_Services#SystemUpdateProgress|SystemUpdateProgress]] current_size.