Skip to content

Commit 99a1b94

Browse files
authored
feat: Add methods for setting max message size limits (i.e., MTU negotiation) [MTT-6214] (#2530)
1 parent 706c6b4 commit 99a1b94

File tree

7 files changed

+40
-14
lines changed

7 files changed

+40
-14
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
1010

1111
### Added
1212

13+
- Added: Message size limits (max single message and max fragmented message) can now be set using NetworkManager.SetMaxSingleMessageSize() and NetworkManager.SetMaxFragmentedMessageSize() for transports that don't work with the default values (#2530)
1314
- Added `NetworkObject.SpawnWithObservers` property (default is true) that when set to false will spawn a `NetworkObject` with no observers and will not be spawned on any client until `NetworkObject.NetworkShow` is invoked. (#2568)
1415

1516
### Fixed

com.unity.netcode.gameobjects/Runtime/Configuration/NetworkConfig.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public class NetworkConfig
156156
public string ToBase64()
157157
{
158158
NetworkConfig config = this;
159-
var writer = new FastBufferWriter(NetworkMessageManager.NonFragmentedMessageMaxSize, Allocator.Temp);
159+
var writer = new FastBufferWriter(1024, Allocator.Temp);
160160
using (writer)
161161
{
162162
writer.WriteValueSafe(config.ProtocolVersion);
@@ -228,7 +228,7 @@ public ulong GetConfig(bool cache = true)
228228
return m_ConfigHash.Value;
229229
}
230230

231-
var writer = new FastBufferWriter(NetworkMessageManager.NonFragmentedMessageMaxSize, Allocator.Temp, int.MaxValue);
231+
var writer = new FastBufferWriter(1024, Allocator.Temp, int.MaxValue);
232232
using (writer)
233233
{
234234
writer.WriteValueSafe(ProtocolVersion);

com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
6363
networkDelivery = NetworkDelivery.ReliableFragmentedSequenced;
6464
break;
6565
case RpcDelivery.Unreliable:
66-
if (bufferWriter.Length > NetworkMessageManager.NonFragmentedMessageMaxSize)
66+
if (bufferWriter.Length > NetworkManager.MessageManager.NonFragmentedMessageMaxSize)
6767
{
6868
throw new OverflowException("RPC parameters are too large for unreliable delivery.");
6969
}
@@ -144,7 +144,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
144144
networkDelivery = NetworkDelivery.ReliableFragmentedSequenced;
145145
break;
146146
case RpcDelivery.Unreliable:
147-
if (bufferWriter.Length > NetworkMessageManager.NonFragmentedMessageMaxSize)
147+
if (bufferWriter.Length > NetworkManager.MessageManager.NonFragmentedMessageMaxSize)
148148
{
149149
throw new OverflowException("RPC parameters are too large for unreliable delivery.");
150150
}
@@ -691,7 +691,7 @@ private void NetworkVariableUpdate(ulong targetClientId, int behaviourIndex)
691691
// so we don't have to do this serialization work if we're not going to use the result.
692692
if (IsServer && targetClientId == NetworkManager.ServerClientId)
693693
{
694-
var tmpWriter = new FastBufferWriter(NetworkMessageManager.NonFragmentedMessageMaxSize, Allocator.Temp, NetworkMessageManager.FragmentedMessageMaxSize);
694+
var tmpWriter = new FastBufferWriter(NetworkManager.MessageManager.NonFragmentedMessageMaxSize, Allocator.Temp, NetworkManager.MessageManager.FragmentedMessageMaxSize);
695695
using (tmpWriter)
696696
{
697697
message.Serialize(tmpWriter, message.Version);

com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,28 @@ private void OnEnable()
580580
/// <param name="prefab"></param>
581581
public void RemoveNetworkPrefab(GameObject prefab) => PrefabHandler.RemoveNetworkPrefab(prefab);
582582

583+
/// <summary>
584+
/// Sets the maximum size of a single non-fragmented message (or message batch) passed through the transport.
585+
/// This should represent the transport's MTU size, minus any transport-level overhead.
586+
/// </summary>
587+
/// <param name="size"></param>
588+
public int MaxTransmissionUnitSize
589+
{
590+
set => MessageManager.NonFragmentedMessageMaxSize = value;
591+
get => MessageManager.NonFragmentedMessageMaxSize;
592+
}
593+
594+
/// <summary>
595+
/// Sets the maximum size of a message (or message batch) passed through the transport with the ReliableFragmented delivery.
596+
/// Warning: setting this value too low may result in the SDK becoming non-functional with projects that have a large number of NetworkBehaviours or NetworkVariables, as the SDK relies on the transport's ability to fragment some messages when they grow beyond the MTU size.
597+
/// </summary>
598+
/// <param name="size"></param>
599+
public int MaximumFragmentedMessageSize
600+
{
601+
set => MessageManager.FragmentedMessageMaxSize = value;
602+
get => MessageManager.FragmentedMessageMaxSize;
603+
}
604+
583605
internal void Initialize(bool server)
584606
{
585607
// Don't allow the user to start a network session if the NetworkManager is

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/NetworkVariableDeltaMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
9090
{
9191
if (NetworkBehaviour.NetworkManager.NetworkConfig.EnsureNetworkVariableLengthSafety)
9292
{
93-
var tempWriter = new FastBufferWriter(NetworkMessageManager.NonFragmentedMessageMaxSize, Allocator.Temp, NetworkMessageManager.FragmentedMessageMaxSize);
93+
var tempWriter = new FastBufferWriter(NetworkBehaviour.NetworkManager.MessageManager.NonFragmentedMessageMaxSize, Allocator.Temp, NetworkBehaviour.NetworkManager.MessageManager.FragmentedMessageMaxSize);
9494
NetworkBehaviour.NetworkVariableFields[i].WriteDelta(tempWriter);
9595
BytePacker.WriteValueBitPacked(writer, tempWriter.Length);
9696

com.unity.netcode.gameobjects/Runtime/Messaging/NetworkMessageManager.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,9 @@ internal uint GetMessageType(Type t)
9595
return m_MessageTypes[t];
9696
}
9797

98-
public const int NonFragmentedMessageMaxSize = 1300;
99-
public const int FragmentedMessageMaxSize = int.MaxValue;
98+
public const int DefaultNonFragmentedMessageMaxSize = 1300;
99+
public int NonFragmentedMessageMaxSize = DefaultNonFragmentedMessageMaxSize;
100+
public int FragmentedMessageMaxSize = int.MaxValue;
100101

101102
internal struct MessageWithHandler
102103
{

com.unity.netcode.gameobjects/Tests/Editor/Messaging/MessageSendingTests.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public void WhenNotExceedingBatchSize_NewBatchesAreNotCreated()
157157
{
158158
var message = GetMessage();
159159
var size = UnsafeUtility.SizeOf<TestMessage>() + 2; // MessageHeader packed with this message will be 2 bytes
160-
for (var i = 0; i < (1300 - UnsafeUtility.SizeOf<NetworkBatchHeader>()) / size; ++i)
160+
for (var i = 0; i < (m_MessageManager.NonFragmentedMessageMaxSize - UnsafeUtility.SizeOf<NetworkBatchHeader>()) / size; ++i)
161161
{
162162
m_MessageManager.SendMessage(ref message, NetworkDelivery.Reliable, m_Clients);
163163
}
@@ -167,11 +167,12 @@ public void WhenNotExceedingBatchSize_NewBatchesAreNotCreated()
167167
}
168168

169169
[Test]
170-
public void WhenExceedingBatchSize_NewBatchesAreCreated()
170+
public void WhenExceedingBatchSize_NewBatchesAreCreated([Values(500, 1000, 1300, 2000)] int maxMessageSize)
171171
{
172172
var message = GetMessage();
173+
m_MessageManager.NonFragmentedMessageMaxSize = maxMessageSize;
173174
var size = UnsafeUtility.SizeOf<TestMessage>() + 2; // MessageHeader packed with this message will be 2 bytes
174-
for (var i = 0; i < ((1300 - UnsafeUtility.SizeOf<NetworkBatchHeader>()) / size) + 1; ++i)
175+
for (var i = 0; i < ((m_MessageManager.NonFragmentedMessageMaxSize - UnsafeUtility.SizeOf<NetworkBatchHeader>()) / size) + 1; ++i)
175176
{
176177
m_MessageManager.SendMessage(ref message, NetworkDelivery.Reliable, m_Clients);
177178
}
@@ -181,11 +182,12 @@ public void WhenExceedingBatchSize_NewBatchesAreCreated()
181182
}
182183

183184
[Test]
184-
public void WhenExceedingMTUSizeWithFragmentedDelivery_NewBatchesAreNotCreated()
185+
public void WhenExceedingMTUSizeWithFragmentedDelivery_NewBatchesAreNotCreated([Values(500, 1000, 1300, 2000)] int maxMessageSize)
185186
{
186187
var message = GetMessage();
188+
m_MessageManager.NonFragmentedMessageMaxSize = maxMessageSize;
187189
var size = UnsafeUtility.SizeOf<TestMessage>() + 2; // MessageHeader packed with this message will be 2 bytes
188-
for (var i = 0; i < ((1300 - UnsafeUtility.SizeOf<NetworkBatchHeader>()) / size) + 1; ++i)
190+
for (var i = 0; i < ((m_MessageManager.NonFragmentedMessageMaxSize - UnsafeUtility.SizeOf<NetworkBatchHeader>()) / size) + 1; ++i)
189191
{
190192
m_MessageManager.SendMessage(ref message, NetworkDelivery.ReliableFragmentedSequenced, m_Clients);
191193
}
@@ -291,7 +293,7 @@ public void WhenReceivingAMessageWithoutAHandler_ExceptionIsLogged()
291293

292294
var message = GetMessage();
293295

294-
var writer = new FastBufferWriter(1300, Allocator.Temp);
296+
var writer = new FastBufferWriter(m_MessageManager.NonFragmentedMessageMaxSize, Allocator.Temp);
295297
using (writer)
296298
{
297299
writer.TryBeginWrite(FastBufferWriter.GetWriteSize(message));

0 commit comments

Comments
 (0)