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

#include <RecipientQosMacDataService.h>

Inheritance diagram for inet::ieee80211::RecipientQosMacDataService:
inet::ieee80211::IRecipientQosMacDataService

Public Member Functions

virtual std::vector< Packet * > dataFrameReceived (Packet *dataPacket, const Ptr< const Ieee80211DataHeader > &dataHeader, IRecipientBlockAckAgreementHandler *blockAckAgreementHandler) override
 
virtual std::vector< Packet * > controlFrameReceived (Packet *controlPacket, const Ptr< const Ieee80211MacHeader > &controlHeader, IRecipientBlockAckAgreementHandler *blockAckAgreementHandler) override
 
virtual std::vector< Packet * > managementFrameReceived (Packet *mgmtPacket, const Ptr< const Ieee80211MgmtHeader > &mgmtHeader) override
 
- Public Member Functions inherited from inet::ieee80211::IRecipientQosMacDataService
virtual ~IRecipientQosMacDataService ()
 

Protected Member Functions

virtual ~RecipientQosMacDataService ()
 
virtual void initialize () override
 
virtual Packetdefragment (std::vector< Packet * > completeFragments)
 
virtual Packetdefragment (Packet *mgmtFragment)
 

Protected Attributes

IReassemblybasicReassembly = nullptr
 
IMpduDeaggregationaMpduDeaggregation = nullptr
 
IDuplicateRemovalduplicateRemoval = nullptr
 
BlockAckReorderingblockAckReordering = nullptr
 
IDefragmentationdefragmentation = nullptr
 
IMsduDeaggregationaMsduDeaggregation = nullptr
 

Additional Inherited Members

- Static Public Attributes inherited from inet::ieee80211::IRecipientQosMacDataService
static simsignal_t packetDefragmentedSignal = cComponent::registerSignal("packetDefragmented")
 
static simsignal_t packetDeaggregatedSignal = cComponent::registerSignal("packetDeaggregated")
 

Constructor & Destructor Documentation

◆ ~RecipientQosMacDataService()

inet::ieee80211::RecipientQosMacDataService::~RecipientQosMacDataService ( )
protectedvirtual
189 {
190  delete duplicateRemoval;
191  delete basicReassembly;
192  delete aMsduDeaggregation;
193  delete aMpduDeaggregation;
194  delete blockAckReordering;
195 }

Member Function Documentation

◆ controlFrameReceived()

std::vector< Packet * > inet::ieee80211::RecipientQosMacDataService::controlFrameReceived ( Packet controlPacket,
const Ptr< const Ieee80211MacHeader > &  controlHeader,
IRecipientBlockAckAgreementHandler blockAckAgreementHandler 
)
overridevirtual

Implements inet::ieee80211::IRecipientQosMacDataService.

137 {
138  Enter_Method("controlFrameReceived");
139  if (auto blockAckReq = dynamicPtrCast<const Ieee80211BasicBlockAckReq>(controlHeader)) {
141  if (blockAckReordering) {
142  Tid tid = blockAckReq->getTidInfo();
143  MacAddress originatorAddr = blockAckReq->getTransmitterAddress();
144  RecipientBlockAckAgreement *agreement = blockAckAgreementHandler->getAgreement(tid, originatorAddr);
145  if (agreement)
146  frames = blockAckReordering->processReceivedBlockAckReq(agreement, blockAckReq);
147  else
148  return std::vector<Packet *>();
149  }
150  std::vector<Packet *> defragmentedFrames;
151  if (basicReassembly) { // FIXME defragmentation
152  for (auto it : frames) {
153  auto fragments = it.second;
154  defragmentedFrames.push_back(defragment(fragments));
155  }
156  }
157  else {
158  for (auto it : frames) {
159  auto fragments = it.second;
160  if (fragments.size() == 1) {
161  defragmentedFrames.push_back(fragments.at(0));
162  }
163  else {
164  // TODO drop?
165  }
166  }
167  }
168  std::vector<Packet *> deaggregatedFrames;
169  if (aMsduDeaggregation) {
170  for (auto frame : defragmentedFrames) {
171  if (frame->peekAtFront<Ieee80211DataHeader>()->getAMsduPresent()) {
172  emit(packetDeaggregatedSignal, frame);
173  auto subframes = aMsduDeaggregation->deaggregateFrame(frame);
174  for (auto subframe : *subframes)
175  deaggregatedFrames.push_back(subframe);
176  delete subframes;
177  }
178  else
179  deaggregatedFrames.push_back(frame);
180  }
181  }
182  // TODO MSDU Integrity, Replay Detection, RX MSDU Rate Limiting
183  return deaggregatedFrames;
184  }
185  return std::vector<Packet *>();
186 }

◆ dataFrameReceived()

