INET Framework for OMNeT++/OMNEST
inet::tcp::TCPVirtualDataRcvQueue Class Reference

Receive queue that manages "virtual bytes", that is, byte counts only. More...

#include <TCPVirtualDataRcvQueue.h>

Inheritance diagram for inet::tcp::TCPVirtualDataRcvQueue:
inet::tcp::TCPReceiveQueue inet::tcp::TCPByteStreamRcvQueue inet::tcp::TCPMsgBasedRcvQueue

Classes

class  Region
 

Public Member Functions

 TCPVirtualDataRcvQueue ()
 Ctor. More...
 
virtual ~TCPVirtualDataRcvQueue ()
 Virtual dtor. More...
 
virtual void init (uint32 startSeq) override
 Method inherited from TCPReceiveQueue. More...
 
virtual std::string info () const override
 Method inherited from TCPReceiveQueue. More...
 
virtual uint32 insertBytesFromSegment (TCPSegment *tcpseg) override
 Method inherited from TCPReceiveQueue. More...
 
virtual cPacket * extractBytesUpTo (uint32 seq) override
 Method inherited from TCPReceiveQueue. More...
 
virtual uint32 getAmountOfBufferedBytes () override
 Method inherited from TCPReceiveQueue. More...
 
virtual uint32 getAmountOfFreeBytes (uint32 maxRcvBuffer) override
 Method inherited from TCPReceiveQueue. More...
 
virtual uint32 getQueueLength () override
 Method inherited from TCPReceiveQueue. More...
 
virtual void getQueueStatus () override
 Method inherited from TCPReceiveQueue. More...
 
virtual uint32 getLE (uint32 fromSeqNum) override
 Method inherited from TCPReceiveQueue. More...
 
virtual uint32 getRE (uint32 toSeqNum) override
 Method inherited from TCPReceiveQueue. More...
 
virtual uint32 getFirstSeqNo () override
 Returns the minimum of first byte seq.no. More...
 
- Public Member Functions inherited from inet::tcp::TCPReceiveQueue
 TCPReceiveQueue ()
 Ctor. More...
 
virtual ~TCPReceiveQueue ()
 Virtual dtor. More...
 
virtual void setConnection (TCPConnection *_conn)
 Set the connection that owns this queue. More...
 

Protected Types

typedef std::list< Region * > RegionList
 

Protected Member Functions

void merge (TCPVirtualDataRcvQueue::Region *region)
 Merge segment byte range into regionList, the parameter region must created by 'new' operator. More...
 
TCPVirtualDataRcvQueue::RegionextractTo (uint32 toSeq)
 
virtual TCPVirtualDataRcvQueue::RegioncreateRegionFromSegment (TCPSegment *tcpseg)
 Create a new Region from tcpseg. More...
 

Protected Attributes

uint32 rcv_nxt = 0
 
RegionList regionList
 
- Protected Attributes inherited from inet::tcp::TCPReceiveQueue
TCPConnectionconn
 

Detailed Description

Receive queue that manages "virtual bytes", that is, byte counts only.

See also
TCPVirtualDataSendQueue

Member Typedef Documentation

typedef std::list<Region *> inet::tcp::TCPVirtualDataRcvQueue::RegionList
protected

Constructor & Destructor Documentation

inet::tcp::TCPVirtualDataRcvQueue::TCPVirtualDataRcvQueue ( )

Ctor.

79  :
81  rcv_nxt(-1)
82 {
83 }
uint32 rcv_nxt
Definition: TCPVirtualDataRcvQueue.h:41
TCPReceiveQueue()
Ctor.
Definition: TCPReceiveQueue.h:60
inet::tcp::TCPVirtualDataRcvQueue::~TCPVirtualDataRcvQueue ( )
virtual

Virtual dtor.

86 {
87  while (!regionList.empty()) {
88  delete regionList.front();
89  regionList.pop_front();
90  }
91 }
RegionList regionList
Definition: TCPVirtualDataRcvQueue.h:77

Member Function Documentation

TCPVirtualDataRcvQueue::Region * inet::tcp::TCPVirtualDataRcvQueue::createRegionFromSegment ( TCPSegment tcpseg)
protectedvirtual

Create a new Region from tcpseg.

Called from insertBytesFromSegment()

