INET Framework for OMNeT++/OMNEST
inet::sctp::SctpQueue Class Reference

Abstract base class for SCTP receive queues. More...

#include <SctpQueue.h>

Inheritance diagram for inet::sctp::SctpQueue:

Public Types

typedef std::map< uint32_t, SctpDataVariables * > PayloadQueue
 

Public Member Functions

 SctpQueue ()
 Constructor. More...
 
 SctpQueue (SctpAssociation *assoc)
 
 ~SctpQueue ()
 Virtual destructor. More...
 
bool checkAndInsertChunk (const uint32_t key, SctpDataVariables *chunk)
 
SctpDataVariablesgetAndExtractChunk (const uint32_t tsn)
 
SctpDataVariablesextractMessage ()
 
void printQueue () const
 
uint32_t getQueueSize () const
 
SctpDataVariablesgetFirstChunk () const
 
cMessage * getMsg (const uint32_t key) const
 
SctpDataVariablesgetChunk (const uint32_t key) const
 
SctpDataVariablesgetChunkFast (const uint32_t tsn, bool &firstTime)
 
void removeMsg (const uint32_t key)
 
bool deleteMsg (const uint32_t tsn)
 
int32_t getNumBytes () const
 
SctpDataVariablesdequeueChunkBySSN (const uint16_t ssn)
 
uint32_t getSizeOfFirstChunk (const L3Address &remoteAddress)
 
uint16_t getFirstSsnInQueue (const uint16_t sid)
 
void findEarliestOutstandingTsnsForPath (const L3Address &remoteAddress, uint32_t &earliestOutstandingTsn, uint32_t &rtxEarliestOutstandingTsn) const
 

Public Attributes

PayloadQueue payloadQueue
 

Protected Attributes

SctpAssociationassoc
 

Private Attributes

PayloadQueue::iterator GetChunkFastIterator
 

Detailed Description

Abstract base class for SCTP receive queues.

This class represents data received by SCTP but not yet passed up to the application. The class also accomodates for selective retransmission, i.e. also acts as a segment buffer.

This class goes hand-in-hand with SctpSendQueue.

This class is polymorphic because depending on where and how you use the SCTP model you might have different ideas about "sending data" on a simulated connection: you might want to transmit real bytes, "dummy" (byte count only), cMessage objects, etc; see discussion at SctpSendQueue. Different subclasses can be written to accomodate different needs.

See also
SctpSendQueue

Member Typedef Documentation

◆ PayloadQueue

Constructor & Destructor Documentation

◆ SctpQueue() [1/2]

inet::sctp::SctpQueue::SctpQueue ( )

Constructor.

19 {
20  assoc = nullptr;
21 }

◆ SctpQueue() [2/2]

inet::sctp::SctpQueue::SctpQueue ( SctpAssociation assoc)
24 {
25  assoc = assoc_;
26 }

◆ ~SctpQueue()

inet::sctp::SctpQueue::~SctpQueue ( )

Virtual destructor.

29 {
30  for (auto& elem : payloadQueue) {
31  SctpDataVariables *chunk = elem.second;
32  delete chunk->userData;
33  }
34  if (!payloadQueue.empty()) {
35  payloadQueue.clear();
36  }
37 }

Member Function Documentation

◆ checkAndInsertChunk()

bool inet::sctp::SctpQueue::checkAndInsertChunk ( const uint32_t  key,
SctpDataVariables chunk 
)

◆ deleteMsg()

bool inet::sctp::SctpQueue::deleteMsg ( const uint32_t  tsn)
152 {
153  auto iterator = payloadQueue.find(tsn);
154  if (iterator != payloadQueue.end()) {
155  SctpDataVariables *chunk = iterator->second;
156  cMessage *msg = check_and_cast<cMessage *>(chunk->userData);
157  delete msg;
158  payloadQueue.erase(iterator);
159  return true;
160  }
161  return false;
162 }

Referenced by inet::sctp::SctpAssociation::makeRoomForTsn().

