NIM services: Difference between revisions
No edit summary |
|||
Line 675: | Line 675: | ||
** 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. | ** 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. | ||
** When any of the above fail (including the system-setting), the Result is written into state, then the Result is returned. | ** When any of the above fail (including the system-setting), the Result is written into state, then the Result is returned. | ||
Line 684: | Line 684: | ||
*** All IDs in the below table are implemented by the server, even 0x3 for SystemUpdate. | *** 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). | *** 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 above socket setup for the Send async thread does the following: | |||
* Clears sockaddr_in and sets addrlen to 0x10. | |||
* Enters a loop which repeatedly calls a func. If that func fails, this will immediately return. | |||
* Within that loop the following is done: | |||
** sockfd = accept(listen_sockfd, &sockaddr_in, &addrlen); {handle error on fail - listen_sockfd is the saved sockfd from [[#Cmd76]]} | |||
** Exits the loop when the ipaddr within sockaddr_in matches the saved ipaddr in state from [[#Cmd76]] (originally from the cmd input param). Otherwise, close sockfd and continue the loop (with the above func being called again). | |||
* The following is done after the loop: | |||
* u64 tmpval=1; setsockopt(sockfd, SOL_SOCKET, SO_VENDOR + 0x1, &tmpval, sizeof(tmpval)); {handle error on fail} | |||
* Uses a service cmd, 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. | |||
* u32 tmpval2=0x4000; | |||
* u32 tmpval3=0x20000; | |||
* setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &tmpval2, sizeof(tmpval2)); {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. | |||
** The func used with the above loop does the following: | |||
** Uses select() with input setup for {content of readfds = sockfd}, and timeval setup for a 1-second timeout. This is used repeatedly, until this returns an error (in which case error handling is done) or returns non-zero. | |||
** Then this returns 0. | |||
Messages (requests/replies) begin with the following 0x10-byte header, then any associated data. | Messages (requests/replies) begin with the following 0x10-byte header, then any associated data. |