Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
487eada
Avoid overflow when calculating maxCapacity
noellie-velez Dec 1, 2025
9a85d10
Merge branch 'develop-2.0.0' into fix/cap-maximum-disconnect-timeout
noellie-velez Dec 5, 2025
09ddaab
Merge branch 'develop-2.0.0' into fix/cap-maximum-disconnect-timeout
noellie-velez Dec 5, 2025
d12f35f
CHANGELOG update
noellie-velez Dec 5, 2025
4ecfcc7
Merge branch 'develop-2.0.0' into fix/cap-maximum-disconnect-timeout
noellie-velez Dec 5, 2025
ad7ffe7
Merge branch 'fix/cap-maximum-disconnect-timeout' of github.com:Unity…
noellie-velez Dec 5, 2025
c0703c3
Add test
EmandM Dec 5, 2025
4d79ac1
Removed unused using
noellie-velez Dec 5, 2025
17541bf
Fix tests
EmandM Dec 5, 2025
06d9771
Merge branch 'develop-2.0.0' into fix/cap-maximum-disconnect-timeout
NoelStephensUnity Dec 8, 2025
2d416a0
Merge branch 'develop-2.0.0' into fix/cap-maximum-disconnect-timeout
NoelStephensUnity Dec 10, 2025
c972e81
Merge branch 'develop-2.0.0' into fix/cap-maximum-disconnect-timeout
NoelStephensUnity Dec 10, 2025
00c10fa
handle the case of the disconnect timeout being 0
noellie-velez Dec 11, 2025
f0eaffc
Adding comments
noellie-velez Dec 11, 2025
562affc
tests for disconnectTimout set tp 0
noellie-velez Dec 11, 2025
f2b86be
Merge branch 'develop-2.0.0' into fix/cap-maximum-disconnect-timeout
noellie-velez Dec 11, 2025
8d7ae03
Updating changelog
noellie-velez Dec 11, 2025
dda068e
Merge branch 'develop-2.0.0' into fix/cap-maximum-disconnect-timeout
noellie-velez Dec 12, 2025
552a38b
Merge branch 'develop-2.0.0' into fix/cap-maximum-disconnect-timeout
noellie-velez Dec 15, 2025
b4c952f
Merge develop-2.0.0 into fix/cap-maximum-disconnect-timeout
netcode-ci-service Dec 15, 2025
c7b8308
Merge develop-2.0.0 into fix/cap-maximum-disconnect-timeout
netcode-ci-service Dec 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions com.unity.netcode.gameobjects/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
### Changed

