Changes

m
→‎Socket module errors: Add more result codes
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]]
 
| [[SOCU:gethostbyaddr|gethostbyaddr]]
 
|-
 
|-
 
| 0x000F0106
 
| 0x000F0106
| This resolves the IP address(es) for the specified host-name.
+
|  
 +
| [[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
 
| 0x00150042
 +
|
 
| [[SOCU:sockatmark|sockatmark]]
 
| [[SOCU:sockatmark|sockatmark]]
 
|-
 
|-
 
| 0x00160000
 
| 0x00160000
 +
|
 
| [[SOCU:gethostid|gethostid]]
 
| [[SOCU:gethostid|gethostid]]
 
|-
 
|-
 
| 0x00170082
 
| 0x00170082
 +
|
 
| [[SOCU:getsockname|getsockname]]
 
| [[SOCU:getsockname|getsockname]]
 
|-
 
|-
 
| 0x00180082
 
| 0x00180082
 +
|
 
| [[SOCU:getpeername|getpeername]]
 
| [[SOCU:getpeername|getpeername]]
 
|-
 
|-
 
| 0x00190000
 
| 0x00190000
 +
|
 
| [[SOCU:ShutdownSockets|ShutdownSockets]]
 
| [[SOCU:ShutdownSockets|ShutdownSockets]]
 +
|-
 +
| 0x001A00C0
 +
|
 +
| [[SOCU:GetNetworkOpt|GetNetworkOpt]]
 
|-
 
|-
 
| 0x001B0040
 
| 0x001B0040
 +
|
 
| [[SOCU:ICMPSocket|ICMPSocket]]
 
| [[SOCU:ICMPSocket|ICMPSocket]]
 
|-
 
|-
 
| 0x001C0104
 
| 0x001C0104
 +
|
 
| [[SOCU:ICMPPing|ICMPPing]]
 
| [[SOCU:ICMPPing|ICMPPing]]
 
|-
 
|-
 
| 0x001D0040
 
| 0x001D0040
 +
|
 
| [[SOCU:ICMPCancel|ICMPCancel]]
 
| [[SOCU:ICMPCancel|ICMPCancel]]
 
|-
 
|-
 
| 0x001E0040
 
| 0x001E0040
 +
|
 
| [[SOCU:ICMPClose|ICMPClose]]
 
| [[SOCU:ICMPClose|ICMPClose]]
 +
|-
 +
| 0x001F0040
 +
|
 +
| [[SOCU:GetResolverInfo|GetResolverInfo]]
 +
|-
 +
| 0x00200146
 +
|
 +
| [[SOCU:SendToMultiple|SendToMultiple]]
 
|-
 
|-
 
| 0x00210002
 
| 0x00210002
 +
|
 
| [[SOCU:CloseSockets|CloseSockets]]
 
| [[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]]
 
|}
 
|}
   Line 115: 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
 +
};
106

edits