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

#include <BasicFragmentationPolicy.h>

Inheritance diagram for inet::ieee80211::BasicFragmentationPolicy:
inet::ieee80211::IFragmentationPolicy

Public Member Functions

virtual std::vector< int > computeFragmentSizes (Packet *frame) override
 
- Public Member Functions inherited from inet::ieee80211::IFragmentationPolicy
virtual ~IFragmentationPolicy ()
 

Protected Member Functions

virtual void initialize () override
 

Protected Attributes

int fragmentationThreshold = -1
 

Member Function Documentation

◆ computeFragmentSizes()

std::vector< int > inet::ieee80211::BasicFragmentationPolicy::computeFragmentSizes ( Packet frame)
overridevirtual

Implements inet::ieee80211::IFragmentationPolicy.

23 {
24  Enter_Method("computeFragmentSizes");
25  if (fragmentationThreshold < frame->getByteLength()) {
26  EV_DEBUG << "Computing fragment sizes: fragmentationThreshold = " << fragmentationThreshold << ", packet = " << *frame << ".\n";
27  std::vector<int> sizes;
28  int payloadLength = 0;
29  int headerLength = 0;
30  // Mgmt frames don't have payload
31  const auto& header = frame->peekAtFront<Ieee80211MacHeader>();
32  const auto& trailer = frame->peekAtBack<Ieee80211MacTrailer>(B(4));
33  int trailerLength = B(trailer->getChunkLength()).get();
34  if (dynamicPtrCast<const Ieee80211DataHeader>(header)) {
35  headerLength = B(header->getChunkLength()).get();
36  payloadLength = frame->getByteLength() - headerLength - trailerLength;
37  }
38  else
39  headerLength = frame->getByteLength();
40  int maxFragmentPayload = fragmentationThreshold - headerLength - trailerLength;
41  if (payloadLength > maxFragmentPayload * MAX_NUM_FRAGMENTS)
42  throw cRuntimeError("Fragmentation: frame \"%s\" too large, won't fit into %d fragments", frame->getName(), MAX_NUM_FRAGMENTS);
43  for (int i = 0; headerLength + trailerLength + payloadLength > fragmentationThreshold; i++) {
44  auto size = fragmentationThreshold - headerLength - trailerLength;
45  EV_TRACE << "Computed fragment: i = " << i << ", size = " << size << ".\n";
46  sizes.push_back(size);
47  payloadLength -= maxFragmentPayload;
48  }
49  if (payloadLength != 0) {
50  EV_TRACE << "Computed last fragment: size = " << payloadLength << ".\n";
51  sizes.push_back(payloadLength);
52  }
53  EV_TRACE << "Fragmentation is suggested into " << sizes.size() << " packets.\n";
54  return sizes;
55  }
56  EV_DEBUG << "Packet is not large enough for fragmentation: fragmentationThreshold = " << fragmentationThreshold << ".\n";
57  return std::vector<int>();
58 }

◆ initialize()

void inet::ieee80211::BasicFragmentationPolicy::initialize ( )
overrideprotectedvirtual
18 {
19  fragmentationThreshold = par("fragmentationThreshold");
20 }

Member Data Documentation

◆ fragmentationThreshold

int inet::ieee80211::BasicFragmentationPolicy::fragmentationThreshold = -1
protected

Referenced by computeFragmentSizes(), and initialize().


The documentation for this class was generated from the following files:
inet::ieee80211::BasicFragmentationPolicy::fragmentationThreshold
int fragmentationThreshold
Definition: BasicFragmentationPolicy.h:20
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::ieee80211::MAX_NUM_FRAGMENTS
const short int MAX_NUM_FRAGMENTS
Definition: Ieee80211Frame_m.h:102
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71