#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 |
|
|
|
|
|
Ctor. 00025 : TCPVirtualDataRcvQueue() 00026 { 00027 }
|
|
|
Virtual dtor. 00030 {
00031 }
|
|
|
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 }
|
|
|
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 }
|
|
|
Set initial receive sequence number. Reimplemented from TCPVirtualDataRcvQueue. 00034 {
00035 TCPVirtualDataRcvQueue::init(startSeq);
00036 }
|
|
|
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 }
|
|
|
|
1.4.1