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

#include <Ieee80211Portal.h>

Inheritance diagram for inet::ieee80211::Ieee80211Portal:
inet::ieee80211::IIeee80211Llc

Public Member Functions

const ProtocolgetProtocol () const override
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void handleMessage (cMessage *message) override
 
virtual void encapsulate (Packet *packet)
 
virtual void decapsulate (Packet *packet)
 

Protected Attributes

FcsMode fcsMode = FCS_MODE_UNDEFINED
 
bool upperLayerOutConnected = false
 

Member Function Documentation

◆ decapsulate()

void inet::ieee80211::Ieee80211Portal::decapsulate ( Packet packet)
protectedvirtual
91 {
92 #ifdef INET_WITH_ETHERNET
93  packet->trim();
94  int typeOrLength = packet->getByteLength();
95  const auto& llcHeader = packet->peekAtFront<Ieee8022LlcHeader>();
96  if (llcHeader->getSsap() == 0xAA && llcHeader->getDsap() == 0xAA && llcHeader->getControl() == 0x03) {
97  const auto& snapHeader = dynamicPtrCast<const Ieee8022LlcSnapHeader>(llcHeader);
98  if (snapHeader == nullptr)
99  throw cRuntimeError("LLC header indicates SNAP header, but SNAP header is missing");
100  if (snapHeader->getOui() == 0) {
101  // snap header with ethertype
102  typeOrLength = snapHeader->getProtocolId();
103  packet->eraseAtFront(snapHeader->getChunkLength());
104  }
105  }
106  const auto& ethernetHeader = makeShared<EthernetMacHeader>();
107  ethernetHeader->setSrc(packet->getTag<MacAddressInd>()->getSrcAddress());
108  ethernetHeader->setDest(packet->getTag<MacAddressInd>()->getDestAddress());
109  ethernetHeader->setTypeOrLength(typeOrLength);
110  packet->insertAtFront(ethernetHeader);
111  const auto& ethernetFcs = makeShared<EthernetFcs>();
112  ethernetFcs->setFcsMode(fcsMode);
113  packet->insertAtBack(ethernetFcs);
114  packet->addTagIfAbsent<DispatchProtocolReq>()->setProtocol(&Protocol::ethernetMac);
115  packet->addTagIfAbsent<PacketProtocolTag>()->setProtocol(&Protocol::ethernetMac);
116 #else // ifdef INET_WITH_ETHERNET
117  throw cRuntimeError("INET compiled without ETHERNET feature!");
118 #endif // ifdef INET_WITH_ETHERNET
119 }

Referenced by handleMessage().

◆ encapsulate()

void inet::ieee80211::Ieee80211Portal::encapsulate ( Packet packet)
protectedvirtual
59 {
60 #ifdef INET_WITH_ETHERNET
61  auto ethernetHeader = packet->popAtFront<EthernetMacHeader>(); // do not use const auto& : trimChunks() delete it from packet
62  packet->popAtBack<EthernetFcs>(ETHER_FCS_BYTES);
63  packet->trim();
64  packet->addTagIfAbsent<MacAddressReq>()->setDestAddress(ethernetHeader->getDest());
65  packet->addTagIfAbsent<MacAddressReq>()->setSrcAddress(ethernetHeader->getSrc());
66  if (isIeee8023Header(*ethernetHeader)) {
67  // remove Padding if possible
68  b payloadLength = B(ethernetHeader->getTypeOrLength());
69  if (packet->getDataLength() < payloadLength)
70  throw cRuntimeError("incorrect payload length in ethernet frame"); // TODO alternative: drop packet
71  packet->setBackOffset(packet->getFrontOffset() + payloadLength);
72 
73  // check that the packet already has an LLC header
74  packet->peekAtFront<Ieee8022LlcHeader>();
75  }
76  else if (isEth2Header(*ethernetHeader)) {
77  const auto& ieee8022SnapHeader = makeShared<Ieee8022LlcSnapHeader>();
78  ieee8022SnapHeader->setOui(0);
79  ieee8022SnapHeader->setProtocolId(ethernetHeader->getTypeOrLength());
80  packet->insertAtFront(ieee8022SnapHeader);
81  }
82  else
83  throw cRuntimeError("Unknown packet: '%s'", packet->getFullName());
84  packet->addTagIfAbsent<PacketProtocolTag>()->setProtocol(&Protocol::ieee8022llc);
85 #else // ifdef INET_WITH_ETHERNET
86  throw cRuntimeError("INET compiled without ETHERNET feature!");
87 #endif // ifdef INET_WITH_ETHERNET
88 }