- Improve performance of `ParentSyncMessage`. (#3814)
- If the Unity Transport Disconnect Timeout is set to 0 in the Editor, the timeout will be entirely disabeled. (#3810)
- Improve performance of `DestroyObjectMessage`. (#3801)
- Improve performance of `CreateObjectMessage`. (#3800)
- First pass of CoreCLR engine API changes. (#3799)
Expand All @@ -53,6 +54,7 @@ Additional documentation and release notes are available at [Multiplayer Documen

- Ensure `NetworkBehaviour.IsSessionOwner` is correctly set when a new session owner is promoted. (#3817)
- Reset extended ownership flags on `NetworkObject` despawn. (#3817)
- Fixed issue where maxCapacity calculation overflows if a developer sets a very, very high (large) m_DisconnectTimeoutMS in the Editor for Unity Transport. (#3810)
- Fixed issues with the "Client-server quickstart for Netcode for GameObjects" script having static methods and properties. (#3787)
- Fixed issue where a warning message was being logged upon a client disconnecting from a server when the log level is set to developer. (#3786)
- Fixed issue where the server or host would no longer have access to the transport id to client id table when processing a transport level client disconnect event. (#3786)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ internal struct BatchedSendQueue : IDisposable
public const int PerMessageOverhead = sizeof(int);

internal const int MinimumMinimumCapacity = 4096;
// int.MaxValue is odd and maximum must be even.
internal const int MaximumMaximumCapacity = int.MaxValue - 1;

// Indices into m_HeadTailIndicies.
private const int k_HeadInternalIndex = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1515,7 +1515,22 @@ public override void Send(ulong clientId, ArraySegment<byte> payload, NetworkDel
// the only case where a full send queue causes a connection loss. Full unreliable
// send queues are dealt with by flushing it out to the network or simply dropping
// new messages if that fails.
var maxCapacity = m_MaxSendQueueSize > 0 ? m_MaxSendQueueSize : m_DisconnectTimeoutMS * k_MaxReliableThroughput;
var maxCapacity = m_MaxSendQueueSize;
if (maxCapacity <= 0)
{
// Setting m_DisconnectTimeoutMS to zero will disable the timeout entirely
// by setting the maxCapacity to it's maximum capacity
if (m_DisconnectTimeoutMS == 0)
{
maxCapacity = BatchedSendQueue.MaximumMaximumCapacity;
}
else
{
// Avoids overflow when m_DisconnectTimeoutMS is set to a very high value
var fullCalculation = Math.BigMul(m_DisconnectTimeoutMS, k_MaxReliableThroughput);
maxCapacity = (int)Math.Min(fullCalculation, BatchedSendQueue.MaximumMaximumCapacity);
}
}

queue = new BatchedSendQueue(Math.Max(maxCapacity, m_MaxPayloadSize));
m_SendQueue.Add(sendTarget, queue);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,16 +96,16 @@ public static IEnumerator EnsureNoNetworkEvent(List<TransportEvent> events, floa
}

// Common code to initialize a UnityTransport that logs its events.
public static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events, int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4)
public static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events, int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4, int disconnectTimeout = NetworkParameterConstants.DisconnectTimeoutMS)
{
InitializeTransport(out transport, out events, string.Empty, maxPayloadSize, maxSendQueueSize, family);
InitializeTransport(out transport, out events, string.Empty, maxPayloadSize, maxSendQueueSize, family, disconnectTimeout);
}

/// <summary>
/// Interanl version with identifier parameter
/// Internal version with identifier parameter
/// </summary>
internal static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events, string identifier,
int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4)
int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4, int disconnectTimeout = NetworkParameterConstants.DisconnectTimeoutMS)
{
var logger = new TransportEventLogger()
{
Expand All @@ -118,6 +118,7 @@ internal static void InitializeTransport(out UnityTransport transport, out List<
transport.OnTransportEvent += logger.HandleEvent;
transport.MaxPayloadSize = maxPayloadSize;
transport.MaxSendQueueSize = maxSendQueueSize;
transport.DisconnectTimeoutMS = disconnectTimeout;

if (family == NetworkFamily.Ipv6)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,62 @@ public IEnumerator SendMaximumPayloadSize(
yield return null;
}

[UnityTest]
public IEnumerator VeryLargeDisconnectTimeout()
{
// We want something that's over the old limit of ~44KB for reliable payloads.
var payloadSize = 64 * 1024;

var disconnectTimeout = int.MaxValue;

InitializeTransport(out m_Server, out m_ServerEvents, payloadSize, disconnectTimeout: disconnectTimeout);
InitializeTransport(out m_Client1, out m_Client1Events, payloadSize, disconnectTimeout: disconnectTimeout);
Assert.That(m_Server.DisconnectTimeoutMS, Is.EqualTo(disconnectTimeout));
Assert.That(m_Client1.DisconnectTimeoutMS, Is.EqualTo(disconnectTimeout));

m_Server.StartServer();
m_Client1.StartClient();

yield return WaitForNetworkEvent(NetworkEvent.Connect, m_Client1Events);

var payload = new ArraySegment<byte>(Encoding.ASCII.GetBytes("Some message"));
m_Client1.Send(m_Client1.ServerClientId, payload, NetworkDelivery.Reliable);

yield return WaitForNetworkEvent(NetworkEvent.Data, m_ServerEvents, MaxNetworkEventWaitTime * 4);

Assert.That(m_ServerEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("Some message")));

yield return null;
}

[UnityTest]
public IEnumerator ZeroDisconnectTimeoutSetToZero()
{
// We want something that's over the old limit of ~44KB for reliable payloads.
var payloadSize = 64 * 1024;

var disconnectTimeout = 0;

InitializeTransport(out m_Server, out m_ServerEvents, payloadSize, disconnectTimeout: disconnectTimeout);
InitializeTransport(out m_Client1, out m_Client1Events, payloadSize, disconnectTimeout: disconnectTimeout);
Assert.That(m_Server.DisconnectTimeoutMS, Is.EqualTo(disconnectTimeout));
Assert.That(m_Client1.DisconnectTimeoutMS, Is.EqualTo(disconnectTimeout));

m_Server.StartServer();
m_Client1.StartClient();

yield return WaitForNetworkEvent(NetworkEvent.Connect, m_Client1Events);

var payload = new ArraySegment<byte>(Encoding.ASCII.GetBytes("Some message"));
m_Client1.Send(m_Client1.ServerClientId, payload, NetworkDelivery.Reliable);

yield return WaitForNetworkEvent(NetworkEvent.Data, m_ServerEvents, MaxNetworkEventWaitTime * 4);

Assert.That(m_ServerEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("Some message")));

yield return null;
}

// Check making multiple sends to a client in a single frame.
[UnityTest]
public IEnumerator MultipleSendsSingleFrame(
Expand Down