Reimplemented in inet::tcp::TCPByteStreamRcvQueue.

Referenced by insertBytesFromSegment().

118 {
119  Region *region = new Region(tcpseg->getSequenceNo(), tcpseg->getSequenceNo() + tcpseg->getPayloadLength());
120  return region;
121 }
cPacket * inet::tcp::TCPVirtualDataRcvQueue::extractBytesUpTo ( uint32  seq)
overridevirtual

Method inherited from TCPReceiveQueue.

Implements inet::tcp::TCPReceiveQueue.

Reimplemented in inet::tcp::TCPByteStreamRcvQueue, and inet::tcp::TCPMsgBasedRcvQueue.

177 {
178  cPacket *msg = nullptr;
179  Region *reg = extractTo(seq);
180 
181  if (reg) {
182  msg = new cPacket("data");
183  reg->copyTo(msg);
184  delete reg;
185  }
186  return msg;
187 }
TCPVirtualDataRcvQueue::Region * extractTo(uint32 toSeq)
Definition: TCPVirtualDataRcvQueue.cc:189
TCPVirtualDataRcvQueue::Region * inet::tcp::TCPVirtualDataRcvQueue::extractTo ( uint32  toSeq)
protected

Referenced by inet::tcp::TCPMsgBasedRcvQueue::extractBytesUpTo(), inet::tcp::TCPByteStreamRcvQueue::extractBytesUpTo(), and extractBytesUpTo().

190 {
191  ASSERT(seqLE(seq, rcv_nxt));
192 
193  if (regionList.empty())
194  return nullptr;
195 
196  Region *reg = regionList.front();
197  uint32 beg = reg->getBegin();
198 
199  if (seqLE(seq, beg))
200  return nullptr;
201 
202  if (seqGE(seq, reg->getEnd())) {
203  regionList.pop_front();
204  return reg;
205  }
206 
207  return reg->split(seq);
208 }
bool seqGE(uint32 a, uint32 b)
Definition: TCPSegment.h:35
RegionList regionList
Definition: TCPVirtualDataRcvQueue.h:77
bool seqLE(uint32 a, uint32 b)
Definition: TCPSegment.h:33
uint32 rcv_nxt
Definition: TCPVirtualDataRcvQueue.h:41
uint32_t uint32
Definition: Compat.h:30
uint32 inet::tcp::TCPVirtualDataRcvQueue::getAmountOfBufferedBytes ( )
overridevirtual

Method inherited from TCPReceiveQueue.

Implements inet::tcp::TCPReceiveQueue.

Referenced by getAmountOfFreeBytes().

211 {
212  uint32 bytes = 0;
213 
214  for (auto & elem : regionList)
215  bytes += (elem)->getLength();
216 
217  return bytes;
218 }
RegionList regionList
Definition: TCPVirtualDataRcvQueue.h:77
uint32_t uint32
Definition: Compat.h:30
uint32 inet::tcp::TCPVirtualDataRcvQueue::getAmountOfFreeBytes ( uint32  maxRcvBuffer)
overridevirtual

Method inherited from TCPReceiveQueue.

Implements inet::tcp::TCPReceiveQueue.

221 {
222  uint32 usedRcvBuffer = getAmountOfBufferedBytes();
223  uint32 freeRcvBuffer = maxRcvBuffer - usedRcvBuffer;
224  return (maxRcvBuffer > usedRcvBuffer) ? freeRcvBuffer : 0;
225 }
uint32_t uint32
Definition: Compat.h:30
virtual uint32 getAmountOfBufferedBytes() override
Method inherited from TCPReceiveQueue.
Definition: TCPVirtualDataRcvQueue.cc:210
uint32 inet::tcp::TCPVirtualDataRcvQueue::getFirstSeqNo ( )
overridevirtual

Returns the minimum of first byte seq.no.

in queue and rcv_nxt

Implements inet::tcp::TCPReceiveQueue.

270 {
271  if (regionList.empty())
272  return rcv_nxt;
273  return seqMin(regionList.front()->getBegin(), rcv_nxt);
274 }
uint32 seqMin(uint32 a, uint32 b)
Definition: TCPSegment.h:36
RegionList regionList
Definition: TCPVirtualDataRcvQueue.h:77
uint32 rcv_nxt
Definition: TCPVirtualDataRcvQueue.h:41
uint32 inet::tcp::TCPVirtualDataRcvQueue::getLE ( uint32  fromSeqNum)
overridevirtual

