This page describes common data structures that are used by the Pia library.
The following ids are used in various places:
InetAddress
Up to 5.10:
This structure can only represent IPv4 addresses.
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 4 | Address | 
| 0x4 | 2 | Port | 
5.11 - 6.30:
This structure can represent both IPv4 and IPv6 addresses. Which encoding is used depends on the context.
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 0, 4 or 16 | Address | 
| 0x10 | 2 | Port | 
StationAddress
Up to 4.10:
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 6 | Inet address | 
| 0x6 | 2 | Extension id | 
5.2 - 5.44:
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 2, 6 or 18 | Inet address | 
6.16 - 6.30:
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 16 | Address | 
| 0x10 | 2 | Port | 
StationLocation
The station location holds information that allows Pia to connect to a given station. Many fields are directly taken from a station url, when NEX is used.
Up to 4.10:
| Type | Description | 
|---|---|
| StationAddress | Station address | 
| Uint32 | Constant id (PID) | 
| Uint32 | Variable id (CID) | 
| Uint32 | Service variable id (RVCID) | 
| Uint8 | URL type | 
| Uint8 | NEX stream id (sid) | 
| Uint8 | NEX stream type (stream) | 
| Uint8 | NAT mapping (natm) | 
| Uint8 | NAT filtering (natf) | 
| Uint8 | NAT flags (type) | 
| Uint8 | probeinit | 
5.2 - 5.9:
| Type | Description | 
|---|---|
| StationAddress | Station address | 
| Uint64 | Constant id (PID) | 
| Uint32 | Variable id (CID) | 
| Uint32 | Service variable id (RVCID) | 
| Uint8 | URL type | 
| Uint8 | NEX stream id (sid) | 
| Uint8 | NEX stream type (stream) | 
| Uint8 | NAT mapping (natm) | 
| Uint8 | NAT filtering (natf) | 
| Uint8 | NAT flags (type) | 
| Uint8 | probeinit | 
| InetAddress | Relay address | 
5.10:
| Type | Description | 
|---|---|
| InetAddress | Public address | 
| InetAddress | Private address | 
| InetAddress | Relay address | 
| Uint64 | Constant id (PID) | 
| Uint32 | Variable id (CID) | 
| Uint8 | 0x3: NAT filtering (natf)0xC: NAT mapping (natm)0xF0: NAT type | 
| Uint8 | NAT flags (type) | 
| Uint8 | probeinit | 
| Uint8 | Is private address available | 
5.11 - 5.44:
| Type | Description | 
|---|---|
| Uint8 | Size of public address | 
| Uint8 | Size of private address | 
| InetAddress | Public address | 
| InetAddress | Private address | 
| InetAddress | Relay address (IPv4) | 
| Uint64 | Constant id (PID) | 
| Uint32 | Variable id (CID) | 
| Uint32 | Service variable id (RVCID) | 
| Uint8 | 0x3: NAT filtering (natf)0xC: NAT mapping (natm)0xF0: NAT type | 
| Uint8 | NAT flags (type) | 
| Uint8 | probeinit | 
| Uint8 | Is private address available | 
6.16 - 6.30:
| Type | Description | 
|---|---|
| Uint8 | Address size | 
| StationAddress | Address | 
| Uint64 | Constant id | 
| Uint16 | Variable id | 
| Uint8 | 0x3: NAT filtering0xC: NAT mapping0x10: Is IPv6 | 
NEX URL Type
The URL type depends on the scheme of the given station url. It is always 0 or 1 in practice.
| Value | Scheme | 
|---|---|
| 0 | Invalid | 
| 1 | prudp | 
| 2 | prudps | 
| 3 | udp | 
NAT Mapping
| Value | Description | 
|---|---|
| 0 | Unknown | 
| 1 | Endpoint independent mapping | 
| 2 | Endpoint dependent mapping | 
NAT Filtering
| Value | Description | 
|---|---|
| 0 | Unknown | 
| 1 | Port independent filtering | 
| 2 | Port dependent filtering | 
NAT Flags
| Flag | Description | 
|---|---|
| 1 | Is behind NAT | 
| 2 | Is public | 
NAT Type
The NAT type determines how well the Switch is able to set up peer-to-peer connections. A is the best and F is the worst. The NAT type is also shown in the system settings if you perform a connection test.
The NAT type is used during host migration, giving players with a better NAT type a higher priority.
| Value | Type | 
|---|---|
| 0 | F | 
| 1 | A | 
| 2 | B | 
| 3 | C | 
| 4 | D | 
StationConnectionInfo
Up to 5.9:
| Type | Description | 
|---|---|
| StationLocation | Public location | 
| StationLocation | Private location | 
In Pia version 5.10, the station connection info structure was removed.
Constant ID
The constant id uniquely identifies a station, and never changes, even across sessions. The constant id depends on the network type.
NEX (Up to 5.44):
The constant id is the same as your principal id (pid).
LAN (Up to 5.9):
The constant id is generated from your local IP address and port: ip << 32 | port
LDN (Up to 5.9):
The constant id is generated from your MAC address: mac[2] << 56 | mac[4] << 48 | mac[5] << 40 | mac[3] << 32 | mac[1] << 24 | mac[0] << 16.
Variable ID
The variable id uniquely identifies a station in the current session. Unlike the constant id, it may change across sessions. The variable id depends on the network type:
NEX (Up to 5.44):
The variable id is the same as your connection id (CID).
LAN (Up to 5.9):
The variable is set to the current system tick (nn::os::GetSystemTick()) at the start of the session.
LDN (Up to 5.9):
The variable is set to the current system tick (nn::os::GetSystemTick()) at the start of the session.
Service Variable ID
Like the variable id, the service variable id uniquely identifies a station in the current session and may change across sessions. The service variable id depends on the network type:
NEX (Up to 5.44):
The services variable id is your Rendez-Vous connection id (RVCID). This is received from the server when the client registers itself with the secure connection protocol.
LAN (Up to 5.9):
The service variable id is generated from your local IP address and port: (ip & 0xFFFF) << 16 | port.
LDN (Up to 5.9):
The service variable id is the CRC32 hash of your MAC address.