ValveSoftware / ValveSoftware/source-sdk-2013

Bug Report: Valve Update Breaks Steam Game Server Visibility on Linux/ARM Emulation

Open
#2,042 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
C++
Stars
10k
Forks
3k
Avg merge
8d 11h
Merged PRs (30d)
2

Description

Bug Report: Valve Update Breaks Steam Game Server Visibility on Linux/ARM Emulation

Executive Summary

After a recent Valve update, Linux/ARM-based game servers that successfully appeared in the Steam server browser prior to the update are now invisible to the browser and only reachable via direct IP connection. The server appears as "LAN" because the Steam master server reports the server's public IP as 127.0.0.1, despite the server being configured with a public IP on the network interface.

Affected System
  • Platform: Linux on ARM64
  • CPU Emulation: Tested with both QEMU and FEX-Emu
  • Game Server: Counter-Strike: Source GunGame
  • Host IP: [REMOVED - LOCAL NETWORK IP]
  • Public Internet IP: [REMOVED - PRIVATE]
  • Steam Client Version: Latest stable version (emulated via FEX-Emu, or run on native ARM via QEMU)
Problem Description
  1. Server Works, but is Invisible:

    • The server runs successfully and accepts connections via direct IP.
    • The net_public_adr cvar is set to the public internet IP.
    • VAC secure mode is active.
    • SourceMod and GunGame plugins load and run correctly.
    • However, the server does NOT appear in the Steam server browser for clients.
  2. "Public IP to Steam" Reports 127.0.0.1:

    Connection to Steam servers successful.
       Public IP to Steam is 127.0.0.1.
    VAC secure mode is activated.
    
  3. Affected Both QEMU and FEX-Emu:

    • The same issue occurs with QEMU (which worked before the update).
    • The same issue occurs with FEX-Emu (current testing environment).
    • This indicates the problem is not specific to FEX-Emu, but rather a change in Valve's API that affects all Linux/ARM emulation environments.
  4. Root Cause Hypothesis:

    • Prior to the update, the game server engine appeared to derive its public IP from the net_public_adr cvar.
    • After the update, the engine no longer respects net_public_adr and relies exclusively on the Steam API's ISteamGameServer::GetPublicIP() function to determine the public IP for master server queries.
    • Under both QEMU and FEX-Emu, the Steam client (steamclient.so) reports GetPublicIP() as 127.0.0.1, causing the master server to treat the server as LAN-only.
Attempted Fixes (as logged in the server console)
  1. Attempted Hooking of SteamInternal_GameServer_Init:

    • Created an LD_PRELOAD hook that intercepts SteamInternal_GameServer_Init and returns a modified public IP.
    • Tested with passthrough of all arguments (8 slots).
    • Result: Steam init fails with "Unable to load Steam support library" (the hook prevents proper Steam initialization).
  2. Attempted Hooking of ISteamGameServer::GetPublicIP (vtable +0x84):

    • Similar approach as above, modifying the IP reported by GetPublicIP().
    • Result: Same issue — hooks prevent Steam client from initializing correctly.
  3. Attempted Native Engine Path (ConVarRef("hostip")):

    • The engine reads the hostip ConVar and passes it to SteamInternal_GameServer_Init internally.
    • Tested setting hostip via RCON command: no effect on server browser visibility.
Conclusion

This is a breaking change introduced by a recent Valve update that:

  • Breaks game server visibility on Linux/ARM emulated platforms.
  • Affects both QEMU and FEX-Emu (not FEX-Emu-specific).
  • Is likely caused by Valve removing support for net_public_adr cvar and making master server queries strictly dependent on GetPublicIP().
Suggested Fix for Valve
  1. Re-enable net_public_adr support for Linux/ARM game servers, or
  2. Ensure GetPublicIP() returns the correct public IP (not 127.0.0.1) when the server is configured with a public IP in the cvar, or
  3. Add a new Steam API call for manually setting the public IP that bypasses the GetPublicIP() ambiguity on emulated platforms.
Logs and Screenshots
  • Server startup logs showing Public IP to Steam is 127.0.0.1.
  • Startup command showing -net_public_adr <public_ip>.
  • Confirmation that the server works on direct IP but not in the Steam browser.
  • Server query results (via status command in the console): visible in RCON but not via masterbrowser.steampowered.com.
Additional Information
  • This issue prevents Linux/ARM server owners from offering their servers to the public, as players cannot find them in the Steam browser.
  • The issue is reproducible on a clean install of the latest Source SDK Base or Counter-Strike: Source with the latest Steam client.
  • Both QEMU (tested with latest stable version) and FEX-Emu (tested with current stable version) exhibit the same behavior.

Date: August 30, 2026
Contact: wagner.alves.cos@gmail.com

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

No repository file or test is identified. Start by reviewing the startup logs and reproducing the server-browser failure on Linux/ARM under QEMU or FEX-Emu, then trace the interaction between net_public_adr, hostip, and SteamInternal_GameServer_Init/GetPublicIP(). Done requires a confirmed cause and a validated fix that restores public server visibility.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, linux
Domain
game-dev, networking, operating-systems
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.