#include <TCPMsgBasedRcvQueue.h>
Inheritance diagram for TCPMsgBasedRcvQueue:
Public Member Functions | |
TCPMsgBasedRcvQueue () | |
virtual | ~TCPMsgBasedRcvQueue () |
virtual void | init (uint32 startSeq) |
virtual std::string | info () const |
virtual uint32 | insertBytesFromSegment (TCPSegment *tcpseg) |
virtual cMessage * | extractBytesUpTo (uint32 seq) |
Protected Types | |
typedef std::map< uint32, cMessage * > | PayloadList |
Protected Attributes | |
PayloadList | payloadList |
typedef std::map<uint32, cMessage *> TCPMsgBasedRcvQueue::PayloadList [protected] |
TCPMsgBasedRcvQueue::TCPMsgBasedRcvQueue | ( | ) |
cMessage * 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.
00074 { 00075 extractTo(seq); 00076 00077 // pass up payload messages, in sequence number order 00078 if (payloadList.empty() || seqGreater(payloadList.begin()->first, seq)) 00079 return NULL; 00080 00081 cMessage *msg = payloadList.begin()->second; 00082 payloadList.erase(payloadList.begin()); 00083 return msg; 00084 }
std::string TCPMsgBasedRcvQueue::info | ( | ) | const [virtual] |
Returns a string with region stored.
Reimplemented from TCPVirtualDataRcvQueue.
00039 { 00040 std::string res; 00041 char buf[32]; 00042 sprintf(buf, "rcv_nxt=%u ", rcv_nxt); 00043 res = buf; 00044 00045 for (RegionList::const_iterator i=regionList.begin(); i!=regionList.end(); ++i) 00046 { 00047 sprintf(buf, "[%u..%u) ", i->begin, i->end); 00048 res+=buf; 00049 } 00050 sprintf(buf, "%u msgs", payloadList.size()); 00051 res+=buf; 00052 00053 return res; 00054 }
void TCPMsgBasedRcvQueue::init | ( | uint32 | startSeq | ) | [virtual] |
Set initial receive sequence number.
Reimplemented from TCPVirtualDataRcvQueue.
00034 { 00035 TCPVirtualDataRcvQueue::init(startSeq); 00036 }
uint32 TCPMsgBasedRcvQueue::insertBytesFromSegment | ( | TCPSegment * | tcpseg | ) | [virtual] |
Called when a TCP segment arrives. Returns sequence number for ACK.
Reimplemented from TCPVirtualDataRcvQueue.
00057 { 00058 TCPVirtualDataRcvQueue::insertBytesFromSegment(tcpseg); 00059 00060 cMessage *msg; 00061 uint32 endSeqNo; 00062 while ((msg=tcpseg->removeFirstPayloadMessage(endSeqNo))!=NULL) 00063 { 00064 // insert, avoiding duplicates 00065 PayloadList::iterator i = payloadList.find(endSeqNo); 00066 if (i!=payloadList.end()) {delete msg; continue;} 00067 payloadList[endSeqNo] = msg; 00068 } 00069 00070 return rcv_nxt; 00071 }
PayloadList TCPMsgBasedRcvQueue::payloadList [protected] |