add process methods for control packet types

This commit is contained in:
Stephen Birarda 2015-07-28 10:01:38 -07:00
parent c14fee2ee8
commit 17d8085ab5
2 changed files with 38 additions and 20 deletions

View file

@ -91,7 +91,6 @@ void Connection::sendLightACK() const {
// create the light ACK packet, make it static so we can re-use it
static const int LIGHT_ACK_PACKET_PAYLOAD_BYTES = sizeof(SeqNum);
static auto lightACKPacket = ControlPacket::create(ControlPacket::ACK, LIGHT_ACK_PACKET_PAYLOAD_BYTES);
lightACKPacket->reset(); // We need to reset it every time.
SeqNum nextACKNumber = nextACK();
@ -100,6 +99,9 @@ void Connection::sendLightACK() const {
return;
}
// reset the lightACKPacket before we go to write the ACK to it
lightACKPacket->reset();
// pack in the ACK
lightACKPacket->writePrimitive(nextACKNumber);
@ -151,31 +153,15 @@ void Connection::processReceivedSeqNum(SeqNum seq) {
void Connection::processControl(unique_ptr<ControlPacket> controlPacket) {
switch (controlPacket->getType()) {
case ControlPacket::ACK: {
// read the ACK sub-sequence number
SeqNum currentACKSubSequenceNumber;
controlPacket->readPrimitive(&currentACKSubSequenceNumber);
// read the ACK number
SeqNum nextACKNumber;
controlPacket->readPrimitive(&nextACKNumber);
// read the RTT and variance
int32_t rtt, rttVariance;
controlPacket->readPrimitive(&rtt);
controlPacket->readPrimitive(&rttVariance);
processACK(move(controlPacket));
break;
}
case ControlPacket::ACK2: {
processACK2(move(controlPacket));
break;
}
case ControlPacket::NAK: {
// read the loss report
SeqNum start, end;
controlPacket->readPrimitive(&start);
if (controlPacket->bytesLeftToRead() >= (qint64)sizeof(SeqNum)) {
controlPacket->readPrimitive(&end);
}
processNAK(move(controlPacket));
break;
}
case ControlPacket::PacketPair: {
@ -184,3 +170,31 @@ void Connection::processControl(unique_ptr<ControlPacket> controlPacket) {
}
}
}
void Connection::processACK(std::unique_ptr<ControlPacket> controlPacket) {
// read the ACK sub-sequence number
SeqNum currentACKSubSequenceNumber;
controlPacket->readPrimitive(&currentACKSubSequenceNumber);
// read the ACK number
SeqNum nextACKNumber;
controlPacket->readPrimitive(&nextACKNumber);
// read the RTT and variance
int32_t rtt, rttVariance;
controlPacket->readPrimitive(&rtt);
controlPacket->readPrimitive(&rttVariance);
}
void Connection::processACK2(std::unique_ptr<ControlPacket> controlPacket) {
}
void Connection::processNAK(std::unique_ptr<ControlPacket> controlPacket) {
// read the loss report
SeqNum start, end;
controlPacket->readPrimitive(&start);
if (controlPacket->bytesLeftToRead() >= (qint64)sizeof(SeqNum)) {
controlPacket->readPrimitive(&end);
}
}

View file

@ -42,6 +42,10 @@ public:
void processControl(std::unique_ptr<ControlPacket> controlPacket);
private:
void processACK(std::unique_ptr<ControlPacket> controlPacket);
void processACK2(std::unique_ptr<ControlPacket> controlPacket);
void processNAK(std::unique_ptr<ControlPacket> controlPacket);
LossList _lossList; // List of all missing packets
SeqNum _largestReceivedSeqNum; // The largest sequence number received from the peer
SeqNum _lastSentACK; // The last sent ACK