△◯✕□ PS2 Servers DOCS
Downloads GitHub

Protocol Compatibility & Wire Specs

In-depth technical breakdown of protocol implementations across Desktop/Core (Python) and Edge (Go), packet-level wire specifications, and homebrew client support matrix.

Specifications
PS2 Servers implements the udpfsd protocol by pcm720 (UDPFS over UDPRDMA), the UDPBD block protocol, the parts of Microsoft's SMBv1, SMB2 and SMB3 specifications that PS2 clients use, NFS version 4.0 (RFC 7530) as unfs4 uses it, and HTTP range requests. The host conformance tests under conformance/ run client code against these servers on a PC; for SMB and NFS that is the real PS2 client code (usmb2, unfs4, libsmb2) built for the PC. None of them is a test on a PS2.

1. Console Homebrew Compatibility Matrix

Loader support varies by project and version. Review this matrix to match your loader to the correct server mode:

Loader / Application SMBv1 SMB2 / SMB3 UDPFS UDPBD HTTP NFS
RiptOPL Full Support Full Support Full Support Full Support Full Support NFS 4.0 via unfs4; OPL core and Ember PS1 games; console validation pending
Official OPL (ps2homebrew) Full Support Not in stock Not in stock Not in stock Not in stock Not in stock
Neutrino (Core) No SMB 3.0 via usmb2 (merged 2026-10-31, not in a release or development build yet); read-only ISO, TCP 445; console validation pending Native Primary Native Primary No NFS 4.0 via unfs4 (merged 2026-11-12, not in a release or development build yet); read-only ISO, TCP 2049; console validation pending
NHDDL (Neutrino GUI) No No Native Primary Native Primary No No
Open-PS2-Loader-HTTP (Docmine17) No No No No Native Primary No

Launchstation, a file manager rather than a loader, browses SMB2/SMB3 shares (smb:) and NFS exports (nfs:) from these servers; see SMB and NFS. The Neutrino rows are for a Neutrino built after the backend was merged: upstream's latest development build is still v1.8.0-61-g7be8de2 of 2026-08-31 (checked 2026-11-13) and has neither.

2. Core (Python) vs Edge (Go) Wire Differences

While both implementations produce compatible network flows, they differ in several low-level operational details:

Socket Binding Semantics

  • Core (Python): Passing --bind IP binds only the dynamically allocated data socket; the discovery listener continues to listen on 0.0.0.0 (all interfaces) to catch broadcasts.
  • Edge (Go): Passing --bind IP binds both the discovery socket and the data socket to that explicit IP.

Compressed-Image Block Cache

  • Core (Python): Keeps the most recently used decompressed blocks of each open compressed image, 32 by default (--compression-cache-size).
  • Edge (Go): Keeps the same number of blocks per image (same option and default), dropping the oldest first, and also caps each image's cache at 8 MiB, less on a machine with little memory.

3. UDPFS Packet Structure

UDPFS runs over UDPRDMA, the small reliable-UDP layer of udpfsd. Discovery is on UDP port 62966 (0xF5F6). Every packet starts with a 2-byte header, little-endian:

bits 0-3   packet type: 0 DISCOVERY, 1 INFORM, 2 DATA
bits 4-15  sequence number

DISCOVERY and INFORM add 4 bytes: the service ID (0xF5F5 for UDPFS) and a port. DATA adds a 4-byte header:

bits 0-11   sequence number acknowledged
bits 12-13  flags: 1 ACK, 2 FIN
bits 14-17  application header size, in 4-byte words
bits 18-31  data byte count

A DATA packet carries at most 1408 bytes of data. Its application header starts with the UDPFS message type: OPEN (0x10), CLOSE (0x12), READ (0x14), WRITE (0x16, data in 0x17), LSEEK (0x1A), DREAD (0x1C), GETSTAT (0x1E), MKDIR (0x20), REMOVE (0x22), RMDIR (0x24), and the block reads and writes BREAD (0x28) and BWRITE (0x2A). The replies are OPEN_REPLY (0x11), CLOSE_REPLY (0x13), WRITE_DONE (0x18), LSEEK_REPLY (0x1B), DREAD_REPLY (0x1D), GETSTAT_REPLY (0x1F) and RESULT_REPLY (0x26).