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

#include <AckHandler.h>

Inheritance diagram for inet::ieee80211::AckHandler:
inet::ieee80211::IAckHandler

Public Types

enum  Status {
  Status::FRAME_NOT_YET_TRANSMITTED, Status::NO_ACK_REQUIRED, Status::WAITING_FOR_ACK, Status::ACK_NOT_ARRIVED,
  Status::ACK_ARRIVED
}
 

Public Member Functions

virtual ~AckHandler ()
 
virtual void processReceivedAck (const Ptr< const Ieee80211AckFrame > &ack, const Ptr< const Ieee80211DataOrMgmtHeader > &ackedHeader)
 
virtual void frameGotInProgress (const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader) override
 
virtual void processTransmittedDataOrMgmtFrame (const Ptr< const Ieee80211DataOrMgmtHeader > &header)
 
virtual Status getAckStatus (const Ptr< const Ieee80211DataOrMgmtHeader > &header)
 
virtual bool isEligibleToTransmit (const Ptr< const Ieee80211DataOrMgmtHeader > &header) override
 
virtual bool isOutstandingFrame (const Ptr< const Ieee80211DataOrMgmtHeader > &header) override
 
virtual void processFailedFrame (const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)
 
virtual void dropFrame (const Ptr< const Ieee80211DataOrMgmtHeader > &dataOrMgmtHeader)
 
- Public Member Functions inherited from inet::ieee80211::IAckHandler
virtual ~IAckHandler ()
 

Static Public Member Functions

static std::string getStatusString (Status status)
 

Protected Member Functions

virtual void initialize (int stage) override
 
virtual Status getAckStatus (SequenceControlField id)
 
void printAckStatuses ()
 

Protected Attributes

std::map< SequenceControlField, StatusackStatuses
 

Member Enumeration Documentation

◆ Status

Enumerator
FRAME_NOT_YET_TRANSMITTED 
NO_ACK_REQUIRED 
WAITING_FOR_ACK 
ACK_NOT_ARRIVED 
ACK_ARRIVED 
22  {
23  FRAME_NOT_YET_TRANSMITTED,
24  NO_ACK_REQUIRED,
25  WAITING_FOR_ACK,
26  ACK_NOT_ARRIVED,
27  ACK_ARRIVED,
28  };

Constructor & Destructor Documentation

◆ ~AckHandler()

virtual inet::ieee80211::AckHandler::~AckHandler ( )
inlinevirtual
39 {}

Member Function Documentation

◆ dropFrame()

void inet::ieee80211::AckHandler::dropFrame ( const Ptr< const Ieee80211DataOrMgmtHeader > &  dataOrMgmtHeader)
virtual
91 {
92  auto id = SequenceControlField(dataOrMgmtHeader->getSequenceNumber().get(), dataOrMgmtHeader->getFragmentNumber());
93  ackStatuses.erase(id);
94 }

◆ frameGotInProgress()

void inet::ieee80211::AckHandler::frameGotInProgress ( const Ptr< const Ieee80211DataOrMgmtHeader > &  dataOrMgmtHeader)
overridevirtual

Implements inet::ieee80211::IAckHandler.

59 {
60  auto id = SequenceControlField(dataOrMgmtHeader->getSequenceNumber().get(), dataOrMgmtHeader->getFragmentNumber());
61  auto status = getAckStatus(id);
62  ASSERT(status != Status::WAITING_FOR_ACK);
64 }

◆ getAckStatus() [1/2]

AckHandler::Status inet::ieee80211::AckHandler::getAckStatus ( const Ptr< const Ieee80211DataOrMgmtHeader > &  header)
virtual
31 {
32  auto id = SequenceControlField(header->getSequenceNumber().get(), header->getFragmentNumber());
33  return getAckStatus(id);
34 }

◆ getAckStatus() [2/2]

AckHandler::Status inet::ieee80211::AckHandler::getAckStatus ( SequenceControlField  id)
protectedvirtual
25 {
26  auto it = ackStatuses.find(id);
27  return (it != ackStatuses.end()) ? it->second : Status::FRAME_NOT_YET_TRANSMITTED;
28 }

Referenced by frameGotInProgress(), getAckStatus(), isEligibleToTransmit(), processFailedFrame(), and processReceivedAck().

◆ getStatusString()

std::string inet::ieee80211::AckHandler::getStatusString ( Status  status)
static
97 {
98  switch (status) {
99  case Status::FRAME_NOT_YET_TRANSMITTED: return "FRAME_NOT_YET_TRANSMITTED";
100  case Status::NO_ACK_REQUIRED: return "NO_ACK_REQUIRED";
101  case Status::WAITING_FOR_ACK: return "WAITING_FOR_NORMAL_ACK";
102  case Status::ACK_NOT_ARRIVED: return "NORMAL_ACK_NOT_ARRIVED";
103  case Status::ACK_ARRIVED: return "NORMAL_ACK_ARRIVED";
104  default: throw cRuntimeError("Unknown status");
105  }
106 }

