SCTPQueue Class Reference

#include <SCTPQueue.h>

List of all members.


Detailed Description

Abstract base class for SCTP receive queues. This class represents data received by SCTP but not yet passed up to the application. The class also accomodates for selective retransmission, i.e. also acts as a segment buffer.

This class goes hand-in-hand with SCTPSendQueue.

This class is polymorphic because depending on where and how you use the SCTP model you might have different ideas about "sending data" on a simulated connection: you might want to transmit real bytes, "dummy" (byte count only), cMessage objects, etc; see discussion at SCTPSendQueue. Different subclasses can be written to accomodate different needs.

See also:
SCTPSendQueue

Public Types

typedef std::map< uint32,
SCTPDataVariables * > 
PayloadQueue

Public Member Functions

 SCTPQueue ()
 ~SCTPQueue ()
bool checkAndInsertVar (uint32 key, SCTPDataVariables *datVar)
SCTPDataVariablesgetAndExtractMessage (uint32 tsn)
SCTPDataVariablesextractMessage ()
void printQueue ()
uint32 getQueueSize ()
SCTPDataVariablesgetFirstVar ()
cMessage * getMsg (uint32 key)
SCTPDataVariablesgetVar (uint32 key)
SCTPDataVariablesgetNextVar (uint32 key, uint32 toTsn)
void removeMsg (uint32 key)
bool deleteMsg (uint32 tsn)
int32 getNumBytes ()
SCTPDataVariablesdequeueVarBySsn (uint16 ssn)

Public Attributes

PayloadQueue payloadQueue

Protected Attributes

SCTPAssociationassoc

Member Typedef Documentation

typedef std::map<uint32, SCTPDataVariables *> SCTPQueue::PayloadQueue


Constructor & Destructor Documentation

SCTPQueue::SCTPQueue (  ) 

Ctor.

00026 {
00027 assoc=NULL;
00028 }

SCTPQueue::~SCTPQueue (  ) 

Virtual dtor.

00031 {
00032         for (PayloadQueue::iterator i = payloadQueue.begin(); i!=payloadQueue.end(); i++)
00033                 delete i->second->userData;
00034         
00035         if (!payloadQueue.empty())
00036                 payloadQueue.clear();
00037 }


Member Function Documentation

bool SCTPQueue::checkAndInsertVar ( uint32  key,
SCTPDataVariables datVar 
)

Referenced by SCTPReceiveStream::enqueueNewDataChunk(), SCTPAssociation::process_TIMEOUT_RTX(), SCTPAssociation::processSackArrived(), SCTPAssociation::putInDeliveryQ(), and SCTPAssociation::sendAll().

00049 {
00050         PayloadQueue::iterator i = payloadQueue.find(key);
00051         if (i!=payloadQueue.end())
00052         {
00053                 return false;
00054         }
00055         else
00056         {
00057                 payloadQueue[key]=datVar;
00058         }
00059                 
00060         return true;
00061 }

SCTPDataVariables * SCTPQueue::getAndExtractMessage ( uint32  tsn  ) 

Referenced by SCTPAssociation::dequeueAckedChunks().

00085 {
00086         if (!payloadQueue.empty())
00087         {
00088                 PayloadQueue::iterator i = payloadQueue.find(tsn);
00089                 SCTPDataVariables *datVar = i->second;
00090                 payloadQueue.erase(i);
00091                 return datVar;
00092         }
00093         else
00094                  
00095                 sctpEV3<<"Queue is empty\n";
00096                 
00097          return NULL;
00098 }

SCTPDataVariables * SCTPQueue::extractMessage (  ) 

Referenced by SCTPAssociation::pushUlp().

00069 {       
00070         if (!payloadQueue.empty())
00071         {
00072                 PayloadQueue::iterator i = payloadQueue.begin();
00073                 SCTPDataVariables *datVar = i->second;
00074                 payloadQueue.erase(i);
00075                 return datVar;
00076         }
00077         else
00078                  
00079                 sctpEV3<<"Queue is empty\n";
00080                 
00081          return NULL;
00082 }

void SCTPQueue::printQueue (  ) 

