#include <SCTPQueue.h>
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.
Public Types | |
typedef std::map< uint32, SCTPDataVariables * > | PayloadQueue |
Public Member Functions | |
SCTPQueue () | |
~SCTPQueue () | |
bool | checkAndInsertVar (uint32 key, SCTPDataVariables *datVar) |
SCTPDataVariables * | getAndExtractMessage (uint32 tsn) |
SCTPDataVariables * | extractMessage () |
void | printQueue () |
uint32 | getQueueSize () |
SCTPDataVariables * | getFirstVar () |
cMessage * | getMsg (uint32 key) |
SCTPDataVariables * | getVar (uint32 key) |
SCTPDataVariables * | getNextVar (uint32 key, uint32 toTsn) |
void | removeMsg (uint32 key) |
bool | deleteMsg (uint32 tsn) |
int32 | getNumBytes () |
SCTPDataVariables * | dequeueVarBySsn (uint16 ssn) |
Public Attributes | |
PayloadQueue | payloadQueue |
Protected Attributes | |
SCTPAssociation * | assoc |
typedef std::map<uint32, SCTPDataVariables *> SCTPQueue::PayloadQueue |
SCTPQueue::SCTPQueue | ( | ) |
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 }
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 | ( | ) |
Referenced by SCTPAssociation::dequeueAckedChunks(), SCTPReceiveStream::enqueueNewDataChunk(), SCTPAssociation::getOutboundDataChunk(), SCTPAssociation::getOutstandingBytesOnPath(), SCTPAssociation::process_RCV_Message(), SCTPAssociation::process_TIMEOUT_RTX(), SCTPAssociation::processSackArrived(), SCTPAssociation::pushUlp(), SCTPAssociation::putInDeliveryQ(), SCTPAssociation::sendAll(), and SCTPAssociation::stateEntered().
00064 { 00065 return payloadQueue.size(); 00066 }
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 }
SCTPAssociation* SCTPQueue::assoc [protected] |
Referenced by SCTPQueue().
Referenced by checkAndInsertVar(), SCTPAssociation::cwndUpdateAfterSack(), deleteMsg(), SCTPAssociation::dequeueAckedChunks(), dequeueVarBySsn(), extractMessage(), getAndExtractMessage(), getFirstVar(), getMsg(), getNextVar(), getNumBytes(), SCTPAssociation::getOutboundDataChunk(), SCTPAssociation::getOutstandingBytesOnPath(), getQueueSize(), getVar(), SCTPAssociation::peekAbandonedChunk(), SCTPAssociation::peekOutboundDataChunk(), SCTPAssociation::printOutstandingTsns(), printQueue(), SCTPAssociation::process_TIMEOUT_RTX(), SCTPAssociation::processSackArrived(), SCTPAssociation::pushUlp(), removeMsg(), and ~SCTPQueue().