diff --git a/libraries/networking/src/udt/SendQueue.cpp b/libraries/networking/src/udt/SendQueue.cpp index 2c3c540fb2..a4f9d16d08 100644 --- a/libraries/networking/src/udt/SendQueue.cpp +++ b/libraries/networking/src/udt/SendQueue.cpp @@ -86,7 +86,7 @@ void SendQueue::ack(SequenceNumber ack) { { // remove any sequence numbers equal to or lower than this ACK in the loss list QWriteLocker nakLocker(&_naksLock); - if (_naks.getLength() > 0) { + if (_naks.getLength() > 0 && _naks.getFirstSequenceNumber() <= ack) { _naks.remove(_naks.getFirstSequenceNumber(), ack); } } diff --git a/libraries/networking/src/udt/SequenceNumber.h b/libraries/networking/src/udt/SequenceNumber.h index c77a14edf9..d0bea86777 100644 --- a/libraries/networking/src/udt/SequenceNumber.h +++ b/libraries/networking/src/udt/SequenceNumber.h @@ -21,7 +21,8 @@ namespace udt { class SequenceNumber { public: // Base type of sequence numbers - using Type = uint32_t; + using Type = int32_t; + using UType = uint32_t; // Values are for 29 bit SequenceNumber static const Type THRESHOLD = 0x0FFFFFFF; // threshold for comparing sequence numbers @@ -32,8 +33,10 @@ public: // Only explicit conversions explicit SequenceNumber(char* value) { _value = (*reinterpret_cast(value)) & MAX; } - explicit SequenceNumber(Type value) { _value = (value <= MAX) ? value : MAX; } + explicit SequenceNumber(Type value) { _value = (value <= MAX) ? ((value >= 0) ? value : 0) : MAX; } + explicit SequenceNumber(UType value) { _value = (value <= MAX) ? value : MAX; } explicit operator Type() { return _value; } + explicit operator UType() { return static_cast(_value); } inline SequenceNumber& operator++() { _value = (_value == MAX) ? 0 : ++_value;