diff --git a/Streaming.cpp b/Streaming.cpp index f597014c..fc4e8e99 100644 --- a/Streaming.cpp +++ b/Streaming.cpp @@ -183,13 +183,29 @@ namespace stream void Stream::ProcessAck (Packet * packet) { uint32_t ackThrough = packet->GetAckThrough (); - // TODO: handle NACKs + int nackCount = packet->GetNACKCount (); for (auto it = m_SentPackets.begin (); it != m_SentPackets.end ();) { - if ((*it)->GetSeqn () <= ackThrough) + auto seqn = (*it)->GetSeqn (); + if (seqn <= ackThrough) { + if (nackCount > 0) + { + bool nacked = false; + for (int i = 0; i < nackCount; i++) + if (seqn == packet->GetNACK (i)) + { + nacked = true; + break; + } + if (nacked) + { + LogPrint ("Packet ", seqn, " NACK"); + continue; + } + } auto sentPacket = *it; - LogPrint ("Packet ", sentPacket->GetSeqn (), " acknowledged"); + LogPrint ("Packet ", seqn, " acknowledged"); m_SentPackets.erase (it++); delete sentPacket; } diff --git a/Streaming.h b/Streaming.h index b561fc5a..86e80aef 100644 --- a/Streaming.h +++ b/Streaming.h @@ -54,6 +54,7 @@ namespace stream uint32_t GetSeqn () const { return be32toh (*(uint32_t *)(buf + 8)); }; uint32_t GetAckThrough () const { return be32toh (*(uint32_t *)(buf + 12)); }; uint8_t GetNACKCount () const { return buf[16]; }; + uint32_t GetNACK (int i) const { return be32toh (((uint32_t *)(buf + 17))[i]); }; const uint8_t * GetOption () const { return buf + 17 + GetNACKCount ()*4 + 3; }; // 3 = resendDelay + flags uint16_t GetFlags () const { return be16toh (*(uint16_t *)(GetOption () - 2)); }; uint16_t GetOptionSize () const { return be16toh (*(uint16_t *)GetOption ()); };