mirror of
https://github.com/overte-org/overte.git
synced 2025-04-13 19:46:40 +02:00
Packet setters
This commit is contained in:
parent
91496d37c7
commit
8e5b040627
2 changed files with 35 additions and 8 deletions
|
@ -43,9 +43,16 @@ Packet::Packet(PacketType::Value type, int64_t size) :
|
|||
_packet(new char(_packetSize)),
|
||||
_payload(_packet.get() + headerSize(type), size) {
|
||||
|
||||
// Sanity check
|
||||
Q_ASSERT(size <= maxPayloadSize(type));
|
||||
auto offset = packArithmeticallyCodedValue(type, _packet);
|
||||
_packet[offset] = versionForPacketType(type);
|
||||
|
||||
// copy packet type and version in header
|
||||
setPacketTypeAndVersion(type);
|
||||
|
||||
// Set control bit and sequence number to 0 if necessary
|
||||
if (SEQUENCE_NUMBERED_PACKETS.contains(type)) {
|
||||
setSequenceNumber(0);
|
||||
}
|
||||
}
|
||||
|
||||
PacketType::Value Packet::getPacketType() const {
|
||||
|
@ -59,21 +66,39 @@ PacketVersion Packet::getPacketTypeVersion() const {
|
|||
Packet::SequenceNumber Packet::getSequenceNumber() const {
|
||||
PacketType::Value type{ getPacketType() };
|
||||
if (SEQUENCE_NUMBERED_PACKETS.contains(type)) {
|
||||
SequenceNumber seqNum = *reinterpret_cast<SequenceNumber*>(_packet.get() + numBytesForArithmeticCodedPacketType(type) +
|
||||
SequenceNumber seqNum = *reinterpret_cast<SequenceNumber*>(_packet.get() +
|
||||
numBytesForArithmeticCodedPacketType(type) +
|
||||
sizeof(PacketVersion));
|
||||
|
||||
return seqNum & ~(1 << 15); // remove control bit
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool Packet::isControlPacket() const {
|
||||
PacketType::Value type{ getPacketType() };
|
||||
auto type = getPacketType();
|
||||
if (SEQUENCE_NUMBERED_PACKETS.contains(type)) {
|
||||
SequenceNumber seqNum = *reinterpret_cast<SequenceNumber*>(_packet.get() + numBytesForArithmeticCodedPacketType(type) +
|
||||
SequenceNumber seqNum = *reinterpret_cast<SequenceNumber*>(_packet.get() +
|
||||
numBytesForArithmeticCodedPacketType(type) +
|
||||
sizeof(PacketVersion));
|
||||
|
||||
return seqNum & (1 << 15); // Only keep control bit
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Packet::setPacketTypeAndVersion(PacketType::Value type) {
|
||||
// Pack the packet type
|
||||
auto offset = packArithmeticallyCodedValue(type, _packet.get());
|
||||
|
||||
// Pack the packet version
|
||||
auto version { versionForPacketType(type) };
|
||||
memcpy(_packet.get() + offset, &version, sizeof(version));
|
||||
}
|
||||
|
||||
void Packet::setSequenceNumber(SequenceNumber seqNum) {
|
||||
auto type = getPacketType();
|
||||
// Here we are overriding the control bit to 0.
|
||||
// But that is not an issue since we should only ever set the seqNum
|
||||
// for data packets going out
|
||||
memcpy(_packet.get() + numBytesForArithmeticCodedPacketType(type) + sizeof(PacketVersion),
|
||||
&seqNum, sizeof(seqNum));
|
||||
}
|
||||
|
|
|
@ -40,7 +40,9 @@ protected:
|
|||
Packet& operator=(Packet&&) = delete;
|
||||
Packet& operator=(const Packet&) = delete;
|
||||
|
||||
private:
|
||||
void setPacketTypeAndVersion(PacketType::Value type);
|
||||
void setSequenceNumber(SequenceNumber seqNum);
|
||||
|
||||
int64_t _packetSize;
|
||||
std::unique_ptr<char> _packet;
|
||||
|
||||
|
|
Loading…
Reference in a new issue