Skip to content

Commit 702875d

Browse files
fix: Wrong MTU calculations in UnityTransport (#2731)
1 parent cca13d8 commit 702875d

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

com.unity.netcode.gameobjects/Runtime/Transports/UTP/BatchedSendQueue.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ public int FillWriterWithBytes(ref DataStreamWriter writer, int maxBytes = 0)
261261
return 0;
262262
}
263263

264-
var maxLength = maxBytes == 0 ? writer.Capacity : maxBytes;
264+
var maxLength = maxBytes == 0 ? writer.Capacity : Math.Min(maxBytes, writer.Capacity);
265265
var copyLength = Math.Min(maxLength, Length);
266266

267267
unsafe

com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -784,13 +784,21 @@ private void SendBatchedMessages(SendTarget sendTarget, BatchedSendQueue queue)
784784
{
785785
return;
786786
}
787+
788+
var mtu = 0;
789+
if (NetworkManager)
790+
{
791+
var ngoClientId = NetworkManager.ConnectionManager.TransportIdToClientId(sendTarget.ClientId);
792+
mtu = NetworkManager.GetPeerMTU(ngoClientId);
793+
}
794+
787795
new SendBatchedMessagesJob
788796
{
789797
Driver = m_Driver.ToConcurrent(),
790798
Target = sendTarget,
791799
Queue = queue,
792800
ReliablePipeline = m_ReliableSequencedPipeline,
793-
MTU = NetworkManager ? NetworkManager.GetPeerMTU(sendTarget.ClientId) + m_Driver.MaxHeaderSize(sendTarget.NetworkPipeline) : 0,
801+
MTU = mtu,
794802
}.Run();
795803
}
796804

com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedSendQueueTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,23 @@ public void BatchedSendQueue_FillWriterWithBytes_WriterCapacityEqualToLength()
293293
AssertIsTestMessage(data);
294294
}
295295

296+
[Test]
297+
public void BatchedSendQueue_FillWriterWithBytes_MaxBytesGreaterThanCapacity()
298+
{
299+
var dataLength = k_TestMessageSize + BatchedSendQueue.PerMessageOverhead;
300+
301+
using var q = new BatchedSendQueue(k_TestQueueCapacity);
302+
using var data = new NativeArray<byte>(dataLength, Allocator.Temp);
303+
304+
q.PushMessage(m_TestMessage);
305+
q.PushMessage(m_TestMessage);
306+
307+
var writer = new DataStreamWriter(data);
308+
Assert.AreEqual(dataLength, q.FillWriterWithBytes(ref writer, dataLength * 2));
309+
AssertIsTestMessage(data);
310+
Assert.False(writer.HasFailedWrites);
311+
}
312+
296313
[Test]
297314
public void BatchedSendQueue_Consume_LessThanLength()
298315
{

0 commit comments

Comments
 (0)