From ddfe98ad43a1e4a545807f5faeac65a4d1d6fd0b Mon Sep 17 00:00:00 2001 From: wangyix Date: Mon, 16 Jun 2014 15:32:39 -0700 Subject: [PATCH] added code to parse nack packets in OctreeEditPacketSender --- .../octree/src/OctreeEditPacketSender.cpp | 49 +++++++++++++++++-- libraries/octree/src/OctreeEditPacketSender.h | 21 ++++++++ 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index fb0059b96d..69b58aaa41 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -17,6 +17,43 @@ #include #include "OctreeEditPacketSender.h" +void NackedPacketHistory::packetSent(const QByteArray& packet) { + // extract sequence number for the sent packet history + int numBytesPacketHeader = numBytesForPacketHeader(packet); + const char* dataAt = reinterpret_cast(packet.data()); + unsigned short int sequence = (*((unsigned short int*)(dataAt + numBytesPacketHeader))); + + // add packet to history + _sentPacketHistory.packetSent(sequence, packet); +} + +bool NackedPacketHistory::hasNextNackedPacket() const { + return !_nackedSequenceNumbers.isEmpty(); +} + +const QByteArray* NackedPacketHistory::getNextNackedPacket() { + if (!_nackedSequenceNumbers.isEmpty()) { + // could return null if packet is not in the history + return _sentPacketHistory.getPacket(_nackedSequenceNumbers.dequeue()); + } + return NULL; +} + +void NackedPacketHistory::parseNackPacket(const QByteArray& packet) { + int numBytesPacketHeader = numBytesForPacketHeader(packet); + const unsigned char* dataAt = reinterpret_cast(packet.data()) + numBytesPacketHeader; + + // read number of sequence numbers + uint16_t numSequenceNumbers = (*(uint16_t*)dataAt); + dataAt += sizeof(uint16_t); + + // read sequence numbers + for (int i = 0; i < numSequenceNumbers; i++) { + unsigned short int sequenceNumber = (*(unsigned short int*)dataAt); + _nackedSequenceNumbers.enqueue(sequenceNumber); + dataAt += sizeof(unsigned short int); + } +} EditPacketBuffer::EditPacketBuffer(PacketType type, unsigned char* buffer, ssize_t length, QUuid nodeUUID) : _nodeUUID(nodeUUID), @@ -97,9 +134,9 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, unsigned c if (node->getType() == getMyNodeType() && ((node->getUUID() == nodeUUID) || (nodeUUID.isNull()))) { if (node->getActiveSocket()) { - queuePacketForSending(node, QByteArray(reinterpret_cast(buffer), length)); - - + QByteArray packet(reinterpret_cast(buffer), length); + queuePacketForSending(node, packet); + _nackedPacketHistories[nodeUUID].packetSent(packet); // debugging output... bool wantDebugging = false; @@ -338,3 +375,9 @@ bool OctreeEditPacketSender::process() { // base class does most of the work. return PacketSender::process(); } + +void OctreeEditPacketSender::parseNackPacket(const QByteArray& packet) { + // parse sending node from packet + QUuid sendingNodeUUID = uuidFromPacketHeader(packet); + _nackedPacketHistories[sendingNodeUUID].parseNackPacket(packet); +} diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index 167e43b200..2586ca034f 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -12,9 +12,24 @@ #ifndef hifi_OctreeEditPacketSender_h #define hifi_OctreeEditPacketSender_h +#include #include #include #include "JurisdictionMap.h" +#include "SentPacketHistory.h" + +class NackedPacketHistory { +public: + NackedPacketHistory() : _sentPacketHistory(1000), _nackedSequenceNumbers() { } +public: + void packetSent(const QByteArray& packet); + bool hasNextNackedPacket() const; + const QByteArray* getNextNackedPacket(); + void parseNackPacket(const QByteArray& packet); +private: + SentPacketHistory _sentPacketHistory; + QQueue _nackedSequenceNumbers; +}; /// Used for construction of edit packets class EditPacketBuffer { @@ -90,6 +105,9 @@ public: virtual char getMyNodeType() const = 0; virtual void adjustEditPacketForClockSkew(unsigned char* codeColorBuffer, ssize_t length, int clockSkew) { }; +public: + void parseNackPacket(const QByteArray& packet); + protected: bool _shouldSend; void queuePacketToNode(const QUuid& nodeID, unsigned char* buffer, ssize_t length); @@ -114,5 +132,8 @@ protected: unsigned short int _sequenceNumber; int _maxPacketSize; + + // TODO: garbage-collect this + QHash _nackedPacketHistories; }; #endif // hifi_OctreeEditPacketSender_h