Classes | Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes

ReassemblyBuffer Class Reference

#include <ReassemblyBuffer.h>

List of all members.

Classes

struct  Region

Public Member Functions

 ReassemblyBuffer ()
 ~ReassemblyBuffer ()
bool addFragment (ushort beg, ushort end, bool islast)
ushort getTotalLength () const

Protected Types

typedef std::vector< RegionRegionVector

Protected Member Functions

void merge (ushort beg, ushort end, bool islast)
void mergeFragments ()

Protected Attributes

Region main
RegionVectorfragments

Detailed Description

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.


Member Typedef Documentation

typedef std::vector<Region> ReassemblyBuffer::RegionVector [protected]

Definition at line 42 of file ReassemblyBuffer.h.


Constructor & Destructor Documentation

ReassemblyBuffer::ReassemblyBuffer (  ) 

Ctor.

Definition at line 25 of file ReassemblyBuffer.cc.

{
    main.beg = main.end = 0;
    main.islast = false;
    fragments = NULL;
}

ReassemblyBuffer::~ReassemblyBuffer (  ) 

Dtor.

Definition at line 32 of file ReassemblyBuffer.cc.

{
    delete fragments;
}


Member Function Documentation

bool ReassemblyBuffer::addFragment ( ushort  beg,
ushort  end,
bool  islast 
)

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

{
    merge(beg, end, islast);

    // do we have the complete datagram?
    return main.beg==0 && main.islast;
}

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

{return main.end;}

void ReassemblyBuffer::merge ( ushort  beg,
ushort  end,
bool  islast 
) [protected]

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);
}


Member Data Documentation

Definition at line 54 of file ReassemblyBuffer.h.

Referenced by merge(), mergeFragments(), ReassemblyBuffer(), and ~ReassemblyBuffer().

Definition at line 53 of file ReassemblyBuffer.h.

Referenced by addFragment(), merge(), mergeFragments(), and ReassemblyBuffer().


The documentation for this class was generated from the following files: