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

The default implementation of ITx. More...

#include <Tx.h>

Inheritance diagram for inet::ieee80211::Tx:
inet::ieee80211::ITx

Public Member Functions

 Tx ()
 
 ~Tx ()
 
virtual void transmitFrame (Packet *packet, const Ptr< const Ieee80211MacHeader > &header, ITx::ICallback *txCallback) override
 
virtual void transmitFrame (Packet *packet, const Ptr< const Ieee80211MacHeader > &header, simtime_t ifs, ITx::ICallback *txCallback) override
 
virtual void radioTransmissionFinished () override
 
- Public Member Functions inherited from inet::ieee80211::ITx
virtual ~ITx ()
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void handleMessage (cMessage *msg) override
 
virtual void refreshDisplay () const override
 

Protected Attributes

ITx::ICallbacktxCallback = nullptr
 
Ieee80211Macmac = nullptr
 
IRxrx = nullptr
 
Packetframe = nullptr
 
cMessage * endIfsTimer = nullptr
 
bool transmitting = false
 

Detailed Description

The default implementation of ITx.

Constructor & Destructor Documentation

◆ Tx()

inet::ieee80211::Tx::Tx ( )
inline
39 {}

◆ ~Tx()

inet::ieee80211::Tx::~Tx ( )
24 {
25  cancelAndDelete(endIfsTimer);
26  if (frame)
27  delete frame;
28 }

Member Function Documentation

◆ handleMessage()

void inet::ieee80211::Tx::handleMessage ( cMessage *  msg)
overrideprotectedvirtual
103 {
104  if (msg == endIfsTimer) {
105  EV_DETAIL << "Tx: endIfsTimer expired\n";
106  transmitting = true;
107  mac->sendDownFrame(frame->dup());
108  }
109  else
110  ASSERT(false);
111 }

◆ initialize()

void inet::ieee80211::Tx::initialize ( int  stage)
overrideprotectedvirtual
31 {
32  if (stage == INITSTAGE_LOCAL) {
33  mac = check_and_cast<Ieee80211Mac *>(getContainingNicModule(this)->getSubmodule("mac"));
34  endIfsTimer = new cMessage("endIFS");
35  rx = dynamic_cast<IRx *>(findModuleByPath(par("rxModule")));
36  WATCH(transmitting);
37  }
38 }

◆ numInitStages()

virtual int inet::ieee80211::Tx::numInitStages ( ) const
inlineoverrideprotectedvirtual
33 { return NUM_INIT_STAGES; }

◆ radioTransmissionFinished()

void inet::ieee80211::Tx::radioTransmissionFinished ( )
overridevirtual

Implements inet::ieee80211::ITx.

84 {
85  Enter_Method("radioTransmissionFinished");
86  if (transmitting) {
87  EV_DETAIL << "Tx: radioTransmissionFinished()\n";
88  transmitting = false;
89  ASSERT(txCallback != nullptr);
90  const auto& header = frame->peekAtFront<Ieee80211MacHeader>();
91  auto duration = header->getDurationField();
92  auto tmpFrame = frame;
93  auto tmpTxCallback = txCallback;
94  frame = nullptr;
95  txCallback = nullptr;
96  tmpTxCallback->transmissionComplete(tmpFrame, tmpFrame->peekAtFront<Ieee80211MacHeader>());
97  delete tmpFrame;
98  rx->frameTransmitted(duration);
99  }
100 }

◆ refreshDisplay()

void inet::ieee80211::Tx::refreshDisplay ( ) const
overrideprotectedvirtual
114 {
115  const char *stateName = endIfsTimer != nullptr && endIfsTimer->isScheduled() ? "WAIT_IFS" : transmitting ? "TRANSMIT" : "IDLE";
116  // faster version is just to display the state: getDisplayString().setTagArg("t", 0, stateName);
117  std::stringstream os;
118  if (frame)
119  os << frame->getName() << "\n";
120  os << stateName;
121  getDisplayString().setTagArg("t", 0, os.str().c_str());
122 }

◆ transmitFrame() [1/2]

void inet::ieee80211::Tx::transmitFrame ( Packet packet,
const Ptr< const Ieee80211MacHeader > &  header,
ITx::ICallback txCallback 
)
overridevirtual

Implements inet::ieee80211::ITx.

41 {
42  transmitFrame(packet, header, SIMTIME_ZERO, txCallback);
43 }

Referenced by transmitFrame().

◆ transmitFrame() [2/2]

void inet::ieee80211::Tx::transmitFrame ( Packet packet,
const Ptr< const Ieee80211MacHeader > &  header,
simtime_t  ifs,
ITx::ICallback txCallback 
)
overridevirtual

Implements inet::ieee80211::ITx.

