From 275155998fdd45c0f27d56a8967adf83f5afe05a Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 17 Jul 2014 15:00:33 -0400 Subject: [PATCH] handle individaul bitfields ack --- SSUData.cpp | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/SSUData.cpp b/SSUData.cpp index 75a1df41..d6b9e6e7 100644 --- a/SSUData.cpp +++ b/SSUData.cpp @@ -61,11 +61,39 @@ namespace ssu buf++; for (int i = 0; i < numBitfields; i++) { + uint32_t msgID = be32toh (*(uint32_t *)buf); buf += 4; // msgID - // TODO: process individual Ack bitfields - while (*buf & 0x80) // not last + auto it = m_SentMessages.find (msgID); + int numSentFragments = it->second.size (); + // process individual Ack bitfields + bool isNonLast = false; + int fragment = 0; + do + { + uint8_t bitfield = *buf; + isNonLast = bitfield & 0x80; + bitfield &= 0x7F; // clear MSB + if (bitfield && it != m_SentMessages.end ()) + { + // process bits + uint8_t mask = 0x40; + for (int j = 0; j < 7; j++) + { + if (bitfield & mask) + { + if (fragment < numSentFragments) + { + delete it->second[fragment]; + it->second[fragment] = nullptr; + } + } + fragment++; + mask >>= 1; + } + } buf++; - buf++; // last byte + } + while (isNonLast); } } uint8_t numFragments = *buf; // number of fragments