diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/BatchedSendQueue.cs b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/BatchedSendQueue.cs index 7dbe5e8f17..6bf3e49613 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/BatchedSendQueue.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/BatchedSendQueue.cs @@ -261,7 +261,7 @@ public int FillWriterWithBytes(ref DataStreamWriter writer, int maxBytes = 0) return 0; } - var maxLength = maxBytes == 0 ? writer.Capacity : maxBytes; + var maxLength = maxBytes == 0 ? writer.Capacity : Math.Min(maxBytes, writer.Capacity); var copyLength = Math.Min(maxLength, Length); unsafe diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs index e1d1e2fb1f..4576404d96 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs @@ -784,13 +784,21 @@ private void SendBatchedMessages(SendTarget sendTarget, BatchedSendQueue queue) { return; } + + var mtu = 0; + if (NetworkManager) + { + var ngoClientId = NetworkManager.ConnectionManager.TransportIdToClientId(sendTarget.ClientId); + mtu = NetworkManager.GetPeerMTU(ngoClientId); + } + new SendBatchedMessagesJob { Driver = m_Driver.ToConcurrent(), Target = sendTarget, Queue = queue, ReliablePipeline = m_ReliableSequencedPipeline, - MTU = NetworkManager ? NetworkManager.GetPeerMTU(sendTarget.ClientId) + m_Driver.MaxHeaderSize(sendTarget.NetworkPipeline) : 0, + MTU = mtu, }.Run(); } diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedSendQueueTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedSendQueueTests.cs index 3438c60c1c..3481480fe9 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedSendQueueTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Transports/BatchedSendQueueTests.cs @@ -293,6 +293,23 @@ public void BatchedSendQueue_FillWriterWithBytes_WriterCapacityEqualToLength() AssertIsTestMessage(data); } + [Test] + public void BatchedSendQueue_FillWriterWithBytes_MaxBytesGreaterThanCapacity() + { + var dataLength = k_TestMessageSize + BatchedSendQueue.PerMessageOverhead; + + using var q = new BatchedSendQueue(k_TestQueueCapacity); + using var data = new NativeArray(dataLength, Allocator.Temp); + + q.PushMessage(m_TestMessage); + q.PushMessage(m_TestMessage); + + var writer = new DataStreamWriter(data); + Assert.AreEqual(dataLength, q.FillWriterWithBytes(ref writer, dataLength * 2)); + AssertIsTestMessage(data); + Assert.False(writer.HasFailedWrites); + } + [Test] public void BatchedSendQueue_Consume_LessThanLength() {