#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().