Public Types | Public Member Functions | Public Attributes | Protected Attributes | Private Attributes

SCTPQueue Class Reference

#include <SCTPQueue.h>

List of all members.

Public Types

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

Public Member Functions

 SCTPQueue ()
 ~SCTPQueue ()
bool checkAndInsertChunk (const uint32 key, SCTPDataVariables *chunk)
SCTPDataVariablesgetAndExtractChunk (const uint32 tsn)
SCTPDataVariablesextractMessage ()
void printQueue () const
uint32 getQueueSize () const
SCTPDataVariablesgetFirstChunk () const
cMessage * getMsg (const uint32 key) const
SCTPDataVariablesgetChunk (const uint32 key) const
SCTPDataVariablesgetChunkFast (const uint32 tsn, bool &firstTime)
void removeMsg (const uint32 key)
bool deleteMsg (const uint32 tsn)
int32 getNumBytes () const
SCTPDataVariablesdequeueChunkBySSN (const uint16 ssn)

Public Attributes

PayloadQueue payloadQueue

Protected Attributes

SCTPAssociationassoc

Private Attributes

PayloadQueue::iterator GetChunkFastIterator

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

Definition at line 49 of file SCTPQueue.h.


Member Typedef Documentation

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

Definition at line 90 of file SCTPQueue.h.


Constructor & Destructor Documentation

SCTPQueue::SCTPQueue (  ) 

Constructor.

Definition at line 26 of file SCTPQueue.cc.

{
    assoc = NULL;
}

SCTPQueue::~SCTPQueue (  ) 

Virtual destructor.

Definition at line 31 of file SCTPQueue.cc.

{
    for (PayloadQueue::iterator iterator = payloadQueue.begin();
          iterator != payloadQueue.end(); iterator++) {
        SCTPDataVariables* chunk = iterator->second;
        delete chunk->userData;
    }
    if (!payloadQueue.empty()) {
        payloadQueue.clear();
    }
}


Member Function Documentation

bool SCTPQueue::checkAndInsertChunk ( const uint32  key,
SCTPDataVariables chunk 
)
bool SCTPQueue::deleteMsg ( const uint32  tsn  ) 

Definition at line 157 of file SCTPQueue.cc.

Referenced by SCTPAssociation::makeRoomForTsn().

{
    PayloadQueue::iterator iterator = payloadQueue.find(tsn);
    if (iterator != payloadQueue.end())
    {
        SCTPDataVariables* chunk = iterator->second;
        cMessage* msg = check_and_cast<cMessage*>(chunk->userData);
        delete msg;
        payloadQueue.erase(iterator);
        return true;
    }
    return false;
}

SCTPDataVariables * SCTPQueue::dequeueChunkBySSN ( const uint16  ssn  ) 

Definition at line 181 of file SCTPQueue.cc.

Referenced by SCTPReceiveStream::enqueueNewDataChunk().

{
    for (PayloadQueue::iterator iterator = payloadQueue.begin();
          iterator != payloadQueue.end(); iterator++) {
        SCTPDataVariables* chunk = iterator->second;
        if ((iterator->second->ssn == ssn) &&
             (iterator->second->bbit) &&
             (iterator->second->ebit) ) {
            payloadQueue.erase(iterator);
            return chunk;
        }
    }
    return NULL;
}

SCTPDataVariables * SCTPQueue::extractMessage (  ) 

Definition at line 58 of file SCTPQueue.cc.

Referenced by SCTPAssociation::pushUlp().

{
    if (!payloadQueue.empty()) {
        PayloadQueue::iterator iterator = payloadQueue.begin();
        SCTPDataVariables*    chunk   = iterator->second;
        payloadQueue.erase(iterator);
        return chunk;
    }
    return NULL;
}

SCTPDataVariables * SCTPQueue::getAndExtractChunk ( const uint32  tsn  ) 

Definition at line 69 of file SCTPQueue.cc.

