|
36 | 36 | import java.net.Inet6Address; |
37 | 37 | import java.net.InetSocketAddress; |
38 | 38 | import java.util.ArrayDeque; |
| 39 | +import java.util.Deque; |
39 | 40 | import java.util.Iterator; |
40 | 41 | import java.util.Queue; |
41 | 42 | import java.util.concurrent.TimeUnit; |
@@ -76,7 +77,7 @@ public class RakSessionCodec extends ChannelDuplexHandler { |
76 | 77 | private IntObjectMap<RakDatagramPacket> sentDatagrams; |
77 | 78 | private Queue<IntRange> incomingAcks; |
78 | 79 | private Queue<IntRange> incomingNaks; |
79 | | - private Queue<IntRange> outgoingAcks; |
| 80 | + private Deque<IntRange> outgoingAcks; |
80 | 81 | private Queue<IntRange> outgoingNaks; |
81 | 82 | private long lastMinWeight; |
82 | 83 |
|
@@ -287,7 +288,15 @@ private void handleDatagram(ChannelHandlerContext ctx, RakDatagramPacket packet) |
287 | 288 | this.outgoingNaks.offer(new IntRange(packet.getSequenceIndex() - missedDatagrams, packet.getSequenceIndex() - 1)); |
288 | 289 | } |
289 | 290 |
|
290 | | - this.outgoingAcks.offer(new IntRange(packet.getSequenceIndex(), packet.getSequenceIndex())); |
| 291 | + int sequenceIndex = packet.getSequenceIndex(); |
| 292 | + IntRange lastRange = this.outgoingAcks.peekLast(); |
| 293 | + |
| 294 | + // Check if the new sequence index is exactly 1 greater than the last range's end |
| 295 | + if (lastRange != null && lastRange.end == sequenceIndex - 1) { |
| 296 | + lastRange.end = sequenceIndex; |
| 297 | + } else { |
| 298 | + this.outgoingAcks.offer(new IntRange(sequenceIndex, sequenceIndex)); |
| 299 | + } |
291 | 300 |
|
292 | 301 | for (final EncapsulatedPacket encapsulated : packet.getPackets()) { |
293 | 302 | if (encapsulated.getReliability().isReliable()) { |
|
0 commit comments