D329 - a network section for Porthole, and a record for "I could not look"

assumed - 2026-09-08

Porthole is an elfldr payload that serves video and controller sockets over libSceNet, which it must resolve itself because imports do not auto-bind in unsigned payload mode. Nothing had confirmed the network is reachable that way, and the constants its accept loop turns on - the non-blocking option value and the would-block code - were taken from public headers that disagree. This adds the section that answers it, and a record that lets payload mode say when it could not look at all.

The section (102-net)

Six checks, each resolving libSceNet the way a payload must and reporting what it found:

Two of these - the non-blocking option and the would-block code - are what block Porthole's first hardware run; the rest can follow.

Why the check address is the check, not a symbol

The harness skips a check whose table address will not resolve, which is right for a probe of one symbol on a loader that lacks it. But in payload mode every direct import is unbound, and that is exactly the leg this section exists to measure - the point is to reach the call through the dlsym gadget instead. So each net check's address is its own function, always callable, and the check does its own resolution and skips itself when nothing resolves. The pattern is the one 100-input/dualsense-symbols already uses.

Two names became callable

sceNetSetsockopt was absent and is now declared and imported; sceNetConnect moved from the census to @called-elsewhere for the self-connect. The other seven were already declared for the command socket (net_target.c).

The resolution record (Ask 4, and the honest-failure principle)

Separate from Porthole. In payload mode obSCEne wrote its report by calling libkernel and yet recorded libkernel as handle 0x0 and its symbols unresolvable, because the loader hands a payload no module list and no dlsym handle. libSceNet and libScePad get the same treatment, so their payload-mode verdicts carry no information: a reader cannot tell a library that is absent from one the enumeration could not see, which is the distinction Principle 2 exists to keep.

The fix is a run-level resolution record beside guard and peripherals: works or unavailable, with a reason. When it says unavailable, every module|...|0x0 and every unresolvable symbol below it reads as "not seen", not "absent". One line, so the report can say "I could not look" rather than implying it looked and found nothing - which is the more useful and the more honest of the two.