Referenced by inet::ieee80211::operator<<(), and printAckStatuses().

◆ initialize()

void inet::ieee80211::AckHandler::initialize ( int  stage)
overrideprotectedvirtual
18 {
19  if (stage == INITSTAGE_LOCAL) {
20  WATCH_MAP(ackStatuses);
21  }
22 }

◆ isEligibleToTransmit()

bool inet::ieee80211::AckHandler::isEligibleToTransmit ( const Ptr< const Ieee80211DataOrMgmtHeader > &  header)
overridevirtual

Implements inet::ieee80211::IAckHandler.

67 {
68  auto status = getAckStatus(header);
69  return status == AckHandler::Status::NO_ACK_REQUIRED ||
72 }

◆ isOutstandingFrame()

bool inet::ieee80211::AckHandler::isOutstandingFrame ( const Ptr< const Ieee80211DataOrMgmtHeader > &  header)
overridevirtual

Implements inet::ieee80211::IAckHandler.

75 {
76  return false;
77 }

◆ printAckStatuses()

void inet::ieee80211::AckHandler::printAckStatuses ( )
protected
109 {
110  for (auto ackStatus : ackStatuses) {
111  std::cout << "Seq Num = " << ackStatus.first.getSequenceNumber() << " " << "Frag Num = " << (int)ackStatus.first.getFragmentNumber() << std::endl;
112  std::cout << "Status = " << getStatusString(ackStatus.second) << std::endl;
113  }
114  std::cout << "=========================================" << std::endl;
115 }

◆ processFailedFrame()

void inet::ieee80211::AckHandler::processFailedFrame ( const Ptr< const Ieee80211DataOrMgmtHeader > &  dataOrMgmtHeader)
virtual
80 {
81  if (auto dataHeader = dynamicPtrCast<const Ieee80211DataHeader>(dataOrMgmtHeader)) {
82  if (dataHeader->getAckPolicy() == NORMAL_ACK) {
83  ASSERT(getAckStatus(dataOrMgmtHeader) == Status::WAITING_FOR_ACK);
84  auto id = SequenceControlField(dataOrMgmtHeader->getSequenceNumber().get(), dataOrMgmtHeader->getFragmentNumber());
86  }
87  }
88 }

◆ processReceivedAck()

void inet::ieee80211::AckHandler::processReceivedAck ( const Ptr< const Ieee80211AckFrame > &  ack,
const Ptr< const Ieee80211DataOrMgmtHeader > &  ackedHeader 
)
virtual
37 {
38  auto id = SequenceControlField(ackedHeader->getSequenceNumber().get(), ackedHeader->getFragmentNumber());
39  auto status = getAckStatus(id);
41  throw cRuntimeError("ackedFrame = %s is not yet transmitted", ackedHeader->getName());
43 }

◆ processTransmittedDataOrMgmtFrame()

void inet::ieee80211::AckHandler::processTransmittedDataOrMgmtFrame ( const Ptr< const Ieee80211DataOrMgmtHeader > &  header)
virtual
46 {
47  auto id = SequenceControlField(header->getSequenceNumber().get(), header->getFragmentNumber());
48  if (auto dataHeader = dynamicPtrCast<const Ieee80211DataHeader>(header)) {
49  if (dataHeader->getAckPolicy() == NORMAL_ACK)
51  else
53  }
54  else
56 }

Member Data Documentation

◆ ackStatuses


The documentation for this class was generated from the following files:
inet::ieee80211::AckHandler::getAckStatus
virtual Status getAckStatus(SequenceControlField id)
Definition: AckHandler.cc:24
inet::ieee80211::AckHandler::Status::FRAME_NOT_YET_TRANSMITTED
@ FRAME_NOT_YET_TRANSMITTED
inet::ieee80211::AckHandler::Status::NO_ACK_REQUIRED
@ NO_ACK_REQUIRED
inet::ieee80211::AckHandler::Status::WAITING_FOR_ACK
@ WAITING_FOR_ACK
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::ieee80211::AckHandler::ackStatuses
std::map< SequenceControlField, Status > ackStatuses
Definition: AckHandler.h:31
inet::ieee80211::AckHandler::Status::ACK_NOT_ARRIVED
@ ACK_NOT_ARRIVED
inet::ieee80211::AckHandler::Status::ACK_ARRIVED
@ ACK_ARRIVED
inet::ieee80211::AckHandler::getStatusString
static std::string getStatusString(Status status)
Definition: AckHandler.cc:96
inet::ieee80211::NORMAL_ACK
@ NORMAL_ACK
Definition: Ieee80211Frame_m.h:193