Packet setters

This commit is contained in:
Atlante45 2015-07-07 10:32:31 -07:00
parent 91496d37c7
commit 8e5b040627
2 changed files with 35 additions and 8 deletions

View file

@ -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));
}

View file

@ -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;