mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-22 00:22:57 -05:00
9.0 KiB
9.0 KiB
libSceNet technical debt
Silent stubs
- sceNetShowIfconfig, sceNetShowNetstat (libSceNet) - return success without printing anything: the
()signatures and the success return follow shadPS4, which stubs both the same way. PPSA01530 fails to load without thesceNetShowIfconfigexport (#3177); PPSA11386 importssceNetShowNetstatbut does not call it during start-up. What the console prints and where is unverified
Unknown function info
- sceHttp2GetMemoryPoolStats, sceSslGetMemoryPoolStats, sceNetGetMemoryPoolStats (libSceHttp2, libSceSsl, libSceNet) - the signatures
(int id, stats*), the layouts (pool size, peak and current use, and for Http2 and Ssl a 32-bit reserved field) and the error codes were measured on a PS5 (firmware 13.60). The pool size is the one given at init or pool creation. Http2 and Net allocate nothing from these pools. Ssl counts its certificate backend allocations and returned data against its pool; C++ bookkeeping is outside that budget. All three initially report zero use, where the console already reports 0x15C0 bytes for Ssl, 0x1640 for Http2 and 4 for a Net pool. Ssl's allocation sizes and peak usage do not reproduce the console allocator
Functional
- sceNetConnect to AF_UNSPEC (libSceNet) dissolves a datagram association as FreeBSD 11.4's
udp_disconnect()does, which resets the local address to the wildcard address and keeps the port. On Linux a socket bound to an explicit port keeps its local address as well (127.0.0.1:<port>stays127.0.0.1:<port>), because a bound socket cannot be bound again; one bound to port 0 is bound again to the wildcard address with the port it had - sceNetSetsockopt (libSceNet) sets
SO_RCVTIMEOandSO_SNDTIMEOas the host socket's timeouts. On Windows a receive or send on a stream socket that times out fails withETIMEDOUT, where FreeBSD returnsEAGAINor the partial count: Winsock leaves the connection in an indeterminate state after a timeout and reports no partial count (SOL_SOCKET options), so FreeBSD's behaviour needs the timeout waited for without the host option. A receive on a datagram socket that times out fails withEAGAIN - sceNetSetsockopt, sceNetGetsockopt (libSceNet) take
SO_SNDTIMEOandSO_RCVTIMEO(0x1005, 0x1006) as a 16-bytestruct timeval, as FreeBSD 11.4'ssosetoptandsogetoptdo, and Sony's 0x1105 and 0x1106 as anintof microseconds. A console log of ProsperoLight (firmware 12.20) shows receives timing out every 100 ms after it gave 0x1006 a{0, 100000}timeval. The errors for a value shorter than a timeval (EINVAL) or out of range (EDOM), andsceNetGetsockoptcutting the timeval to the caller's length, follow FreeBSD'ssooptcopyinandsooptcopyoutand are not measured on a console - sceNetSetsockopt (libSceNet) stores
SO_ONESBCAST(0x10000, shadPS4'sORBIS_NET_SO_ONESBCAST) per socket andsceNetGetsockoptreads back the value that was set, as shadPS4 does; PPSA34501 sets it and crashes later when it fails withEOPNOTSUPP. Sends ignore it. FreeBSD 11.4's ip(4) documents the like-namedIPPROTO_IPoptionIP_ONESBCAST: a datagram sent to an interface's directed broadcast address, such as 192.168.2.255, leaves through that interface with its destination rewritten to 255.255.255.255, and only on a socket allowed to setSO_BROADCAST. Here host routing selects the outgoing interface and the destination is not rewritten. shadPS4 also leaves sends unchanged, and its TODO reads the option the other way round: a send to 255.255.255.255 would be converted to the interface's broadcast address. Whether the console'sSOL_SOCKEToption behaves likeIP_ONESBCAST, and what it reads back, is not verified on hardware. FreeBSD 11.4'ssogetopt()reads several boolean socket options back as their flag bit (so_options & optname,sys/kern/uipc_socket.c), not as the value set; whether the console does so for0x10000is unknown - sceNetGetsockopt (libSceNet) reads
SO_ERRORfrom the host socket. Winsock does not clear a socket's pending error when it is read, so on Windows the library reports a pending error once and shows it again only after a newsceNetConnect; a second failure with the same code on the same socket without asceNetConnectin between would be hidden. - sceNetSendmsg and sceNetRecvmsg (libSceNet) copy the scatter/gather list through one host buffer and accept only the flags
sceNetSend/sceNetRecvaccept. Sending control data throws; a receive never returns control data (msg_controllen0), since no socket option that queues it is supported - MSG_DONTWAIT (libSceNet) in
sceNetSend,sceNetSendto,sceNetRecv,sceNetRecvfrom,sceNetRecvmsgandsceNetSendmsgmakes that one call non-blocking through the host'sMSG_DONTWAIT, as FreeBSD 11.4'ssoreceive_genericreturnsEWOULDBLOCKfor it (sys/kern/uipc_socket.c); the value0x80is FreeBSD's (sys/sys/socket.h) and shadPS4's. Winsock has no per-call non-blocking flag, so on Windows these calls still fail withEOPNOTSUPPfor it - sceNetRecv, sceNetRecvfrom and sceNetRecvmsg (libSceNet) on a datagram socket with no local address wait on Windows until a bind, connect or send gives it one, checking the host socket every 10 ms. Winsock fails such a receive with
WSAEINVAL, where FreeBSD 11.4'ssoreceive_dgramwaits for a datagram (sys/kern/uipc_socket.c). A non-blocking socket fails withEAGAINat once, and the receive timeout ends the wait withEAGAIN; when the address comes first, the call waits for a datagram only for what is left of the timeout. AsceNetShutdownof the receive side ends the wait and the receive returns 0, and a zero-length receive returns 0 without waiting, assoreceive_dgramdoes when the socket can't receive more or nothing was asked for. An abort or close ends the wait, and the host receive then fails as it did before - sceNetResolverAbort and sceNetResolverStartNtoaMultipleRecords (libSceNet) follow shadPS4 (net.cpp, net_resolver.cpp); the
(int rid, int flags)signature of the abort also matches SharpProspero. Unverified on hardware. Lookups run synchronously over the host resolver, which cannot be interrupted: an abort while a lookup runs on another thread returns at once, and that lookup fails withEINTRwithout writing its output only when the host call returns; the abort flags are then ignored, as shadPS4 does for a running lookup. With nothing running, abort flag 1 (NTOA preservation) or 2 (ATON preservation) makes the nextsceNetResolverStartNtoa*orsceNetResolverStartAtoncall on that resolver fail withEINTR, reported bysceNetResolverGetError, after its arguments are checked. Unlike shadPS4, which ignores them, other abort flag bits throw, andsceNetResolverStartNtoaMultipleRecordsthrows for any flag, including async (1) and 0x10000 (IP address literals disabled), assceNetResolverStartNtoaMultipleRecordsExdoes - sceNetResolverStartNtoa6 (libSceNet) resolves a host name to its first IPv6 address through the host resolver (
getaddrinfowithAF_INET6) and writes the 16-byte address; the(rid, hostname, addr, timeout, retry, flags)signature followssceNetResolverStartNtoa. A name with no IPv6 address fails withRESOLVER_ENODNS(0x804101E1) like a failed lookup; whether the console returns IPv4-mapped addresses instead is not verified. Timeout and retry are ignored as insceNetResolverStartNtoa, and any nonzero flags throw because their meaning for this call is not known. Unverified on hardware.