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 |
| + | | |
| + | | [[SOCU:listen|listen]] |
| + | |- |
| + | | 0x00040082 |
| + | | |
| + | | [[SOCU:accept|accept]] |
| |- | | |- |
| | 0x00050084 | | | 0x00050084 |
− | | bind?(The command parameters for this appears to be the same as connect) | + | | |
| + | | [[SOCU:bind|bind]] |
| |- | | |- |
| | 0x00060084 | | | 0x00060084 |
| + | | |
| | [[SOCU:connect|connect]] | | | [[SOCU:connect|connect]] |
| + | |- |
| + | | 0x00070104 |
| + | | |
| + | | [[SOCU:recvfrom_other|recvfrom_other]] |
| |- | | |- |
| | 0x00080102 | | | 0x00080102 |
| + | | |
| | [[SOCU:recvfrom|recvfrom]] | | | [[SOCU:recvfrom|recvfrom]] |
| + | |- |
| + | | 0x00090106 |
| + | | |
| + | | [[SOCU:sendto_other|sendto_other]] |
| |- | | |- |
| | 0x000A0106 | | | 0x000A0106 |
| + | | |
| | [[SOCU:sendto|sendto]] | | | [[SOCU:sendto|sendto]] |
| |- | | |- |
− | | 0x000F00C2 | + | | 0x000B0042 |
− | | This resolves the IP address(es) for the specified host-name. | + | | |
| + | | [[SOCU:close|close]] |
| + | |- |
| + | | 0x000C0082 |
| + | | |
| + | | [[SOCU:shutdown|shutdown]] |
| + | |- |
| + | | 0x000D0082 |
| + | | |
| + | | [[SOCU:gethostbyname|gethostbyname]] |
| + | |- |
| + | | 0x000E00C2 |
| + | | |
| + | | [[SOCU:gethostbyaddr|gethostbyaddr]] |
| + | |- |
| + | | 0x000F0106 |
| + | | |
| + | | [[SOCU:getaddrinfo|getaddrinfo]] |
| + | |- |
| + | | 0x00100102 |
| + | | |
| + | | [[SOCU:getnameinfo|getnameinfo]] |
| + | |- |
| + | | 0x00110102 |
| + | | |
| + | | [[SOCU:getsockopt|getsockopt]] |
| |- | | |- |
| | 0x00120104 | | | 0x00120104 |
| + | | |
| | [[SOCU:setsockopt|setsockopt]] | | | [[SOCU:setsockopt|setsockopt]] |
| + | |- |
| + | | 0x001300C2 |
| + | | |
| + | | [[SOCU:fcntl|fcntl]] |
| + | |- |
| + | | 0x00140084 |
| + | | |
| + | | [[SOCU:poll|poll]] |
| + | |- |
| + | | 0x00150042 |
| + | | |
| + | | [[SOCU:sockatmark|sockatmark]] |
| + | |- |
| + | | 0x00160000 |
| + | | |
| + | | [[SOCU:gethostid|gethostid]] |
| + | |- |
| + | | 0x00170082 |
| + | | |
| + | | [[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 = |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x1 |
| + | | Total size of the entire sockaddr buffer. |
| + | |- |
| + | | 0x1 |
| + | | 0x1 |
| + | | u8 sa_family |
| + | |- |
| + | | 0x2 |
| + | | sockaddr_totalsize-0x2 |
| + | | sa_data[] |
| + | |} |
| + | |
| + | 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 |
| + | }; |