Socket Services: Difference between revisions

m Socket module errors: Add more result codes
 
(16 intermediate revisions by 6 users not shown)
Line 1: Line 1:
[[Category:Services]]
[[Category:Services]]
The socket sysmodule has a maximum limit of 64 sockets in total.
= Socket user service "soc:U" =
= 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
| 0x001A00C0
|
| [[SOCU:GetNetworkOpt|GetNetworkOpt]]
| [[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
| 0x001F0040
|
| [[SOCU:GetResolverInfo|GetResolverInfo]]
| [[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" =
= Socket privileged service "soc:P" =
There can be up to 3 sessions of this service.
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 107: Line 177:
|-
|-
| 0x00010084
| 0x00010084
|  
| [[SOCP:InitializeSockets|InitializeSockets]]
|-
|-
| 0x00020000
| 0x00020000
|  
| [[SOCP:FinalizeSockets|FinalizeSockets]]
|-
|-
| 0x000300C2
| 0x000300C2
|  
| [[SOCP:SetNetworkOpt|SetNetworkOpt]]
|-
|-
| 0x00040040
| 0x00040040
|  
| [[SOCP:CloseSocketsForProcess|CloseSocketsForProcess]]
|-
|-
| 0x000500C0
| 0x000500C0
Line 131: Line 201:
|-
|-
| 0x00090000
| 0x00090000
|  
| [[SOCP:StopInitializeSockets|StopInitializeSockets]]
|}
|}


Line 157: Line 227:


These socket services(and defines/structures) seem to be based on the Wii sockets?
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
};