save out-of-sequence fragments

This commit is contained in:
orignal 2014-07-14 22:06:58 -04:00
parent eb073b09aa
commit 999abd517c
3 changed files with 109 additions and 68 deletions

View file

@ -2,8 +2,10 @@
#define SSU_DATA_H__
#include <inttypes.h>
#include <string.h>
#include <map>
#include <vector>
#include <set>
#include "I2NPProtocol.h"
namespace i2p
@ -11,6 +13,7 @@ namespace i2p
namespace ssu
{
const size_t SSU_MTU = 1484;
// data flags
const uint8_t DATA_FLAG_EXTENDED_DATA_INCLUDED = 0x02;
const uint8_t DATA_FLAG_WANT_REPLY = 0x04;
@ -19,6 +22,34 @@ namespace ssu
const uint8_t DATA_FLAG_ACK_BITFIELDS_INCLUDED = 0x40;
const uint8_t DATA_FLAG_EXPLICIT_ACKS_INCLUDED = 0x80;
struct Fragment
{
int fragmentNum, len;
bool isLast;
uint8_t buf[SSU_MTU];
Fragment (int n, const uint8_t * b, int l, bool last):
fragmentNum (n), len (l), isLast (last) { memcpy (buf, b, len); };
};
struct FragmentCmp
{
bool operator() (const Fragment * f1, const Fragment * f2) const
{
return f1->fragmentNum < f2->fragmentNum;
};
};
struct IncompleteMessage
{
I2NPMessage * msg;
int nextFragmentNum;
std::set<Fragment *, FragmentCmp> savedFragments;
IncompleteMessage (I2NPMessage * m): msg (m), nextFragmentNum (0) {};
~IncompleteMessage () { for (auto it: savedFragments) { delete it; }; };
};
class SSUSession;
class SSUData
{
@ -37,13 +68,7 @@ namespace ssu
private:
struct IncompleteMessage
{
I2NPMessage * msg;
uint8_t nextFragmentNum;
IncompleteMessage (I2NPMessage * m): msg (m), nextFragmentNum (1) {};
};
SSUSession& m_Session;
std::map<uint32_t, IncompleteMessage *> m_IncomleteMessages;