]> git.deb.at Git - rhonda/impostor.hazel.git/commitdiff
Fix an off-by-one bug when receiving out of order messages that wrap the last receive...
authorForest <forest@innersloth.com>
Mon, 22 Mar 2021 23:32:52 +0000 (16:32 -0700)
committerForest <forest@innersloth.com>
Mon, 22 Mar 2021 23:32:52 +0000 (16:32 -0700)
Hazel.UnitTests/UdpConnectionTestHarness.cs
Hazel.UnitTests/UdpReliabilityTests.cs
Hazel/Udp/UdpConnection.Reliable.cs

index c7cde8dfb8830e1f4e777dc022480d7794732c0d..8414e0cd6fee35d105ded4c4699c3068a6b93c30 100644 (file)
@@ -10,6 +10,8 @@ namespace Hazel.UnitTests
     internal class UdpConnectionTestHarness : UdpConnection
     {
         public List<MessageReader> BytesSent = new List<MessageReader>();
+        public ushort ReliableReceiveLast => this.reliableReceiveLast;
+
 
         public override void Connect(byte[] bytes = null, int timeout = 5000)
         {
index ef364851030cb568b703431ea30ce9db6d8ba5b8..38ddc9ef8a4b73dee32c0eaa2ac4d1a84162c693 100644 (file)
@@ -8,6 +8,36 @@ namespace Hazel.UnitTests
     [TestClass]
     public class UdpReliabilityTests
     {
+        [TestMethod]
+        public void TestReliableWrapOffByOne()
+        {
+            List<MessageReader> messagesReceived = new List<MessageReader>();
+
+            UdpConnectionTestHarness dut = new UdpConnectionTestHarness();
+            dut.DataReceived += evt =>
+            {
+                messagesReceived.Add(evt.Message);
+            };
+
+            MessageWriter data = MessageWriter.Get(SendOption.Reliable);
+
+            Assert.AreEqual(ushort.MaxValue, dut.ReliableReceiveLast);
+                        
+            SetReliableId(data, 10);
+            dut.Test_Receive(data);
+
+            // This message may not be received if there is an off-by-one error when marking missed pkts up to 10.
+            SetReliableId(data, 9); 
+            dut.Test_Receive(data);
+
+            // Both messages should be received.
+            Assert.AreEqual(2, messagesReceived.Count);
+            messagesReceived.Clear();
+
+            Assert.AreEqual(2, dut.BytesSent.Count);
+            dut.BytesSent.Clear();
+        }
+
         [TestMethod]
         public void TestThatAllMessagesAreReceived()
         {
index 46ffc49638a0036bbdca2a16f025e91ccb49d43d..83feabd407faf7cc64b77c94869a8e87f05ab3ee 100644 (file)
@@ -56,7 +56,7 @@ namespace Hazel.Udp
         /// <summary>
         ///     The packet id that was received last.
         /// </summary>
-        private volatile ushort reliableReceiveLast = ushort.MaxValue;
+        protected volatile ushort reliableReceiveLast = ushort.MaxValue;
 
         private object PingLock = new object();
 
@@ -364,7 +364,7 @@ namespace Hazel.Udp
                     else
                     {
                         int cnt = (ushort.MaxValue - reliableReceiveLast) + id;
-                        for (ushort i = 1; i < cnt; ++i)
+                        for (ushort i = 1; i <= cnt; ++i)
                         {
                             reliableDataPacketsMissing.Add((ushort)(i + reliableReceiveLast));
                         }