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.