Referenced by handleMessage().

◆ getProtocol()

const Protocol* inet::ieee80211::Ieee80211Portal::getProtocol ( ) const
inlineoverridevirtual

◆ handleMessage()

void inet::ieee80211::Ieee80211Portal::handleMessage ( cMessage *  message)
overrideprotectedvirtual
40 {
41  if (message->arrivedOn("upperLayerIn")) {
42  auto packet = check_and_cast<Packet *>(message);
43  encapsulate(packet);
44  send(packet, "lowerLayerOut");
45  }
46  else if (message->arrivedOn("lowerLayerIn")) {
47  auto packet = check_and_cast<Packet *>(message);
48  decapsulate(packet);
50  send(packet, "upperLayerOut");
51  else
52  delete packet;
53  }
54  else
55  throw cRuntimeError("Unknown message");
56 }

◆ initialize()

void inet::ieee80211::Ieee80211Portal::initialize ( int  stage)
overrideprotectedvirtual
30 {
31  if (stage == INITSTAGE_LOCAL) {
32  upperLayerOutConnected = gate("upperLayerOut")->getPathEndGate()->isConnected();
33 #ifdef INET_WITH_ETHERNET
34  fcsMode = parseFcsMode(par("fcsMode"));
35 #endif // ifdef INET_WITH_ETHERNET
36  }
37 }

◆ numInitStages()

virtual int inet::ieee80211::Ieee80211Portal::numInitStages ( ) const
inlineoverrideprotectedvirtual
27 { return NUM_INIT_STAGES; }

Member Data Documentation

◆ fcsMode

FcsMode inet::ieee80211::Ieee80211Portal::fcsMode = FCS_MODE_UNDEFINED
protected

Referenced by decapsulate(), and initialize().

◆ upperLayerOutConnected

bool inet::ieee80211::Ieee80211Portal::upperLayerOutConnected = false
protected

Referenced by handleMessage(), and initialize().


The documentation for this class was generated from the following files:
inet::isEth2Header
bool isEth2Header(const EthernetMacHeader &hdr)
Definition: EthernetMacHeader_m.h:228
inet::ieee80211::Ieee80211Portal::decapsulate
virtual void decapsulate(Packet *packet)
Definition: Ieee80211Portal.cc:90
inet::ETHER_FCS_BYTES
const B ETHER_FCS_BYTES
Definition: Ethernet.h:59
inet::isIeee8023Header
bool isIeee8023Header(const EthernetMacHeader &hdr)
Definition: EthernetMacHeader_m.h:229
DispatchProtocolReq
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DispatchProtocolReq
Definition: IUdp-gates.txt:25
inet::Protocol::ieee8022llc
static const Protocol ieee8022llc
Definition: Protocol.h:88
PacketProtocolTag
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
inet::ieee80211::Ieee80211Portal::upperLayerOutConnected
bool upperLayerOutConnected
Definition: Ieee80211Portal.h:24
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::Protocol::ethernetMac
static const Protocol ethernetMac
Definition: Protocol.h:65
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::units::values::b
value< int64_t, units::b > b
Definition: Units.h:1241
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::ieee80211::Ieee80211Portal::encapsulate
virtual void encapsulate(Packet *packet)
Definition: Ieee80211Portal.cc:58
inet::parseFcsMode
FcsMode parseFcsMode(const char *fcsModeString)
Definition: FcsMode.cc:14
inet::ieee80211::Ieee80211Portal::fcsMode
FcsMode fcsMode
Definition: Ieee80211Portal.h:23