INET Framework for OMNeT++/OMNEST
inet::ieee80211::ReceiveBuffer Class Reference

#include <ReceiveBuffer.h>

Public Types

typedef std::vector< Packet * > Fragments
 
typedef std::map< SequenceNumber, FragmentsReorderBuffer
 

Public Member Functions

 ReceiveBuffer (int bufferSize, SequenceNumberCyclic nextExpectedSequenceNumber)
 
virtual ~ReceiveBuffer ()
 
bool insertFrame (Packet *dataPacket, const Ptr< const Ieee80211DataHeader > &dataHeader)
 
void dropFramesUntil (SequenceNumberCyclic sequenceNumber)
 
void removeFrame (SequenceNumberCyclic sequenceNumber)
 
const ReorderBuffergetBuffer ()
 
int getLength ()
 
int getBufferSize ()
 
SequenceNumberCyclic getNextExpectedSequenceNumber ()
 
void setNextExpectedSequenceNumber (SequenceNumberCyclic nextExpectedSequenceNumber)
 
bool isFull ()
 

Protected Attributes

ReorderBuffer buffer
 
int bufferSize = -1
 
int length = 0
 
SequenceNumberCyclic nextExpectedSequenceNumber
 

Member Typedef Documentation

◆ Fragments

◆ ReorderBuffer

Constructor & Destructor Documentation

◆ ReceiveBuffer()

inet::ieee80211::ReceiveBuffer::ReceiveBuffer ( int  bufferSize,
SequenceNumberCyclic  nextExpectedSequenceNumber 
)

◆ ~ReceiveBuffer()

inet::ieee80211::ReceiveBuffer::~ReceiveBuffer ( )
virtual
81 {
82  for (auto fragments : buffer) {
83  for (auto fragment : fragments.second)
84  delete fragment;
85  }
86 }

Member Function Documentation

◆ dropFramesUntil()

void inet::ieee80211::ReceiveBuffer::dropFramesUntil ( SequenceNumberCyclic  sequenceNumber)
55 {
56  auto it = buffer.begin();
57  while (it != buffer.end()) {
58  if (SequenceNumberCyclic(it->first) < sequenceNumber) {
59  length -= it->second.size();
60  for (auto fragment : it->second)
61  delete fragment;
62  it = buffer.erase(it);
63  }
64  else
65  it++;
66  }
67 }

Referenced by inet::ieee80211::BlockAckReordering::passedUp().

◆ getBuffer()

◆ getBufferSize()

int inet::ieee80211::ReceiveBuffer::getBufferSize ( )
inline

◆ getLength()

int inet::ieee80211::ReceiveBuffer::getLength ( )
inline
42 { return length; }

◆ getNextExpectedSequenceNumber()

◆ insertFrame()

bool inet::ieee80211::ReceiveBuffer::insertFrame ( Packet dataPacket,
const Ptr< const Ieee80211DataHeader > &  dataHeader 
)
26 {
27  auto sequenceNumber = dataHeader->getSequenceNumber();
28  auto fragmentNumber = dataHeader->getFragmentNumber();
29  // The total number of MPDUs in these MSDUs may not
30  // exceed the reorder buffer size in the receiver.
31  if (length < bufferSize && nextExpectedSequenceNumber <= sequenceNumber && sequenceNumber < nextExpectedSequenceNumber + bufferSize) {
32  auto it = buffer.find(sequenceNumber.get());
33  if (it != buffer.end()) {
34  auto& fragments = it->second;
35  // TODO efficiency
36  for (auto fragment : fragments) {
37  const auto& fragmentHeader = fragment->peekAtFront<Ieee80211DataHeader>();
38  if (fragmentHeader->getSequenceNumber() == sequenceNumber && fragmentHeader->getFragmentNumber() == fragmentNumber)
39  return false;
40  }
41  fragments.push_back(dataPacket);
42  }
43  else {
44  buffer[sequenceNumber.get()].push_back(dataPacket);
45  }
46  // The total number of frames that can be sent depends on the total
47  // number of MPDUs in all the outstanding MSDUs.
48  length++;
49  return true;
50  }
51  return false;
52 }

Referenced by inet::ieee80211::BlockAckReordering::processReceivedQoSFrame().

◆ isFull()

bool inet::ieee80211::ReceiveBuffer::isFull ( )
inline

◆ removeFrame()

void inet::ieee80211::ReceiveBuffer::removeFrame ( SequenceNumberCyclic  sequenceNumber)
70 {
71  auto it = buffer.find(sequenceNumber.get());
72  if (it != buffer.end()) {
73  length -= it->second.size();
74  buffer.erase(sequenceNumber.get());
75  }
76  else
77  throw cRuntimeError("Unknown sequence number: %d", sequenceNumber.get());
78 }

Referenced by inet::ieee80211::BlockAckReordering::passedUp().

◆ setNextExpectedSequenceNumber()

void inet::ieee80211::ReceiveBuffer::setNextExpectedSequenceNumber ( SequenceNumberCyclic  nextExpectedSequenceNumber)
inline

Member Data Documentation

◆ buffer

ReorderBuffer inet::ieee80211::ReceiveBuffer::buffer
protected

◆ bufferSize

int inet::ieee80211::ReceiveBuffer::bufferSize = -1
protected

Referenced by insertFrame().

◆ length

int inet::ieee80211::ReceiveBuffer::length = 0
protected

◆ nextExpectedSequenceNumber

SequenceNumberCyclic inet::ieee80211::ReceiveBuffer::nextExpectedSequenceNumber
protected

Referenced by insertFrame().


The documentation for this class was generated from the following files:
inet::ieee80211::ReceiveBuffer::nextExpectedSequenceNumber
SequenceNumberCyclic nextExpectedSequenceNumber
Definition: ReceiveBuffer.h:31
inet::ieee80211::ReceiveBuffer::buffer
ReorderBuffer buffer
Definition: ReceiveBuffer.h:25
inet::ieee80211::ReceiveBuffer::bufferSize
int bufferSize
Definition: ReceiveBuffer.h:29
inet::ieee80211::ReceiveBuffer::length
int length
Definition: ReceiveBuffer.h:30