diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index 47872b9d..1086290d 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -86,6 +86,7 @@ public class QSBNetworkManager : NetworkManager, IAddComponentOnStart // Steam uses milliseconds _steamTransport.Timeout = QSBCore.Timeout * 1000; _steamTransport.TestIpAddress = QSBCore.DebugSettings.SteamTestIpAddress; + _steamTransport.DoFakeNetworkErrors = QSBCore.DebugSettings.SteamFakeNetworkErrors; } { @@ -171,6 +172,7 @@ public class QSBNetworkManager : NetworkManager, IAddComponentOnStart _steamTransport.Timeout = QSBCore.Timeout * 1000; _steamTransport.TestIpAddress = QSBCore.DebugSettings.SteamTestIpAddress; + _steamTransport.DoFakeNetworkErrors = QSBCore.DebugSettings.SteamFakeNetworkErrors; if (QSBCore.IsInMultiplayer) { diff --git a/QSB/Utility/DebugSettings.cs b/QSB/Utility/DebugSettings.cs index ea7bc40a..3e7c2b44 100644 --- a/QSB/Utility/DebugSettings.cs +++ b/QSB/Utility/DebugSettings.cs @@ -42,6 +42,9 @@ public class DebugSettings private string _steamTestIpAddress; public string SteamTestIpAddress => DebugMode ? _steamTestIpAddress : null; + private bool _steamFakeNetworkErrors; + public bool SteamFakeNetworkErrors => DebugMode && _steamFakeNetworkErrors; + public void Update(IModConfig config) { DebugMode = config.GetSettingsValue("debugMode"); @@ -57,5 +60,6 @@ public class DebugSettings _latencySimulation = config.GetSettingsValue("latencySimulation"); _logQSBMessages = config.GetSettingsValue("logQSBMessages"); _steamTestIpAddress = config.GetSettingsValue("steamTestIpAddress"); + _steamFakeNetworkErrors = config.GetSettingsValue("steamFakeNetworkErrors"); } } diff --git a/QSB/default-config.json b/QSB/default-config.json index 77d8514f..5b55682b 100644 --- a/QSB/default-config.json +++ b/QSB/default-config.json @@ -144,6 +144,12 @@ "type": "text", "value": "", "tooltip": "[DEBUG] If not empty, the steam transport will use this ip:port when listening/connecting. Host should probably use 0.0.0.0:port." + }, + "steamFakeNetworkErrors": { + "title": "[DEBUG] Steam Fake Network Errors", + "type": "toggle", + "value": false, + "tooltip": "[DEBUG] Aggressively simulates common network errors (loss, lag, reordering, duplication) to test resiliency." } } } diff --git a/SteamTransport/SteamTransport.cs b/SteamTransport/SteamTransport.cs index f164c845..e9885511 100644 --- a/SteamTransport/SteamTransport.cs +++ b/SteamTransport/SteamTransport.cs @@ -30,9 +30,9 @@ public class SteamTransport : Transport /// public int Timeout; /// - /// whether or not to simulate fake packet loss, reorder, and dup + /// whether or not to simulate fake packet loss, lag, reorder, and dup /// - public bool DoFakePacket; + public bool DoFakeNetworkErrors; public override bool Available() => true; diff --git a/SteamTransport/Util.cs b/SteamTransport/Util.cs index fdb40828..fdf34f31 100644 --- a/SteamTransport/Util.cs +++ b/SteamTransport/Util.cs @@ -66,8 +66,8 @@ public static class Util } }); - // 50% change of doing all (dont do lag cuz thats all packets), delay max 1 second - if (transport.DoFakePacket) + // 50% change of doing all, delay .5 seconds + if (transport.DoFakeNetworkErrors) { result.Add(new SteamNetworkingConfigValue_t { @@ -88,6 +88,24 @@ public static class Util } }); result.Add(new SteamNetworkingConfigValue_t + { + m_eValue = ESteamNetworkingConfigValue.k_ESteamNetworkingConfig_FakePacketLag_Send, + m_eDataType = ESteamNetworkingConfigDataType.k_ESteamNetworkingConfig_Int32, + m_val = new SteamNetworkingConfigValue_t.OptionValue + { + m_int32 = 500 + } + }); + result.Add(new SteamNetworkingConfigValue_t + { + m_eValue = ESteamNetworkingConfigValue.k_ESteamNetworkingConfig_FakePacketLag_Recv, + m_eDataType = ESteamNetworkingConfigDataType.k_ESteamNetworkingConfig_Int32, + m_val = new SteamNetworkingConfigValue_t.OptionValue + { + m_int32 = 500 + } + }); + result.Add(new SteamNetworkingConfigValue_t { m_eValue = ESteamNetworkingConfigValue.k_ESteamNetworkingConfig_FakePacketReorder_Send, m_eDataType = ESteamNetworkingConfigDataType.k_ESteamNetworkingConfig_Float, @@ -111,7 +129,7 @@ public static class Util m_eDataType = ESteamNetworkingConfigDataType.k_ESteamNetworkingConfig_Int32, m_val = new SteamNetworkingConfigValue_t.OptionValue { - m_int32 = 1000 + m_int32 = 500 } }); result.Add(new SteamNetworkingConfigValue_t @@ -138,7 +156,7 @@ public static class Util m_eDataType = ESteamNetworkingConfigDataType.k_ESteamNetworkingConfig_Int32, m_val = new SteamNetworkingConfigValue_t.OptionValue { - m_int32 = 1000 + m_int32 = 500 } }); } diff --git a/SteamTransportTest/Program.cs b/SteamTransportTest/Program.cs index bfeeba228..53f4a819 100644 --- a/SteamTransportTest/Program.cs +++ b/SteamTransportTest/Program.cs @@ -72,6 +72,7 @@ public static class Program transport.Log = Console.WriteLine; transport.TestIpAddress = "127.0.0.1:1234"; transport.Timeout = 1000; + transport.DoFakeNetworkErrors = true; transport.OnServerError = (conn, error, s) => Console.Error.WriteLine($"ERROR {conn} {error} {s}"); var theConn = -1; @@ -120,6 +121,7 @@ public static class Program transport.Log = Console.WriteLine; transport.TestIpAddress = "127.0.0.1:1234"; transport.Timeout = 1000; + transport.DoFakeNetworkErrors = true; transport.OnClientError = (error, s) => Console.Error.WriteLine($"ERROR {error} {s}"); transport.OnClientDataReceived = (bytes, i) => Console.WriteLine($"RECV {bytes.Join()} {i}");