◆ dequeueChunkBySSN()

SctpDataVariables * inet::sctp::SctpQueue::dequeueChunkBySSN ( const uint16_t  ssn)
174 {
175  for (auto iterator = payloadQueue.begin();
176  iterator != payloadQueue.end(); iterator++)
177  {
178  SctpDataVariables *chunk = iterator->second;
179  if ((iterator->second->ssn == ssn) &&
180  (iterator->second->bbit) &&
181  (iterator->second->ebit))
182  {
183  payloadQueue.erase(iterator);
184  return chunk;
185  }
186  }
187  return nullptr;
188 }

Referenced by inet::sctp::SctpReceiveStream::enqueueNewDataChunk(), and inet::sctp::SctpAssociation::putInDeliveryQ().

◆ extractMessage()

SctpDataVariables * inet::sctp::SctpQueue::extractMessage ( )
55 {
56  if (!payloadQueue.empty()) {
57  auto iterator = payloadQueue.begin();
58  SctpDataVariables *chunk = iterator->second;
59  payloadQueue.erase(iterator);
60  return chunk;
61  }
62  return nullptr;
63 }

Referenced by inet::sctp::SctpAssociation::pushUlp().

◆ findEarliestOutstandingTsnsForPath()

void inet::sctp::SctpQueue::findEarliestOutstandingTsnsForPath ( const L3Address remoteAddress,
uint32_t &  earliestOutstandingTsn,
uint32_t &  rtxEarliestOutstandingTsn 
) const
198 {
199  bool findEarliestOutstandingTsn = true;
200  bool findRTXEarliestOutstandingTsn = true;
201 
202  for (const auto& elem : payloadQueue) {
203  const SctpDataVariables *chunk = elem.second;
204  if (chunk->getLastDestination() == remoteAddress) {
205  // ====== Find earliest outstanding TSNs ===========================
206  if (chunk->hasBeenAcked == false) {
207  if ((findEarliestOutstandingTsn) &&
208  (chunk->numberOfRetransmissions == 0))
209  {
210  earliestOutstandingTsn = chunk->tsn;
211  }
212  findEarliestOutstandingTsn = false;
213  if ((findRTXEarliestOutstandingTsn) &&
214  (chunk->numberOfRetransmissions > 0))
215  {
216  rtxEarliestOutstandingTsn = chunk->tsn;
217  }
218  findRTXEarliestOutstandingTsn = false;
219  }
220  }
221  }
222 }

Referenced by inet::sctp::SctpAssociation::checkPseudoCumAck().

◆ getAndExtractChunk()

SctpDataVariables * inet::sctp::SctpQueue::getAndExtractChunk ( const uint32_t  tsn)
66 {
67  if (!payloadQueue.empty()) {
68  auto iterator = payloadQueue.find(tsn);
69  SctpDataVariables *chunk = iterator->second;
70  payloadQueue.erase(iterator);
71  return chunk;
72  }
73  return nullptr;
74 }

Referenced by inet::sctp::SctpReceiveStream::enqueueNewDataChunk(), inet::sctp::SctpAssociation::nonRenegablyAckChunk(), and inet::sctp::SctpReceiveStream::reassemble().

◆ getChunk()

SctpDataVariables * inet::sctp::SctpQueue::getChunk ( const uint32_t  key) const

◆ getChunkFast()

SctpDataVariables * inet::sctp::SctpQueue::getChunkFast ( const uint32_t  tsn,
bool &  firstTime 
)
122 {
123  if (!firstTime) {
124  if (GetChunkFastIterator != payloadQueue.end()) {
125  SctpDataVariables *chunk = GetChunkFastIterator->second;
126  if (chunk->tsn == tsn) {
128  return chunk; // Found the right TSN!
129  }
130  }
131  // TSN not found -> needs regular TSN lookup.
132  }
133 
135  if (GetChunkFastIterator != payloadQueue.end()) {
136  SctpDataVariables *chunk = GetChunkFastIterator->second;
138  firstTime = false;
139  return chunk;
140  }
141 
142  return nullptr;
143 }

