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)), _packet(new char(_packetSize)),
_payload(_packet.get() + headerSize(type), size) { _payload(_packet.get() + headerSize(type), size) {
// Sanity check
Q_ASSERT(size <= maxPayloadSize(type)); 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 { PacketType::Value Packet::getPacketType() const {
@ -59,21 +66,39 @@ PacketVersion Packet::getPacketTypeVersion() const {
Packet::SequenceNumber Packet::getSequenceNumber() const { Packet::SequenceNumber Packet::getSequenceNumber() const {
PacketType::Value type{ getPacketType() }; PacketType::Value type{ getPacketType() };
if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { 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)); sizeof(PacketVersion));
return seqNum & ~(1 << 15); // remove control bit return seqNum & ~(1 << 15); // remove control bit
} }
return -1; return -1;
} }
bool Packet::isControlPacket() const { bool Packet::isControlPacket() const {
PacketType::Value type{ getPacketType() }; auto type = getPacketType();
if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { 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)); sizeof(PacketVersion));
return seqNum & (1 << 15); // Only keep control bit return seqNum & (1 << 15); // Only keep control bit
} }
return false; 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=(Packet&&) = delete;
Packet& operator=(const Packet&) = delete; Packet& operator=(const Packet&) = delete;
private: void setPacketTypeAndVersion(PacketType::Value type);
void setSequenceNumber(SequenceNumber seqNum);
int64_t _packetSize; int64_t _packetSize;
std::unique_ptr<char> _packet; std::unique_ptr<char> _packet;