mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 18:42:58 +02:00
Fix ControlPackets read/write header
This commit is contained in:
parent
db5e5a4f75
commit
da480bcaf0
3 changed files with 13 additions and 27 deletions
|
@ -61,7 +61,7 @@ ControlPacket::ControlPacket(Type type) :
|
||||||
|
|
||||||
open(QIODevice::ReadWrite);
|
open(QIODevice::ReadWrite);
|
||||||
|
|
||||||
writeControlBitAndType();
|
writeType();
|
||||||
}
|
}
|
||||||
|
|
||||||
ControlPacket::ControlPacket(Type type, qint64 size) :
|
ControlPacket::ControlPacket(Type type, qint64 size) :
|
||||||
|
@ -72,7 +72,7 @@ ControlPacket::ControlPacket(Type type, qint64 size) :
|
||||||
|
|
||||||
open(QIODevice::ReadWrite);
|
open(QIODevice::ReadWrite);
|
||||||
|
|
||||||
writeControlBitAndType();
|
writeType();
|
||||||
}
|
}
|
||||||
|
|
||||||
ControlPacket::ControlPacket(std::unique_ptr<char> data, qint64 size, const HifiSockAddr& senderSockAddr) :
|
ControlPacket::ControlPacket(std::unique_ptr<char> data, qint64 size, const HifiSockAddr& senderSockAddr) :
|
||||||
|
@ -106,20 +106,11 @@ void ControlPacket::setType(udt::ControlPacket::Type type) {
|
||||||
writeType();
|
writeType();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlPacket::writeControlBitAndType() {
|
|
||||||
ControlBitAndType* bitAndType = reinterpret_cast<ControlBitAndType*>(_packet.get());
|
|
||||||
|
|
||||||
// write the control bit by OR'ing the current value with the CONTROL_BIT_MASK
|
|
||||||
*bitAndType = (*bitAndType | CONTROL_BIT_MASK);
|
|
||||||
|
|
||||||
writeType();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ControlPacket::writeType() {
|
void ControlPacket::writeType() {
|
||||||
ControlBitAndType* bitAndType = reinterpret_cast<ControlBitAndType*>(_packet.get());
|
ControlBitAndType* bitAndType = reinterpret_cast<ControlBitAndType*>(_packet.get());
|
||||||
|
|
||||||
// write the type by OR'ing the new type with the current value & CONTROL_BIT_MASK
|
// We override the control bit here by writing the type but it's okay, it'll always be 1
|
||||||
*bitAndType = (*bitAndType & CONTROL_BIT_MASK) | (_type << (sizeof(ControlPacket::Type) * 8 - 1));
|
*bitAndType = CONTROL_BIT_MASK | (ControlBitAndType(_type) << (8 * sizeof(Type)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlPacket::readType() {
|
void ControlPacket::readType() {
|
||||||
|
@ -128,6 +119,5 @@ void ControlPacket::readType() {
|
||||||
Q_ASSERT_X(bitAndType & CONTROL_BIT_MASK, "ControlPacket::readHeader()", "This should be a control packet");
|
Q_ASSERT_X(bitAndType & CONTROL_BIT_MASK, "ControlPacket::readHeader()", "This should be a control packet");
|
||||||
|
|
||||||
// read the type
|
// read the type
|
||||||
uint32_t oversizeType = (uint32_t) (bitAndType & ~CONTROL_BIT_MASK);
|
_type = (Type) ((bitAndType & ~CONTROL_BIT_MASK) >> (8 * sizeof(Type)));
|
||||||
_type = (Type) oversizeType;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,21 +135,16 @@ void Packet::writeHeader() const {
|
||||||
// grab pointer to current SequenceNumberAndBitField
|
// grab pointer to current SequenceNumberAndBitField
|
||||||
SequenceNumberAndBitField* seqNumBitField = reinterpret_cast<SequenceNumberAndBitField*>(_packet.get());
|
SequenceNumberAndBitField* seqNumBitField = reinterpret_cast<SequenceNumberAndBitField*>(_packet.get());
|
||||||
|
|
||||||
// 0 for data packets
|
// Write sequence number and reset bit field
|
||||||
*seqNumBitField &= ~CONTROL_BIT_MASK;
|
Q_ASSERT_X(!((SequenceNumber::Type)_sequenceNumber & BIT_FIELD_MASK),
|
||||||
|
"Packet::writeHeader()", "Sequence number is overflowing into bit field");
|
||||||
if (_isPartOfMessage) {
|
*seqNumBitField = ((SequenceNumber::Type)_sequenceNumber);
|
||||||
*seqNumBitField |= MESSAGE_BIT_MASK;
|
|
||||||
} else {
|
|
||||||
*seqNumBitField &= ~MESSAGE_BIT_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_isReliable) {
|
if (_isReliable) {
|
||||||
*seqNumBitField |= RELIABILITY_BIT_MASK;
|
*seqNumBitField |= RELIABILITY_BIT_MASK;
|
||||||
} else {
|
|
||||||
*seqNumBitField &= ~RELIABILITY_BIT_MASK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// write new value by ORing (old value & BIT_FIELD_MASK) with new seqNum
|
if (_isPartOfMessage) {
|
||||||
*seqNumBitField = (*seqNumBitField & BIT_FIELD_MASK) | (SequenceNumber::Type)_sequenceNumber;
|
*seqNumBitField |= MESSAGE_BIT_MASK;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,6 +92,7 @@ private:
|
||||||
|
|
||||||
friend struct std::hash<SequenceNumber>;
|
friend struct std::hash<SequenceNumber>;
|
||||||
};
|
};
|
||||||
|
static_assert(sizeof(SequenceNumber) == sizeof(uint32_t), "SequenceNumber invalid size");
|
||||||
|
|
||||||
|
|
||||||
inline bool operator<(const SequenceNumber& a, const SequenceNumber& b) {
|
inline bool operator<(const SequenceNumber& a, const SequenceNumber& b) {
|
||||||
|
|
Loading…
Reference in a new issue