std::vector< Packet * > inet::ieee80211::RecipientQosMacDataService::dataFrameReceived ( Packet dataPacket,
const Ptr< const Ieee80211DataHeader > &  dataHeader,
IRecipientBlockAckAgreementHandler blockAckAgreementHandler 
)
overridevirtual

Implements inet::ieee80211::IRecipientQosMacDataService.

57 {
58  Enter_Method("dataFrameReceived");
59  take(dataPacket);
60  // TODO A-MPDU Deaggregation, MPDU Header+CRC Validation, Address1 Filtering, Duplicate Removal, MPDU Decryption
61  if (duplicateRemoval && duplicateRemoval->isDuplicate(dataHeader)) {
62  EV_WARN << "Dropping duplicate packet " << *dataPacket << ".\n";
63  PacketDropDetails details;
64  details.setReason(DUPLICATE_DETECTED);
65  emit(packetDroppedSignal, dataPacket, &details);
66  delete dataPacket;
67  return std::vector<Packet *>();
68  }
70  frames[dataHeader->getSequenceNumber().get()].push_back(dataPacket);
71  if (blockAckReordering && blockAckAgreementHandler) {
72  Tid tid = dataHeader->getTid();
73  MacAddress originatorAddr = dataHeader->getTransmitterAddress();
74  RecipientBlockAckAgreement *agreement = blockAckAgreementHandler->getAgreement(tid, originatorAddr);
75  if (agreement)
76  frames = blockAckReordering->processReceivedQoSFrame(agreement, dataPacket, dataHeader);
77  }
78  std::vector<Packet *> defragmentedFrames;
79  if (basicReassembly) { // FIXME defragmentation
80  for (auto it : frames) {
81  auto fragments = it.second;
82  Packet *frame = defragment(fragments);
83  // TODO revise
84  if (frame)
85  defragmentedFrames.push_back(frame);
86  }
87  }
88  else {
89  for (auto it : frames) {
90  auto fragments = it.second;
91  if (fragments.size() == 1)
92  defragmentedFrames.push_back(fragments.at(0));
93  else ; // TODO drop?
94  }
95  }
96  std::vector<Packet *> deaggregatedFrames;
97  if (aMsduDeaggregation) {
98  for (auto defragmentedFrame : defragmentedFrames) {
99  auto defragmentedHeader = defragmentedFrame->peekAtFront<Ieee80211DataHeader>();
100  if (defragmentedHeader->getAMsduPresent()) {
101  emit(packetDeaggregatedSignal, defragmentedFrame);
102  auto subframes = aMsduDeaggregation->deaggregateFrame(defragmentedFrame);
103  for (auto subframe : *subframes)
104  deaggregatedFrames.push_back(subframe);
105  delete subframes;
106  }
107  else
108  deaggregatedFrames.push_back(defragmentedFrame);
109  }
110  }
111  // TODO MSDU Integrity, Replay Detection, RX MSDU Rate Limiting
112  return deaggregatedFrames;
113 }

◆ defragment() [1/2]

Packet * inet::ieee80211::RecipientQosMacDataService::defragment ( Packet mgmtFragment)
protectedvirtual
46 {
47  auto packet = basicReassembly->addFragment(mgmtFragment);
48  if (packet && packet->hasAtFront<Ieee80211DataOrMgmtHeader>()) {
49  emit(packetDefragmentedSignal, packet);
50  return packet;
51  }
52  else
53  return nullptr;
54 }

◆ defragment() [2/2]

Packet * inet::ieee80211::RecipientQosMacDataService::defragment ( std::vector< Packet * >  completeFragments)
protectedvirtual
34 {
35  for (auto fragment : completeFragments) {
36  auto packet = basicReassembly->addFragment(fragment);
37  if (packet != nullptr) {
38  emit(packetDefragmentedSignal, packet);
39  return packet;
40  }
41  }
42  return nullptr;
43 }

Referenced by controlFrameReceived(), dataFrameReceived(), and managementFrameReceived().

◆ initialize()

void inet::ieee80211::RecipientQosMacDataService::initialize ( )
overrideprotectedvirtual
25 {
26  duplicateRemoval = new QoSDuplicateRemoval();
27  basicReassembly = new BasicReassembly();
28  aMsduDeaggregation = new MsduDeaggregation();
29  aMpduDeaggregation = new MpduDeaggregation();
30  blockAckReordering = new BlockAckReordering();
31 }

◆ managementFrameReceived()

std::vector< Packet * > inet::ieee80211::RecipientQosMacDataService::managementFrameReceived ( Packet mgmtPacket,
const Ptr< const Ieee80211MgmtHeader > &  mgmtHeader 
)
overridevirtual

Implements inet::ieee80211::IRecipientQosMacDataService.

