Socket Services: Difference between revisions
No edit summary |
DaniElectra (talk | contribs) m →Socket module errors: Add more result codes |
||
(29 intermediate revisions by 6 users not shown) | |||
Line 1: | Line 1: | ||
[[Category:Services]] | [[Category:Services]] | ||
= Socket service "soc:U" = | The socket sysmodule has a maximum limit of 64 sockets in total. | ||
= Socket user service "soc:U" = | |||
There can be up to 18 sessions of this service. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Command Header | ! Command Header | ||
! Available since system-version | |||
! Description | ! Description | ||
|- | |- | ||
| 0x00010044 | | 0x00010044 | ||
| | |||
| [[SOCU:InitializeSockets|InitializeSockets]] | | [[SOCU:InitializeSockets|InitializeSockets]] | ||
|- | |- | ||
| 0x000200C2 | | 0x000200C2 | ||
| | |||
| [[SOCU:socket|socket]] | | [[SOCU:socket|socket]] | ||
|- | |- | ||
| 0x00030082 | | 0x00030082 | ||
| | |||
| [[SOCU:listen|listen]] | | [[SOCU:listen|listen]] | ||
|- | |- | ||
| 0x00040082 | | 0x00040082 | ||
| | |||
| [[SOCU:accept|accept]] | | [[SOCU:accept|accept]] | ||
|- | |- | ||
| 0x00050084 | | 0x00050084 | ||
| | |||
| [[SOCU:bind|bind]] | | [[SOCU:bind|bind]] | ||
|- | |- | ||
| 0x00060084 | | 0x00060084 | ||
| | |||
| [[SOCU:connect|connect]] | | [[SOCU:connect|connect]] | ||
|- | |- | ||
| 0x00070104 | | 0x00070104 | ||
| | |||
| [[SOCU:recvfrom_other|recvfrom_other]] | | [[SOCU:recvfrom_other|recvfrom_other]] | ||
|- | |- | ||
| 0x00080102 | | 0x00080102 | ||
| | |||
| [[SOCU:recvfrom|recvfrom]] | | [[SOCU:recvfrom|recvfrom]] | ||
|- | |- | ||
| 0x00090106 | | 0x00090106 | ||
| | |||
| [[SOCU:sendto_other|sendto_other]] | | [[SOCU:sendto_other|sendto_other]] | ||
|- | |- | ||
| 0x000A0106 | | 0x000A0106 | ||
| | |||
| [[SOCU:sendto|sendto]] | | [[SOCU:sendto|sendto]] | ||
|- | |- | ||
| 0x000B0042 | | 0x000B0042 | ||
| | |||
| [[SOCU:close|close]] | | [[SOCU:close|close]] | ||
|- | |- | ||
| 0x000C0082 | | 0x000C0082 | ||
| | |||
| [[SOCU:shutdown|shutdown]] | | [[SOCU:shutdown|shutdown]] | ||
|- | |- | ||
| 0x000D0082 | | 0x000D0082 | ||
| | |||
| [[SOCU:gethostbyname|gethostbyname]] | | [[SOCU:gethostbyname|gethostbyname]] | ||
|- | |- | ||
| 0x000E00C2 | | 0x000E00C2 | ||
| | | | ||
| [[SOCU:gethostbyaddr|gethostbyaddr]] | |||
|- | |- | ||
| 0x000F0106 | | 0x000F0106 | ||
| | | | ||
| [[SOCU:getaddrinfo|getaddrinfo]] | |||
|- | |||
| 0x00100102 | |||
| | |||
| [[SOCU:getnameinfo|getnameinfo]] | |||
|- | |- | ||
| 0x00110102 | | 0x00110102 | ||
| | |||
| [[SOCU:getsockopt|getsockopt]] | | [[SOCU:getsockopt|getsockopt]] | ||
|- | |- | ||
| 0x00120104 | | 0x00120104 | ||
| | |||
| [[SOCU:setsockopt|setsockopt]] | | [[SOCU:setsockopt|setsockopt]] | ||
|- | |- | ||
| 0x001300C2 | | 0x001300C2 | ||
| | |||
| [[SOCU:fcntl|fcntl]] | | [[SOCU:fcntl|fcntl]] | ||
|- | |- | ||
| 0x00140084 | | 0x00140084 | ||
| | |||
| [[SOCU:poll|poll]] | | [[SOCU:poll|poll]] | ||
|- | |||
| 0x00150042 | |||
| | |||
| [[SOCU:sockatmark|sockatmark]] | |||
|- | |||
| 0x00160000 | |||
| | |||
| [[SOCU:gethostid|gethostid]] | |||
|- | |- | ||
| 0x00170082 | | 0x00170082 | ||
| | |||
| [[SOCU:getsockname|getsockname]] | | [[SOCU:getsockname|getsockname]] | ||
|- | |||
| 0x00180082 | |||
| | |||
| [[SOCU:getpeername|getpeername]] | |||
|- | |- | ||
| 0x00190000 | | 0x00190000 | ||
| | |||
| [[SOCU:ShutdownSockets|ShutdownSockets]] | | [[SOCU:ShutdownSockets|ShutdownSockets]] | ||
|- | |||
| 0x001A00C0 | |||
| | |||
| [[SOCU:GetNetworkOpt|GetNetworkOpt]] | |||
|- | |||
| 0x001B0040 | |||
| | |||
| [[SOCU:ICMPSocket|ICMPSocket]] | |||
|- | |||
| 0x001C0104 | |||
| | |||
| [[SOCU:ICMPPing|ICMPPing]] | |||
|- | |||
| 0x001D0040 | |||
| | |||
| [[SOCU:ICMPCancel|ICMPCancel]] | |||
|- | |||
| 0x001E0040 | |||
| | |||
| [[SOCU:ICMPClose|ICMPClose]] | |||
|- | |||
| 0x001F0040 | |||
| | |||
| [[SOCU:GetResolverInfo|GetResolverInfo]] | |||
|- | |||
| 0x00200146 | |||
| | |||
| [[SOCU:SendToMultiple|SendToMultiple]] | |||
|- | |||
| 0x00210002 | |||
| | |||
| [[SOCU:CloseSockets|CloseSockets]] | |||
|- | |||
| 0x00220040 | |||
| | |||
| (int sockfd) Might be the inverse of command 0x00230040? | |||
|- | |||
| 0x00230040 | |||
| | |||
| [[SOCU:AddGlobalSocket|AddGlobalSocket]] | |||
|- | |||
| 0x100100C0 | |||
| ? | |||
| ? | |||
|- | |||
| 0x10030142 | |||
| ? | |||
| ? | |||
|- | |||
| 0x10050084 | |||
| ? | |||
| ? | |||
|- | |||
| 0x10070102 | |||
| ? | |||
| ? | |||
|} | |} | ||
= Socket privileged service "soc:P" = | |||
There can be up to 3 sessions of this service. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Command Header | |||
! Description | |||
|- | |||
| 0x00010084 | |||
| [[SOCP:InitializeSockets|InitializeSockets]] | |||
|- | |||
| 0x00020000 | |||
| [[SOCP:FinalizeSockets|FinalizeSockets]] | |||
|- | |||
| 0x000300C2 | |||
| [[SOCP:SetNetworkOpt|SetNetworkOpt]] | |||
|- | |||
| 0x00040040 | |||
| [[SOCP:CloseSocketsForProcess|CloseSocketsForProcess]] | |||
|- | |||
| 0x000500C0 | |||
| | |||
|- | |||
| 0x00060000 | |||
| [[SOCP:gethostid|gethostid]] | |||
|- | |||
| 0x00070000 | |||
| | |||
|- | |||
| 0x00080000 | |||
| | |||
|- | |||
| 0x00090000 | |||
| [[SOCP:StopInitializeSockets|StopInitializeSockets]] | |||
|} | |||
= struct sockaddr = | = struct sockaddr = | ||
Line 93: | Line 225: | ||
The total buffer size is 0x8, for family AF_INET value 2. AF_INET6 seems to be value 23, the total sockaddr size for this is 0x1C. The max sockaddr buffer size which the socket module can handle is size 0x1C. | The total buffer size is 0x8, for family AF_INET value 2. AF_INET6 seems to be value 23, the total sockaddr size for this is 0x1C. The max sockaddr buffer size which the socket module can handle is size 0x1C. | ||
These socket services(and defines/structures) seem to be based on the Wii sockets? | |||
=Socket module errors= | |||
{| class="wikitable" border="1" | |||
|- | |||
! Error | |||
! Description | |||
|- | |||
| 0xC8A07004 | |||
| This is returned when trying to use a socket descriptor from a different process. | |||
|- | |||
| 0xC8A07009 | |||
| Network dropped connection on reset? (Translated from ENETRESET error) | |||
|- | |||
| 0xC8A0700B | |||
| [[SOCU:InitializeSockets]] returns this when the specified PID was already used with [[SOCU:InitializeSockets]](since the PID was found in SOC module state table). | |||
|- | |||
| 0xD860700A | |||
| [[SOCU:InitializeSockets]] returns this when the PID table is already full(32 processes max). | |||
|- | |||
| 0xD8E07006 | |||
| Not initialized. This is returned when [[SOCU:InitializeSockets]] has not been run. | |||
|- | |||
| 0xD8E07007 | |||
| The given socket descriptor does not exist. | |||
|} | |||
=Socket module static buffers= | |||
This is the list of the known thread static buffers in use for SOC:u and the commands using those. | |||
{| class="wikitable" border="1" | |||
|- | |||
! buffer ID | |||
! commands | |||
|- | |||
| 0 | |||
| bind,connect | |||
|- | |||
| 1 | |||
| sendto_other,sendto | |||
|- | |||
| 2 | |||
| sendto | |||
|- | |||
| 5-7 | |||
| getaddrinfo | |||
|- | |||
| 8 | |||
| getnameinfo | |||
|- | |||
| 9 | |||
| setsockopt | |||
|- | |||
| 10 | |||
| poll | |||
|} | |||
=IPV6= | |||
It seems that Nintendo planned ahead and included IPv6 support to some extent in their code. | |||
Name resolution functions support IPv6 (such as [[SOCU:getnameinfo|getnameinfo]]), but [[SOCU:socket|socket]] doesn't. | |||
The ipv6 sockaddr size is 0x1C and is required for some IPC commands, even when using sockaddr_in which in reality is of size 8. | |||
The sockaddr_in6 struct is the following: | |||
struct in6_addr | |||
{ | |||
uint8_t s6_addr[16]; | |||
}; | |||
struct sockaddr_in6 | |||
{ | |||
sa_family_t sin6_family; | |||
in_port_t sin6_port; | |||
struct in6_addr sin6_addr; | |||
u32 sin6_flowinfo; // Not confirmed | |||
u32 sin6_scope_id; // Not confirmed | |||
}; |