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

#include <BasicReassembly.h>

Inheritance diagram for inet::ieee80211::BasicReassembly:
inet::ieee80211::IReassembly

Classes

struct  Key
 
struct  Value
 

Public Member Functions

virtual ~BasicReassembly ()
 
virtual PacketaddFragment (Packet *packet) override
 Add a fragment to the reassembly buffer. More...
 
virtual void purge (const MacAddress &address, int tid, int startSeqNumber, int endSeqNumber) override
 Discard fragments from the reassembly buffer. More...
 
- Public Member Functions inherited from inet::ieee80211::IReassembly
virtual ~IReassembly ()
 

Protected Types

typedef std::map< Key, ValueFragmentsMap
 

Protected Attributes

FragmentsMap fragmentsMap
 

Member Typedef Documentation

◆ FragmentsMap

Constructor & Destructor Documentation

◆ ~BasicReassembly()

inet::ieee80211::BasicReassembly::~BasicReassembly ( )
virtual
100 {
101  for (auto it = fragmentsMap.begin(); it != fragmentsMap.end(); ++it)
102  for (auto fragment : it->second.fragments)
103  delete fragment;
104 }

Member Function Documentation

◆ addFragment()

Packet * inet::ieee80211::BasicReassembly::addFragment ( Packet frame)
overridevirtual

Add a fragment to the reassembly buffer.

If the new fragment completes a frame, then the reassembled frame is returned (and fragments are removed from the buffer), otherwise the function returns nullptr.

Implements inet::ieee80211::IReassembly.

24 {
25  const auto& header = packet->peekAtFront<Ieee80211DataOrMgmtHeader>();
26  // Frame is not fragmented
27  if (!header->getMoreFragments() && header->getFragmentNumber() == 0)
28  return packet;
29  // FIXME temporary fix for mgmt frames
30  if (dynamicPtrCast<const Ieee80211MgmtHeader>(header))
31  return packet;
32  // find entry for this frame
33  Key key;
34  key.macAddress = header->getTransmitterAddress();
35  key.tid = -1;
36  if (header->getType() == ST_DATA_WITH_QOS)
37  if (const Ptr<const Ieee80211DataHeader>& qosDataHeader = dynamicPtrCast<const Ieee80211DataHeader>(header))
38  key.tid = qosDataHeader->getTid();
39  key.seqNum = header->getSequenceNumber().get();
40  short fragNum = header->getFragmentNumber();
41  ASSERT(fragNum >= 0 && fragNum < MAX_NUM_FRAGMENTS);
42  auto& value = fragmentsMap[key];
43  value.fragments.resize(16);
44 
45  // update entry
46  uint16_t fragmentBit = 1 << fragNum;
47  value.receivedFragments |= fragmentBit;
48  if (!header->getMoreFragments())
49  value.allFragments = (fragmentBit << 1) - 1;
50  if (!value.fragments[fragNum])
51  value.fragments[fragNum] = packet;
52  else
53  delete packet;
54 
55 // MacAddress txAddress = header->getTransmitterAddress();
56 
57  // if all fragments arrived, return assembled frame
58  if (value.allFragments != 0 && value.allFragments == value.receivedFragments) {
59  Defragmentation defragmentation;
60  value.fragments.erase(std::remove(value.fragments.begin(), value.fragments.end(), nullptr), value.fragments.end());
61  auto defragmentedFrame = defragmentation.defragmentFrames(&value.fragments);
62  // We need to restore some data from the carrying frame's header like TX address
63  // TODO Maybe we need to restore the fromDs, toDs fields as well when traveling through multiple APs
64  // TODO Are there any other fields that we need to restore?
65  for (auto fragment : value.fragments)
66  delete fragment;
67  fragmentsMap.erase(key);
68  return defragmentedFrame;
69  }
70  else
71  return nullptr;
72 }

◆ purge()

void inet::ieee80211::BasicReassembly::purge ( const MacAddress address,
int  tid,
int  startSeqNumber,
int  endSeqNumber 
)
overridevirtual

Discard fragments from the reassembly buffer.

Frames are identified by the transmitter address, the TID, and the sequence number range [startSeqNumber, endSeqNumber[. Set tid=-1 for non-QoS frames.

Implements inet::ieee80211::IReassembly.

75 {
76  Key key;
77  key.macAddress = address;
78  key.tid = tid;
79  key.seqNum = startSeqNumber;
80  auto itStart = fragmentsMap.lower_bound(key);
81  key.seqNum = endSeqNumber;
82  auto itEnd = fragmentsMap.upper_bound(key);
83 
84  if (endSeqNumber < startSeqNumber) {
85  for (auto it = itStart; it != fragmentsMap.end();) {
86  for (auto fragment : it->second.fragments)
87  delete fragment;
88  it = fragmentsMap.erase(it);
89  }
90  itStart = fragmentsMap.begin();
91  }
92  for (auto it = itStart; it != itEnd;) {
93  for (auto fragment : it->second.fragments)
94  delete fragment;
95  it = fragmentsMap.erase(it);
96  }
97 }

Member Data Documentation

◆ fragmentsMap

FragmentsMap inet::ieee80211::BasicReassembly::fragmentsMap
protected

The documentation for this class was generated from the following files:
inet::remove
void remove(std::vector< T > &v, const Tk &a)
Definition: stlutils.h:107
inet::ieee80211::MAX_NUM_FRAGMENTS
const short int MAX_NUM_FRAGMENTS
Definition: Ieee80211Frame_m.h:102
inet::ieee80211::ST_DATA_WITH_QOS
@ ST_DATA_WITH_QOS
Definition: Ieee80211Frame_m.h:169
inet::ieee80211::BasicReassembly::fragmentsMap
FragmentsMap fragmentsMap
Definition: BasicReassembly.h:34
inet::Macho::Key
void * Key
Definition: Macho.h:327