116 {
117  Enter_Method("managementFrameReceived");
118  take(mgmtPacket);
119  // TODO MPDU Header+CRC Validation, Address1 Filtering, Duplicate Removal, MPDU Decryption
120  if (duplicateRemoval && duplicateRemoval->isDuplicate(mgmtHeader))
121  return std::vector<Packet *>();
122  if (basicReassembly) { // FIXME defragmentation
123  mgmtPacket = defragment(mgmtPacket);
124  }
125  if (auto delba = dynamicPtrCast<const Ieee80211Delba>(mgmtHeader))
127  // TODO Defrag, MSDU Integrity, Replay Detection, RX MSDU Rate Limiting
128  if (dynamicPtrCast<const Ieee80211ActionFrame>(mgmtHeader)) {
129  delete mgmtPacket;
130  return std::vector<Packet *>();
131  }
132  else
133  return std::vector<Packet *>({ mgmtPacket });
134 }

Member Data Documentation

◆ aMpduDeaggregation

IMpduDeaggregation* inet::ieee80211::RecipientQosMacDataService::aMpduDeaggregation = nullptr
protected

◆ aMsduDeaggregation

IMsduDeaggregation* inet::ieee80211::RecipientQosMacDataService::aMsduDeaggregation = nullptr
protected

◆ basicReassembly

IReassembly* inet::ieee80211::RecipientQosMacDataService::basicReassembly = nullptr
protected

◆ blockAckReordering

BlockAckReordering* inet::ieee80211::RecipientQosMacDataService::blockAckReordering = nullptr
protected

◆ defragmentation

IDefragmentation* inet::ieee80211::RecipientQosMacDataService::defragmentation = nullptr
protected

◆ duplicateRemoval

IDuplicateRemoval* inet::ieee80211::RecipientQosMacDataService::duplicateRemoval = nullptr
protected

The documentation for this class was generated from the following files:
inet::ieee80211::BlockAckReordering::ReorderBuffer
std::map< SequenceNumber, Fragments > ReorderBuffer
Definition: BlockAckReordering.h:27
inet::ieee80211::RecipientQosMacDataService::aMsduDeaggregation
IMsduDeaggregation * aMsduDeaggregation
Definition: RecipientQosMacDataService.h:37
inet::ieee80211::BlockAckReordering::processReceivedQoSFrame
ReorderBuffer processReceivedQoSFrame(RecipientBlockAckAgreement *agreement, Packet *dataPacket, const Ptr< const Ieee80211DataHeader > &dataHeader)
Definition: BlockAckReordering.cc:18
inet::ieee80211::RecipientQosMacDataService::aMpduDeaggregation
IMpduDeaggregation * aMpduDeaggregation
Definition: RecipientQosMacDataService.h:30
inet::DUPLICATE_DETECTED
@ DUPLICATE_DETECTED
Definition: Simsignals_m.h:83
inet::ieee80211::BlockAckReordering::processReceivedBlockAckReq
ReorderBuffer processReceivedBlockAckReq(RecipientBlockAckAgreement *agreement, const Ptr< const Ieee80211BlockAckReq > &blockAckReq)
Definition: BlockAckReordering.cc:54
inet::ieee80211::IRecipientQosMacDataService::packetDefragmentedSignal
static simsignal_t packetDefragmentedSignal
Definition: IRecipientQosMacDataService.h:21
inet::packetDroppedSignal
simsignal_t packetDroppedSignal
Definition: Simsignals.cc:85
inet::ieee80211::RecipientQosMacDataService::duplicateRemoval
IDuplicateRemoval * duplicateRemoval
Definition: RecipientQosMacDataService.h:33
inet::ieee80211::IReassembly::addFragment
virtual Packet * addFragment(Packet *frame)=0
Add a fragment to the reassembly buffer.
inet::ieee80211::Tid
int8_t Tid
Definition: Ieee80211Defs.h:17
inet::ieee80211::RecipientQosMacDataService::defragment
virtual Packet * defragment(std::vector< Packet * > completeFragments)
Definition: RecipientQosMacDataService.cc:33
inet::ieee80211::IDuplicateRemoval::isDuplicate
virtual bool isDuplicate(const Ptr< const Ieee80211DataOrMgmtHeader > &header)=0
inet::ieee80211::BlockAckReordering::processReceivedDelba
void processReceivedDelba(const Ptr< const Ieee80211Delba > &delba)
Definition: BlockAckReordering.cc:188
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::ieee80211::IRecipientQosMacDataService::packetDeaggregatedSignal
static simsignal_t packetDeaggregatedSignal
Definition: IRecipientQosMacDataService.h:22
inet::ieee80211::IMsduDeaggregation::deaggregateFrame
virtual std::vector< Packet * > * deaggregateFrame(Packet *frame)=0
inet::ieee80211::RecipientQosMacDataService::blockAckReordering
BlockAckReordering * blockAckReordering
Definition: RecipientQosMacDataService.h:35
inet::ieee80211::RecipientQosMacDataService::basicReassembly
IReassembly * basicReassembly
Definition: RecipientQosMacDataService.h:28