Method inherited from TCPReceiveQueue.

Implements inet::tcp::TCPReceiveQueue.

238 {
239  auto i = regionList.begin();
240 
241  while (i != regionList.end()) {
242  if (seqLE((*i)->getBegin(), fromSeqNum) && seqLess(fromSeqNum, (*i)->getEnd())) {
243 // tcpEV << "Enqueued region: [" << i->begin << ".." << i->end << ")\n";
244  return (*i)->getBegin();
245  }
246 
247  i++;
248  }
249 
250  return fromSeqNum;
251 }
RegionList regionList
Definition: TCPVirtualDataRcvQueue.h:77
bool seqLess(uint32 a, uint32 b)
Definition: TCPSegment.h:32
bool seqLE(uint32 a, uint32 b)
Definition: TCPSegment.h:33
uint32 inet::tcp::TCPVirtualDataRcvQueue::getQueueLength ( )
overridevirtual

Method inherited from TCPReceiveQueue.

Implements inet::tcp::TCPReceiveQueue.

228 {
229  return regionList.size();
230 }
RegionList regionList
Definition: TCPVirtualDataRcvQueue.h:77
void inet::tcp::TCPVirtualDataRcvQueue::getQueueStatus ( )
overridevirtual

Method inherited from TCPReceiveQueue.

Implements inet::tcp::TCPReceiveQueue.

233 {
234  EV_DEBUG << "receiveQLength=" << regionList.size() << " " << info() << "\n";
235 }
RegionList regionList
Definition: TCPVirtualDataRcvQueue.h:77
virtual std::string info() const override
Method inherited from TCPReceiveQueue.
Definition: TCPVirtualDataRcvQueue.cc:103
uint32 inet::tcp::TCPVirtualDataRcvQueue::getRE ( uint32  toSeqNum)
overridevirtual

Method inherited from TCPReceiveQueue.

Implements inet::tcp::TCPReceiveQueue.

254 {
255  auto i = regionList.begin();
256 
257  while (i != regionList.end()) {
258  if (seqLess((*i)->getBegin(), toSeqNum) && seqLE(toSeqNum, (*i)->getEnd())) {
259 // tcpEV << "Enqueued region: [" << i->begin << ".." << i->end << ")\n";
260  return (*i)->getEnd();
261  }
262 
263  i++;
264  }
265 
266  return toSeqNum;
267 }
RegionList regionList
Definition: TCPVirtualDataRcvQueue.h:77
bool seqLess(uint32 a, uint32 b)
Definition: TCPSegment.h:32
bool seqLE(uint32 a, uint32 b)
Definition: TCPSegment.h:33
std::string inet::tcp::TCPVirtualDataRcvQueue::info ( ) const
overridevirtual

Method inherited from TCPReceiveQueue.

Reimplemented in inet::tcp::TCPByteStreamRcvQueue, and inet::tcp::TCPMsgBasedRcvQueue.

Referenced by getQueueStatus(), and insertBytesFromSegment().

104 {
105  std::string res;
106  char buf[32];
107  sprintf(buf, "rcv_nxt=%u", rcv_nxt);
108  res = buf;
109 
110  for (const auto & elem : regionList) {
111  sprintf(buf, " [%u..%u)", (elem)->getBegin(), (elem)->getEnd());
112  res += buf;
113  }
114  return res;
115 }
RegionList regionList
Definition: TCPVirtualDataRcvQueue.h:77
uint32 rcv_nxt
Definition: TCPVirtualDataRcvQueue.h:41
void inet::tcp::TCPVirtualDataRcvQueue::init ( uint32  startSeq)
overridevirtual

Method inherited from TCPReceiveQueue.

Implements inet::tcp::TCPReceiveQueue.

Reimplemented in inet::tcp::TCPMsgBasedRcvQueue.

Referenced by inet::tcp::TCPMsgBasedRcvQueue::init().

