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 cPacket * extractBytesUpTo (uint32 seq)

Protected Types

typedef std::map< uint32,
cPacket * > 
PayloadList

Protected Attributes

PayloadList payloadList

Member Typedef Documentation

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


Constructor & Destructor Documentation

TCPMsgBasedRcvQueue::TCPMsgBasedRcvQueue (  ) 

Ctor.

00024                                          : TCPVirtualDataRcvQueue()
00025 {
00026 }

TCPMsgBasedRcvQueue::~TCPMsgBasedRcvQueue (  )  [virtual]

Virtual dtor.

00029 {
00030 }


Member Function Documentation

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 }


Member Data Documentation


The documentation for this class was generated from the following files:

Generated on Fri Mar 20 18:51:22 2009 for INET Framework for OMNeT++/OMNEST by  doxygen 1.5.5