Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

TCPMsgBasedRcvQueue Class Reference

#include <TCPMsgBasedRcvQueue.h>

Inheritance diagram for TCPMsgBasedRcvQueue:

TCPVirtualDataRcvQueue TCPReceiveQueue List of all members.

Detailed Description

FIXME

See also:
TCPMsgBasedSendQueue


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


Member Typedef Documentation

typedef std::map<uint32, cMessage *> TCPMsgBasedRcvQueue::PayloadList [protected]
 


Constructor & Destructor Documentation

TCPMsgBasedRcvQueue::TCPMsgBasedRcvQueue  ) 
 

Ctor.

00025                                          : TCPVirtualDataRcvQueue()
00026 {
00027 }

TCPMsgBasedRcvQueue::~TCPMsgBasedRcvQueue  )  [virtual]
 

Virtual dtor.

00030 {
00031 }


Member Function Documentation

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 }


Member Data Documentation

PayloadList TCPMsgBasedRcvQueue::payloadList [protected]
 


The documentation for this class was generated from the following files:
Generated on Thu Oct 19 18:22:31 2006 for INET Framework for OMNeT++/OMNEST by  doxygen 1.4.0