94 {
95  rcv_nxt = startSeq;
96 
97  while (!regionList.empty()) {
98  delete regionList.front();
99  regionList.pop_front();
100  }
101 }
RegionList regionList
Definition: TCPVirtualDataRcvQueue.h:77
uint32 rcv_nxt
Definition: TCPVirtualDataRcvQueue.h:41
uint32 inet::tcp::TCPVirtualDataRcvQueue::insertBytesFromSegment ( TCPSegment tcpseg)
overridevirtual

Method inherited from TCPReceiveQueue.

Implements inet::tcp::TCPReceiveQueue.

Reimplemented in inet::tcp::TCPMsgBasedRcvQueue.

Referenced by inet::tcp::TCPMsgBasedRcvQueue::insertBytesFromSegment().

124 {
125  Region *region = createRegionFromSegment(tcpseg);
126 
127 #ifndef NDEBUG
128  if (!regionList.empty()) {
129  uint32 ob = regionList.front()->getBegin();
130  uint32 oe = regionList.back()->getEnd();
131  uint32 nb = region->getBegin();
132  uint32 ne = region->getEnd();
133  uint32 minb = seqMin(ob, nb);
134  uint32 maxe = seqMax(oe, ne);
135  if (seqGE(minb, oe) || seqGE(minb, ne) || seqGE(ob, maxe) || seqGE(nb, maxe))
136  throw cRuntimeError("The new segment is [%u, %u) out of the acceptable range at the queue %s",
137  region->getBegin(), region->getEnd(), info().c_str());
138  }
139 #endif // ifndef NDEBUG
140 
141  merge(region);
142 
143  if (seqGE(rcv_nxt, regionList.front()->getBegin()))
144  rcv_nxt = regionList.front()->getEnd();
145 
146  return rcv_nxt;
147 }
bool seqGE(uint32 a, uint32 b)
Definition: TCPSegment.h:35
virtual TCPVirtualDataRcvQueue::Region * createRegionFromSegment(TCPSegment *tcpseg)
Create a new Region from tcpseg.
Definition: TCPVirtualDataRcvQueue.cc:117
uint32 seqMin(uint32 a, uint32 b)
Definition: TCPSegment.h:36
RegionList regionList
Definition: TCPVirtualDataRcvQueue.h:77
virtual std::string info() const override
Method inherited from TCPReceiveQueue.
Definition: TCPVirtualDataRcvQueue.cc:103
uint32 rcv_nxt
Definition: TCPVirtualDataRcvQueue.h:41
uint32_t uint32
Definition: Compat.h:30
void merge(TCPVirtualDataRcvQueue::Region *region)
Merge segment byte range into regionList, the parameter region must created by &#39;new&#39; operator...
Definition: TCPVirtualDataRcvQueue.cc:149
uint32 seqMax(uint32 a, uint32 b)
Definition: TCPSegment.h:37
void inet::tcp::TCPVirtualDataRcvQueue::merge ( TCPVirtualDataRcvQueue::Region region)
protected

Merge segment byte range into regionList, the parameter region must created by 'new' operator.

Referenced by insertBytesFromSegment().

150 {
151  // Here we have to update our existing regions with the octet range
152  // tcpseg represents. We either have to insert tcpseg as a separate region
153  // somewhere, or (if it overlaps with an existing region) extend
154  // existing regions; we also may have to merge existing regions if
155  // they become overlapping (or touching) after adding tcpseg.
156 
157  RegionList::reverse_iterator i = regionList.rbegin();
159 
160  while (i != regionList.rend() && Region::BEFORE != (cmp = (*i)->compare(*seg))) {
161  if (cmp != Region::AFTER) {
162  if (seg->merge(*i)) {
163  delete *i;
164  i = (RegionList::reverse_iterator)(regionList.erase((++i).base()));
165  continue;
166  }
167  else
168  throw cRuntimeError("Model error: merge of region [%u,%u) with [%u,%u) unsuccessful", (*i)->getBegin(), (*i)->getEnd(), seg->getBegin(), seg->getEnd());
169  }
170  ++i;
171  }
172 
173  regionList.insert(i.base(), seg);
174 }
RegionList regionList
Definition: TCPVirtualDataRcvQueue.h:77
Definition: TCPVirtualDataRcvQueue.h:50
CompareStatus
Definition: TCPVirtualDataRcvQueue.h:50
Definition: TCPVirtualDataRcvQueue.h:50

Member Data Documentation


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