00101 {
00102         SCTPDataVariables* datVar;
00103         uint32  key;
00104         for (PayloadQueue::iterator i = payloadQueue.begin(); i!=payloadQueue.end(); ++i)
00105         {
00106                 datVar = i->second;
00107                 key = i->first; 
00108                 sctpEV3<<key<<"\t";
00109         }
00110          
00111         sctpEV3<<"\n";
00112         
00113 }

uint32 SCTPQueue::getQueueSize (  ) 

SCTPDataVariables * SCTPQueue::getFirstVar (  ) 

00117 {
00118         PayloadQueue::iterator pl=payloadQueue.begin();
00119         SCTPDataVariables * datVar=pl->second;
00120 
00121         return datVar;
00122 }

cMessage * SCTPQueue::getMsg ( uint32  key  ) 

00125 {
00126         PayloadQueue::iterator pl=payloadQueue.find(tsn);
00127         SCTPDataVariables * datVar=pl->second;
00128         cMessage* smsg=check_and_cast<cMessage*>(datVar->userData);
00129         return smsg;
00130 }

SCTPDataVariables * SCTPQueue::getVar ( uint32  key  ) 

Referenced by SCTPAssociation::dequeueAckedChunks(), SCTPAssociation::makeRoomForTsn(), and SCTPAssociation::processSackArrived().

00133 {
00134         PayloadQueue::iterator pl=payloadQueue.find(tsn);
00135         if (pl!=payloadQueue.end())
00136                 return (pl->second);
00137         else
00138                 return NULL;
00139 }

SCTPDataVariables * SCTPQueue::getNextVar ( uint32  key,
uint32  toTsn 
)

00142 {
00143         
00144         for (uint32 i=tsn+1; i<toTsn; i++)
00145         {
00146                 PayloadQueue::iterator pl=payloadQueue.find(i);
00147                 if (pl!=payloadQueue.end())
00148                 {
00149                         return (pl->second);
00150                 }
00151         }
00152         return NULL;
00153 }

void SCTPQueue::removeMsg ( uint32  key  ) 

Referenced by SCTPAssociation::dequeueAckedChunks(), and SCTPAssociation::processSackArrived().

00158 {
00159         PayloadQueue::iterator pl=payloadQueue.find(tsn);
00160         //delete check_and_cast<SCTPSimpleMessage*>(pl->second->userData);
00161         payloadQueue.erase(pl);
00162 }

bool SCTPQueue::deleteMsg ( uint32  tsn  ) 

Referenced by SCTPAssociation::makeRoomForTsn().

00165 {
00166         PayloadQueue::iterator pl=payloadQueue.find(tsn);
00167         if (pl!=payloadQueue.end())
00168         {
00169                 delete check_and_cast<SCTPSimpleMessage*>(pl->second->userData);
00170                 payloadQueue.erase(pl);
00171                 return true;
00172         }
00173         return false;
00174 }

int32 SCTPQueue::getNumBytes (  ) 

Referenced by SCTPAssociation::getQueuedBytes().

00177 {
00178         int32 qb=0;
00179 
00180         for (PayloadQueue::iterator i=payloadQueue.begin(); i!=payloadQueue.end(); i++)
00181                 qb+=i->second->len/8;
00182 
00183         return qb;
00184 }

SCTPDataVariables * SCTPQueue::dequeueVarBySsn ( uint16  ssn  ) 

00187 {
00188         SCTPDataVariables* datVar;
00189         for (PayloadQueue::iterator i=payloadQueue.begin();i!=payloadQueue.end(); i++)
00190         {
00191                 if (i->second->ssn==ssn)
00192                 {
00193                         datVar = i->second;
00194                         payloadQueue.erase(i);
00195                         return datVar;
00196                 }
00197         }
00198         sctpEV3<<"ssn "<<ssn<<" not found\n";
00199         return NULL;
00200 }


Member Data Documentation

Referenced by SCTPQueue().


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

Generated on Fri Mar 20 18:51:21 2009 for INET Framework for OMNeT++/OMNEST by  doxygen 1.5.5