diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index abe0ef8986..d12f2b9fdb 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -91,7 +91,6 @@ void Connection::sendLightACK() const { // create the light ACK packet, make it static so we can re-use it static const int LIGHT_ACK_PACKET_PAYLOAD_BYTES = sizeof(SeqNum); static auto lightACKPacket = ControlPacket::create(ControlPacket::ACK, LIGHT_ACK_PACKET_PAYLOAD_BYTES); - lightACKPacket->reset(); // We need to reset it every time. SeqNum nextACKNumber = nextACK(); @@ -100,6 +99,9 @@ void Connection::sendLightACK() const { return; } + // reset the lightACKPacket before we go to write the ACK to it + lightACKPacket->reset(); + // pack in the ACK lightACKPacket->writePrimitive(nextACKNumber); @@ -151,31 +153,15 @@ void Connection::processReceivedSeqNum(SeqNum seq) { void Connection::processControl(unique_ptr controlPacket) { switch (controlPacket->getType()) { case ControlPacket::ACK: { - // read the ACK sub-sequence number - SeqNum currentACKSubSequenceNumber; - controlPacket->readPrimitive(¤tACKSubSequenceNumber); - - // read the ACK number - SeqNum nextACKNumber; - controlPacket->readPrimitive(&nextACKNumber); - - // read the RTT and variance - int32_t rtt, rttVariance; - controlPacket->readPrimitive(&rtt); - controlPacket->readPrimitive(&rttVariance); - + processACK(move(controlPacket)); break; } case ControlPacket::ACK2: { + processACK2(move(controlPacket)); break; } case ControlPacket::NAK: { - // read the loss report - SeqNum start, end; - controlPacket->readPrimitive(&start); - if (controlPacket->bytesLeftToRead() >= (qint64)sizeof(SeqNum)) { - controlPacket->readPrimitive(&end); - } + processNAK(move(controlPacket)); break; } case ControlPacket::PacketPair: { @@ -184,3 +170,31 @@ void Connection::processControl(unique_ptr controlPacket) { } } } + +void Connection::processACK(std::unique_ptr controlPacket) { + // read the ACK sub-sequence number + SeqNum currentACKSubSequenceNumber; + controlPacket->readPrimitive(¤tACKSubSequenceNumber); + + // read the ACK number + SeqNum nextACKNumber; + controlPacket->readPrimitive(&nextACKNumber); + + // read the RTT and variance + int32_t rtt, rttVariance; + controlPacket->readPrimitive(&rtt); + controlPacket->readPrimitive(&rttVariance); +} + +void Connection::processACK2(std::unique_ptr controlPacket) { + +} + +void Connection::processNAK(std::unique_ptr controlPacket) { + // read the loss report + SeqNum start, end; + controlPacket->readPrimitive(&start); + if (controlPacket->bytesLeftToRead() >= (qint64)sizeof(SeqNum)) { + controlPacket->readPrimitive(&end); + } +} diff --git a/libraries/networking/src/udt/Connection.h b/libraries/networking/src/udt/Connection.h index 5d8d309d94..f96a571de4 100644 --- a/libraries/networking/src/udt/Connection.h +++ b/libraries/networking/src/udt/Connection.h @@ -42,6 +42,10 @@ public: void processControl(std::unique_ptr controlPacket); private: + void processACK(std::unique_ptr controlPacket); + void processACK2(std::unique_ptr controlPacket); + void processNAK(std::unique_ptr controlPacket); + LossList _lossList; // List of all missing packets SeqNum _largestReceivedSeqNum; // The largest sequence number received from the peer SeqNum _lastSentACK; // The last sent ACK