From f0bb71b5196ae7eb674c2f1e0338c66c52c2d500 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 28 Jul 2015 13:48:20 -0700 Subject: [PATCH] Change Packet read/write fcts --- libraries/networking/src/udt/Connection.cpp | 6 ++-- libraries/networking/src/udt/Packet.cpp | 38 ++++++++++++--------- libraries/networking/src/udt/Packet.h | 12 ++++--- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index 6826b4b109..b1b298c0ff 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -156,7 +156,7 @@ void Connection::processReceivedSequenceNumber(SequenceNumber seq) { void Connection::processControl(unique_ptr controlPacket) { switch (controlPacket->getType()) { - case ControlPacket::ACK: { + case ControlPacket::ACK: if (controlPacket->getPayloadSize() == sizeof(SequenceNumber)) { processLightACK(move(controlPacket)); } else { @@ -169,10 +169,8 @@ void Connection::processControl(unique_ptr controlPacket) { case ControlPacket::NAK: processNAK(move(controlPacket)); break; - case ControlPacket::PacketPair: { - + case ControlPacket::PacketPair: break; - } } } diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 6bbb5a8972..5f1aa88937 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -65,15 +65,13 @@ Packet::Packet(qint64 size, bool isReliable, bool isPartOfMessage) : adjustPayloadStartAndCapacity(); // set the UDT header to default values - writeSequenceNumber(SequenceNumber()); + writeHeader(); } Packet::Packet(std::unique_ptr data, qint64 size, const HifiSockAddr& senderSockAddr) : BasePacket(std::move(data), size, senderSockAddr) { - readIsReliable(); - readIsPartOfMessage(); - readSequenceNumber(); + readHeader(); adjustPayloadStartAndCapacity(_payloadSize > 0); } @@ -119,25 +117,33 @@ static const uint32_t RELIABILITY_BIT_MASK = 1 << (sizeof(Packet::SequenceNumber static const uint32_t MESSAGE_BIT_MASK = 1 << (sizeof(Packet::SequenceNumberAndBitField) - 3); static const uint32_t BIT_FIELD_MASK = CONTROL_BIT_MASK | RELIABILITY_BIT_MASK | MESSAGE_BIT_MASK; -void Packet::readIsReliable() { +void Packet::readHeader() { SequenceNumberAndBitField seqNumBitField = *reinterpret_cast(_packet.get()); + Q_ASSERT_X((bool) (seqNumBitField & CONTROL_BIT_MASK), + "Packet::readHeader()", "This should be a data packet"); _isReliable = (bool) (seqNumBitField & RELIABILITY_BIT_MASK); // Only keep reliability bit -} - -void Packet::readIsPartOfMessage() { - SequenceNumberAndBitField seqNumBitField = *reinterpret_cast(_packet.get()); - _isReliable = (bool) (seqNumBitField & MESSAGE_BIT_MASK); // Only keep message bit -} - -void Packet::readSequenceNumber() { - SequenceNumberAndBitField seqNumBitField = *reinterpret_cast(_packet.get()); + _isPartOfMessage = (bool) (seqNumBitField & MESSAGE_BIT_MASK); // Only keep message bit _sequenceNumber = SequenceNumber{ seqNumBitField & ~BIT_FIELD_MASK }; // Remove the bit field } -void Packet::writeSequenceNumber(SequenceNumber seqNum) { +void Packet::writeHeader() { // grab pointer to current SequenceNumberAndBitField SequenceNumberAndBitField* seqNumBitField = reinterpret_cast(_packet.get()); + *seqNumBitField &= ~CONTROL_BIT_MASK; + + if (_isPartOfMessage) { + *seqNumBitField |= MESSAGE_BIT_MASK; + } else { + *seqNumBitField &= ~MESSAGE_BIT_MASK; + } + + if (_isReliable) { + *seqNumBitField |= RELIABILITY_BIT_MASK; + } else { + *seqNumBitField &= ~RELIABILITY_BIT_MASK; + } + // write new value by ORing (old value & BIT_FIELD_MASK) with new seqNum - *seqNumBitField = (*seqNumBitField & BIT_FIELD_MASK) | (SequenceNumber::Type) seqNum; + *seqNumBitField = (*seqNumBitField & BIT_FIELD_MASK) | (SequenceNumber::Type)_sequenceNumber; } diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 343b89107c..94bd1be4fa 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -47,9 +47,12 @@ public: virtual qint64 localHeaderSize() const; virtual qint64 totalHeadersSize() const; // Cumulated size of all the headers - - void writeSequenceNumber(SequenceNumber seqNum); + + bool isPartOfMessage() const { return _isPartOfMessage; } + bool isReliable() const { return _isReliable; } SequenceNumber getSequenceNumber() const { return _sequenceNumber; } + + void setSequenceNumber(); protected: Packet(qint64 size, bool isReliable = false, bool isPartOfMessage = false); @@ -61,9 +64,8 @@ protected: Packet& operator=(Packet&& other); // Header readers - these read data to member variables after pulling packet off wire - void readIsPartOfMessage(); - void readIsReliable(); - void readSequenceNumber(); + void readHeader(); + void writeHeader(); bool _isReliable { false }; bool _isPartOfMessage { false };