#include <TCPMsgBasedRcvQueue.h>
Public Member Functions | |
TCPMsgBasedRcvQueue () | |
virtual | ~TCPMsgBasedRcvQueue () |
virtual void | init (uint32 startSeq) |
virtual std::string | info () const |
virtual uint32 | insertBytesFromSegment (TCPSegment *tcpseg) |
virtual cPacket * | extractBytesUpTo (uint32 seq) |
Protected Types | |
typedef std::map< uint32, cPacket * > | PayloadList |
Protected Attributes | |
PayloadList | payloadList |
typedef std::map<uint32, cPacket *> TCPMsgBasedRcvQueue::PayloadList [protected] |
TCPMsgBasedRcvQueue::TCPMsgBasedRcvQueue | ( | ) |
void TCPMsgBasedRcvQueue::init | ( | uint32 | startSeq | ) | [virtual] |
Set initial receive sequence number.
Reimplemented from TCPVirtualDataRcvQueue.
00033 { 00034 TCPVirtualDataRcvQueue::init(startSeq); 00035 }
std::string TCPMsgBasedRcvQueue::info | ( | ) | const [virtual] |
Returns a string with region stored.
Reimplemented from TCPVirtualDataRcvQueue.
00038 { 00039 std::string res; 00040 char buf[32]; 00041 sprintf(buf, "rcv_nxt=%u ", rcv_nxt); 00042 res = buf; 00043 00044 for (RegionList::const_iterator i=regionList.begin(); i!=regionList.end(); ++i) 00045 { 00046 sprintf(buf, "[%u..%u) ", i->begin, i->end); 00047 res+=buf; 00048 } 00049 sprintf(buf, "%u msgs", payloadList.size()); 00050 res+=buf; 00051 00052 return res; 00053 }
uint32 TCPMsgBasedRcvQueue::insertBytesFromSegment | ( | TCPSegment * | tcpseg | ) | [virtual] |
Called when a TCP segment arrives. Returns sequence number for ACK.
Reimplemented from TCPVirtualDataRcvQueue.
00056 { 00057 TCPVirtualDataRcvQueue::insertBytesFromSegment(tcpseg); 00058 00059 cPacket *msg; 00060 uint32 endSeqNo; 00061 while ((msg=tcpseg->removeFirstPayloadMessage(endSeqNo))!=NULL) 00062 { 00063 // insert, avoiding duplicates 00064 PayloadList::iterator i = payloadList.find(endSeqNo); 00065 if (i!=payloadList.end()) {delete msg; continue;} 00066 payloadList[endSeqNo] = msg; 00067 } 00068 00069 return rcv_nxt; 00070 }
cPacket * TCPMsgBasedRcvQueue::extractBytesUpTo | ( | uint32 | seq | ) | [virtual] |
Should create a packet to be passed up to the app, up to (but NOT including) the given sequence no (usually rcv_nxt). It should return NULL if there's no more data to be passed up -- this method is called several times until it returns NULL.
Reimplemented from TCPVirtualDataRcvQueue.
00073 { 00074 extractTo(seq); 00075 00076 // pass up payload messages, in sequence number order 00077 if (payloadList.empty() || seqGreater(payloadList.begin()->first, seq)) 00078 return NULL; 00079 00080 cPacket *msg = payloadList.begin()->second; 00081 payloadList.erase(payloadList.begin()); 00082 return msg; 00083 }
PayloadList TCPMsgBasedRcvQueue::payloadList [protected] |
Referenced by extractBytesUpTo(), info(), and insertBytesFromSegment().