Referenced by SCTPAssociation::dequeueAckedChunks(), SCTPReceiveStream::enqueueNewDataChunk(), and SCTPReceiveStream::reassemble().

{
    if (!payloadQueue.empty()) {
        PayloadQueue::iterator iterator = payloadQueue.find(tsn);
        SCTPDataVariables*    chunk   = iterator->second;
        payloadQueue.erase(iterator);
        return chunk;
    }
    return NULL;
}

SCTPDataVariables * SCTPQueue::getChunk ( const uint32  key  )  const
SCTPDataVariables * SCTPQueue::getChunkFast ( const uint32  tsn,
bool &  firstTime 
)

Definition at line 126 of file SCTPQueue.cc.

Referenced by SCTPAssociation::processSackArrived().

{
    if(!firstTime) {
        if(GetChunkFastIterator != payloadQueue.end()) {
            SCTPDataVariables* chunk = GetChunkFastIterator->second;
            if(chunk->tsn == tsn) {
                GetChunkFastIterator++;
                return(chunk);    // Found the right TSN!
            }
        }
        // TSN not found -> needs regular TSN lookup.
    }

    GetChunkFastIterator = payloadQueue.find(tsn);
    if(GetChunkFastIterator != payloadQueue.end()) {
        SCTPDataVariables* chunk = GetChunkFastIterator->second;
        GetChunkFastIterator++;
        firstTime = false;
        return(chunk);
    }

    return(NULL);
}

SCTPDataVariables * SCTPQueue::getFirstChunk (  )  const

Definition at line 98 of file SCTPQueue.cc.

{
    PayloadQueue::const_iterator iterator = payloadQueue.begin();
    SCTPDataVariables* chunk                  = iterator->second;
    return chunk;
}

cMessage * SCTPQueue::getMsg ( const uint32  key  )  const

Definition at line 105 of file SCTPQueue.cc.

{
    PayloadQueue::const_iterator iterator = payloadQueue.find(tsn);
    if (iterator != payloadQueue.end()) {
        SCTPDataVariables* chunk = iterator->second;
        cMessage* msg = check_and_cast<cMessage*>(chunk->userData);
        return msg;
    }
    return NULL;
}

int32 SCTPQueue::getNumBytes (  )  const

Definition at line 171 of file SCTPQueue.cc.

{
    int32 qb = 0;
    for (PayloadQueue::const_iterator iterator = payloadQueue.begin();
          iterator != payloadQueue.end(); iterator++) {
        qb += (iterator->second->len / 8);
    }
    return qb;
}

uint32 SCTPQueue::getQueueSize (  )  const
void SCTPQueue::printQueue (  )  const

Definition at line 80 of file SCTPQueue.cc.

{
    sctpEV3 << "Queue contents:\n";
    for (PayloadQueue::const_iterator iterator = payloadQueue.begin();
          iterator != payloadQueue.end(); ++iterator) {
        const uint32                 key     = iterator->first;
        const SCTPDataVariables* chunk = iterator->second;
        sctpEV3 << key << ":\t"
                  << "lastDestination="             << chunk->getLastDestination()
                  << " nextDestination="            << chunk->getNextDestination()
                  << " hasBeenAcked="               << chunk->hasBeenAcked
                  << " countsAsOutstanding="        << chunk->countsAsOutstanding
                  << " numberOfRetransmissions=" << chunk->numberOfRetransmissions
                  << endl;
    }
    sctpEV3 << endl;
}

void SCTPQueue::removeMsg ( const uint32  key  ) 

Definition at line 151 of file SCTPQueue.cc.

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

{
    PayloadQueue::iterator iterator = payloadQueue.find(tsn);
    payloadQueue.erase(iterator);
}


Member Data Documentation

Definition at line 94 of file SCTPQueue.h.

Referenced by SCTPQueue().

PayloadQueue::iterator SCTPQueue::GetChunkFastIterator [private]

Definition at line 97 of file SCTPQueue.h.

Referenced by getChunkFast().


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