#include <ReassemblyBuffer.h>
Classes | |
| struct | Region |
Public Member Functions | |
| ReassemblyBuffer () | |
| ~ReassemblyBuffer () | |
| bool | addFragment (ushort beg, ushort end, bool islast) |
| ushort | getTotalLength () const |
Protected Types | |
| typedef std::vector< Region > | RegionVector |
Protected Member Functions | |
| void | merge (ushort beg, ushort end, bool islast) |
| void | mergeFragments () |
Protected Attributes | |
| Region | main |
| RegionVector * | fragments |
Generic reassembly buffer for a fragmented datagram (or a fragmented anything).
Currently used in IPFragBuf and IPv6FragBuf.
Definition at line 31 of file ReassemblyBuffer.h.
typedef std::vector<Region> ReassemblyBuffer::RegionVector [protected] |
Definition at line 42 of file ReassemblyBuffer.h.
| ReassemblyBuffer::ReassemblyBuffer | ( | ) |
| ReassemblyBuffer::~ReassemblyBuffer | ( | ) |
Add a fragment, and returns true if reassembly has completed (i.e. we have everything from offset 0 to the last fragment).
Definition at line 37 of file ReassemblyBuffer.cc.
Referenced by IPv6FragBuf::addFragment(), and IPFragBuf::addFragment().
| ushort ReassemblyBuffer::getTotalLength | ( | ) | const [inline] |
Returns the total (assembled) length of the datagram. Can only be called after addFragment() returned true.
Definition at line 81 of file ReassemblyBuffer.h.
Referenced by IPv6FragBuf::addFragment(), and IPFragBuf::addFragment().
Definition at line 45 of file ReassemblyBuffer.cc.
Referenced by addFragment().
{
if (main.end==beg)
{
// most typical case (<95%): new fragment follows last one
main.end = end;
if (islast)
main.islast = true;
if (fragments)
mergeFragments();
}
else if (main.beg==end)
{
// new fragment precedes what we already have
main.beg = beg;
if (fragments)
mergeFragments();
}
else if (main.end<beg || main.beg>end)
{
// disjoint fragment, store it until another fragment fills in the gap
if (!fragments)
fragments = new RegionVector();
Region r;
r.beg = beg;
r.end = end;
r.islast = islast;
fragments->push_back(r);
}
else
{
// overlapping is not possible;
// fragment's range already contained in buffer (probably duplicate fragment)
}
}
| void ReassemblyBuffer::mergeFragments | ( | ) | [protected] |
Definition at line 81 of file ReassemblyBuffer.cc.
Referenced by merge().
{
RegionVector& frags = *fragments;
bool oncemore;
do
{
oncemore = false;
for (RegionVector::iterator i=frags.begin(); i!=frags.end(); )
{
bool deleteit = false;
Region& frag = *i;
if (main.end==frag.beg)
{
main.end = frag.end;
if (frag.islast)
main.islast = true;
deleteit = true;
}
else if (main.beg==frag.end)
{
main.beg = frag.beg;
deleteit = true;
}
else if (main.beg<=frag.beg && main.end>=frag.end)
{
// we already have this region (duplicate fragment), delete it
deleteit = true;
}
if (deleteit)
{
// deletion is tricky because erase() invalidates iterator
int pos = i - frags.begin();
frags.erase(i);
i = frags.begin() + pos;
oncemore = true;
}
else
{
++i;
}
}
}
while (oncemore);
}
RegionVector* ReassemblyBuffer::fragments [protected] |
Definition at line 54 of file ReassemblyBuffer.h.
Referenced by merge(), mergeFragments(), ReassemblyBuffer(), and ~ReassemblyBuffer().
Region ReassemblyBuffer::main [protected] |
Definition at line 53 of file ReassemblyBuffer.h.
Referenced by addFragment(), merge(), mergeFragments(), and ReassemblyBuffer().
1.7.1