From fd80a13495a01bfa1d51f16f643fc4cb92916a5a Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 5 Feb 2014 19:11:38 -0500 Subject: [PATCH] handle multiple fragments in one packet --- SSU.cpp | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/SSU.cpp b/SSU.cpp index 521117ba..314a62da 100644 --- a/SSU.cpp +++ b/SSU.cpp @@ -368,24 +368,23 @@ namespace ssu uint8_t flag = *buf; buf++; LogPrint ("Process SSU data flags=", (int)flag); - if (flag) - { - //TODO: process options - return; - } uint8_t numFragments = *buf; // number of fragments buf++; - uint32_t msgID = be32toh (*(uint32_t *)buf); // message ID - buf += 4; - uint8_t frag[4]; - frag[0] = 0; - memcpy (frag + 1, buf, 3); - buf += 3; - uint32_t fragmentInfo = be32toh (*(uint32_t *)frag); // fragment info - uint16_t fragmentSize = be16toh (fragmentInfo & 0x1FFF); // bits 0 - 13 - bool isLast = fragmentInfo & 0x010000; // bit 16 - uint8_t fragmentNum = fragmentInfo >> 17; // bits 23 - 17 - LogPrint ("SSU data fragment ", (int)fragmentNum, " of ", (int)numFragments, " of message ", msgID, " size=", (int)fragmentSize, isLast ? " last" : " non-last"); + for (int i = 0; i < numFragments; i++) + { + uint32_t msgID = be32toh (*(uint32_t *)buf); // message ID + buf += 4; + uint8_t frag[4]; + frag[0] = 0; + memcpy (frag + 1, buf, 3); + buf += 3; + uint32_t fragmentInfo = be32toh (*(uint32_t *)frag); // fragment info + uint16_t fragmentSize = fragmentInfo & 0x1FFF; // bits 0 - 13 + bool isLast = fragmentInfo & 0x010000; // bit 16 + uint8_t fragmentNum = fragmentInfo >> 17; // bits 23 - 17 + LogPrint ("SSU data fragment ", (int)fragmentNum, " of message ", msgID, " size=", (int)fragmentSize, isLast ? " last" : " non-last"); + buf += fragmentSize; + } } SSUServer::SSUServer (boost::asio::io_service& service, int port):