Referenced by inet::sctp::SctpAssociation::processSackArrived().

◆ getFirstChunk()

SctpDataVariables * inet::sctp::SctpQueue::getFirstChunk ( ) const
94 {
95  PayloadQueue::const_iterator iterator = payloadQueue.begin();
96  SctpDataVariables *chunk = iterator->second;
97  return chunk;
98 }

◆ getFirstSsnInQueue()

uint16_t inet::sctp::SctpQueue::getFirstSsnInQueue ( const uint16_t  sid)
191 {
192  return payloadQueue.begin()->second->ssn;
193 }

Referenced by inet::sctp::SctpAssociation::processForwardTsnArrived().

◆ getMsg()

cMessage * inet::sctp::SctpQueue::getMsg ( const uint32_t  key) const
101 {
102  PayloadQueue::const_iterator iterator = payloadQueue.find(tsn);
103  if (iterator != payloadQueue.end()) {
104  SctpDataVariables *chunk = iterator->second;
105  cMessage *msg = check_and_cast<cMessage *>(chunk->userData);
106  return msg;
107  }
108  return nullptr;
109 }

◆ getNumBytes()

int32_t inet::sctp::SctpQueue::getNumBytes ( ) const
165 {
166  int32_t qb = 0;
167  for (const auto& elem : payloadQueue) {
168  qb += (elem.second->len / 8);
169  }
170  return qb;
171 }

◆ getQueueSize()

◆ getSizeOfFirstChunk()

uint32_t inet::sctp::SctpQueue::getSizeOfFirstChunk ( const L3Address remoteAddress)
225 {
226  for (PayloadQueue::const_iterator iterator = payloadQueue.begin();
227  iterator != payloadQueue.end(); ++iterator)
228  {
229  const SctpDataVariables *chunk = iterator->second;
230  if (chunk->getNextDestination() == remoteAddress) {
231  return chunk->booksize;
232  }
233  }
234  return 0;
235 }

Referenced by inet::sctp::SctpAssociation::sendOnPath().

◆ printQueue()

void inet::sctp::SctpQueue::printQueue ( ) const
77 {
78  EV_DEBUG << "Queue contents:\n";
79  for (const auto& elem : payloadQueue) {
80  const uint32_t key = elem.first;
81  const SctpDataVariables *chunk = elem.second;
82  EV_DEBUG << key << ":\t"
83  << "lastDestination=" << chunk->getLastDestination()
84  << " nextDestination=" << chunk->getNextDestination()
85  << " hasBeenAcked=" << chunk->hasBeenAcked
86  << " countsAsOutstanding=" << chunk->countsAsOutstanding
87  << " numberOfRetransmissions=" << chunk->numberOfRetransmissions
88  << endl;
89  }
90  EV_DEBUG << endl;
91 }

◆ removeMsg()

void inet::sctp::SctpQueue::removeMsg ( const uint32_t  key)
146 {
147  auto iterator = payloadQueue.find(tsn);
148  payloadQueue.erase(iterator);
149 }

Referenced by inet::sctp::SctpAssociation::nonRenegablyAckChunk(), and inet::sctp::SctpAssociation::renegablyAckChunk().

Member Data Documentation

◆ assoc

SctpAssociation* inet::sctp::SctpQueue::assoc
protected

Referenced by SctpQueue().

◆ GetChunkFastIterator

PayloadQueue::iterator inet::sctp::SctpQueue::GetChunkFastIterator
private

Referenced by getChunkFast().

◆ payloadQueue


The documentation for this class was generated from the following files:
inet::sctp::SctpQueue::payloadQueue
PayloadQueue payloadQueue
Definition: SctpQueue.h:88
inet::sctp::SctpQueue::GetChunkFastIterator
PayloadQueue::iterator GetChunkFastIterator
Definition: SctpQueue.h:94
inet::sctp::SctpQueue::assoc
SctpAssociation * assoc
Definition: SctpQueue.h:91