46 {
47  Enter_Method("transmitFrame(\"%s\")", packet->getName());
48  ASSERT(this->txCallback == nullptr);
49  this->txCallback = txCallback;
50  auto macAddressInd = packet->addTagIfAbsent<MacAddressInd>();
51  const auto& updatedHeader = packet->removeAtFront<Ieee80211MacHeader>();
52  if (auto oneAddressHeader = dynamicPtrCast<Ieee80211OneAddressHeader>(updatedHeader)) {
53  macAddressInd->setDestAddress(oneAddressHeader->getReceiverAddress());
54  }
55  if (auto twoAddressHeader = dynamicPtrCast<Ieee80211TwoAddressHeader>(updatedHeader)) {
56  twoAddressHeader->setTransmitterAddress(mac->getAddress());
57  macAddressInd->setSrcAddress(twoAddressHeader->getTransmitterAddress());
58  }
59  packet->insertAtFront(updatedHeader);
60  const auto& updatedTrailer = packet->removeAtBack<Ieee80211MacTrailer>(B(4));
61  updatedTrailer->setFcsMode(mac->getFcsMode());
62  if (mac->getFcsMode() == FCS_COMPUTED) {
63  const auto& fcsBytes = packet->peekAllAsBytes();
64  auto bufferLength = B(fcsBytes->getChunkLength()).get();
65  auto buffer = new uint8_t[bufferLength];
66  fcsBytes->copyToBuffer(buffer, bufferLength);
67  auto fcs = ethernetCRC(buffer, bufferLength);
68  updatedTrailer->setFcs(fcs);
69  delete[] buffer;
70  }
71  packet->insertAtBack(updatedTrailer);
72  this->frame = packet->dup();
73  ASSERT(!endIfsTimer->isScheduled() && !transmitting); // we are idle
74  if (ifs == 0) {
75  // do directly what handleMessage() would do
76  transmitting = true;
78  }
79  else
80  scheduleAfter(ifs, endIfsTimer);
81 }

Member Data Documentation

◆ endIfsTimer

cMessage* inet::ieee80211::Tx::endIfsTimer = nullptr
protected

◆ frame

Packet* inet::ieee80211::Tx::frame = nullptr
protected

◆ mac

Ieee80211Mac* inet::ieee80211::Tx::mac = nullptr
protected

◆ rx

IRx* inet::ieee80211::Tx::rx = nullptr
protected

◆ transmitting

bool inet::ieee80211::Tx::transmitting = false
protected

◆ txCallback

ITx::ICallback* inet::ieee80211::Tx::txCallback = nullptr
protected

The documentation for this class was generated from the following files:
inet::ieee80211::Tx::rx
IRx * rx
Definition: Tx.h:27
inet::ieee80211::Tx::transmitting
bool transmitting
Definition: Tx.h:30
inet::ieee80211::IRx::frameTransmitted
virtual void frameTransmitted(simtime_t durationField)=0
inet::Packet::peekAtFront
const Ptr< const Chunk > peekAtFront(b length=b(-1), int flags=0) const
Returns the designated part from the beginning of the data part of the packet as an immutable chunk i...
Definition: Packet.h:245
inet::ieee80211::Tx::frame
Packet * frame
Definition: Tx.h:28
inet::getContainingNicModule
NetworkInterface * getContainingNicModule(const cModule *from)
Find the nic module (inside the networkNode) containing the given module.
Definition: NetworkInterface.cc:691
inet::FCS_COMPUTED
@ FCS_COMPUTED
Definition: FcsMode_m.h:59
inet::ieee80211::Ieee80211Mac::getAddress
virtual const MacAddress & getAddress() const
Definition: Ieee80211Mac.h:101
inet::ieee80211::Tx::mac
Ieee80211Mac * mac
Definition: Tx.h:26
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::Packet::dup
virtual Packet * dup() const override
Definition: Packet.h:171
inet::ieee80211::Ieee80211Mac::sendDownFrame
virtual void sendDownFrame(Packet *frame)
Definition: Ieee80211Mac.cc:357
inet::ethernetCRC
uint32_t ethernetCRC(const unsigned char *buf, unsigned int bufsize, uint32_t crc)
Definition: EthernetCRC.cc:58
inet::ieee80211::Tx::txCallback
ITx::ICallback * txCallback
Definition: Tx.h:25
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::ieee80211::Ieee80211Mac::getFcsMode
virtual FcsMode getFcsMode() const
Definition: Ieee80211Mac.h:100
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::ieee80211::ITx::ICallback::transmissionComplete
virtual void transmissionComplete(Packet *packet, const Ptr< const Ieee80211MacHeader > &header)=0
inet::ieee80211::Tx::transmitFrame
virtual void transmitFrame(Packet *packet, const Ptr< const Ieee80211MacHeader > &header, ITx::ICallback *txCallback) override
Definition: Tx.cc:40
inet::ieee80211::Tx::endIfsTimer
cMessage * endIfsTimer
Definition: Tx.h:29