collective: GSE_FORCE_LOG + CI fix + EOSPlus/Steam friend-join + raw-UDP↔P2P bridge #4

Merged
gabrielgad merged 4 commits from feature/belts-ip-p2p-bridge into dev 2026-06-16 15:30:31 -04:00
gabrielgad commented 2026-06-16 13:32:52 -04:00 (Migrated from github.com)

Env-gated (GSE_IP_P2P_BRIDGE=1, dormant otherwise) host-side bridge for UE5 Steam co-op games whose host listens via legacy ISteamNetworking::ReadP2PPacket (Steam P2P virtual port) while joiners connect with a raw passthrough UDP socket (e.g. Belts of Iron on a LAN-beacon session — UE picks asymmetric transports the emulator can't otherwise reconcile).

Mechanism: goldberg binds a real UDP socket on the game's P2P-channel port, resolves an incoming datagram's source IP → peer SteamID (new Networking::get_steam_id_from_ip), and injects it as a normal DATA Common_Message into unprocessed_messages — reusing the existing receive pipeline so it gets processed() + the P2PSessionRequest_tAcceptP2PSessionWithUser handshake. The host's SendP2PPacket replies to a bridged peer go back out as raw UDP to the recorded endpoint. Joiner side is pure raw UDP — untouched.

Validated: Belts of Iron co-op now connects end-to-end (Join succeeded / Welcomed by server → travels into the host world) under the splitux per-instance netns+bridge harness. Files: dll/network.cpp+network.h (IP→SteamID), dll/steam_networking.cpp+.h (bridge). Leaf-locked, cross-platform, no change to other games (env-gated).

Env-gated (`GSE_IP_P2P_BRIDGE=1`, dormant otherwise) host-side bridge for UE5 Steam co-op games whose **host** listens via legacy `ISteamNetworking::ReadP2PPacket` (Steam P2P virtual port) while **joiners** connect with a raw passthrough UDP socket (e.g. Belts of Iron on a LAN-beacon session — UE picks asymmetric transports the emulator can't otherwise reconcile). **Mechanism:** goldberg binds a real UDP socket on the game's P2P-channel port, resolves an incoming datagram's source IP → peer SteamID (new `Networking::get_steam_id_from_ip`), and injects it as a normal DATA `Common_Message` into `unprocessed_messages` — reusing the existing receive pipeline so it gets `processed()` + the `P2PSessionRequest_t`→`AcceptP2PSessionWithUser` handshake. The host's `SendP2PPacket` replies to a bridged peer go back out as raw UDP to the recorded endpoint. Joiner side is pure raw UDP — untouched. **Validated:** Belts of Iron co-op now connects end-to-end (`Join succeeded` / `Welcomed by server` → travels into the host world) under the splitux per-instance netns+bridge harness. Files: `dll/network.cpp`+`network.h` (IP→SteamID), `dll/steam_networking.cpp`+`.h` (bridge). Leaf-locked, cross-platform, no change to other games (env-gated).
Sign in to join this conversation.
No description provided.