Package: inet.linklayer.ieee80211.mac
Ieee80211Mac
compound moduleImplementation of the 802.11 MAC protocol. This module is intended to be used in combination with the Ieee80211Radio module as the physical layer.
This module has been heavily modularized to enable customization and extension of almost any aspect of its operation, with the aim of better supporting experimentation and research. Because of that, its features and details of operation are determined by its several subcomponents, and can be altered by extending or replacing the appropriate subcomponents.
Some noteworthy features are:
- Support for 802.11a/b/g/e/p, as well as partial/incomplete support for later WiFi standards such as n and ac.
- Implements DCF and HCF channel access, including support for QoS (EDCA).
- Support for both infrastructure mode and ad hoc mode operation.
- In infrastructure mode, authentication and association can be implicit, or explicitly modeled using frame exchanges.
- Support for advanced MAC features such as frame aggregation, fragmentation, block acknowledgement and block agreements, rate selection and adaptive rate control algorithms like AARF and ONOE.
- Ability to work with radio models of varying levels of detail, from simple unit disk radio models to layered radio models that explicitly model forward error correction, scrambling, symbol encoding/decoding, etc, and may represent radio signals with a multi-dimensional power density function over time and frequency.
- Support for energy consumption modeling.
The IEEE 802.11 header is represented by Ieee80211MacHeader and its subclasses.
Note about the implementation:
Despite its appearance, Ieee80211Mac is not a plain compound module. Although the bulk of its functionality is outsourced to submodules, it is an active module with an underlying C++ class that subclasses from cSimpleModule, and receives/sends messages on its own behalf.
Notable omissions:
- PCF is missing
- HCCA is currently not implemented. (The module exists, but it is currently a placeholder.)
- Fields related to unsupported features are omitted from frame formats as well (for example, FH/DS/CF parameter sets, beacon/probe timestamp which is related to physical layer synchronization, listen interval which is related to power management, capability information which is related to PCF and other non-modeled features).
Usage diagram
The following diagram shows usage relationships between types. Unresolved types are missing from the diagram.
Inheritance diagram
The following diagram shows inheritance relationships for this type. Unresolved types are missing from the diagram.
Extends
Name | Type | Description |
---|---|---|
MacProtocolBase | simple module |
Module base for different MAC protocols. |
Parameters
Name | Type | Default value | Description |
---|---|---|---|
interfaceTableModule | string | ||
mibModule | string | ||
modeSet | string | "g(mixed)" | |
fcsMode | string | "declared" | |
initialRadioMode | string | "receiver" | |
mtu | int | 2304B | |
qosStation | bool | false |
Properties
Name | Value | Description |
---|---|---|
display | i=block/layer | |
class | Ieee80211Mac |
Gates
Name | Direction | Size | Description |
---|---|---|---|
upperLayerIn | input | ||
upperLayerOut | output | ||
lowerLayerIn | input | ||
lowerLayerOut | output | ||
mgmtIn | input | ||
mgmtOut | output |
Signals
Name | Type | Unit |
---|---|---|
modesetChanged | inet::physicallayer::Ieee80211ModeSet | |
linkBroken | inet::Packet |
Statistics
Name | Title | Source | Record | Unit | Interpolation Mode |
---|---|---|---|---|---|
packetDropOther | packet drops: other | packetDropReasonIsOther(packetDropped) | count, sum(packetBytes), vector(packetBytes) | none | |
packetDropNotAddressedToUs | packet drops: not addressed to us | packetDropReasonIsNotAddressedToUs(packetDropped) | count, sum(packetBytes), vector(packetBytes) | none | |
packetDropDuplicateDetected | packet drops: duplicate detected | packetDropReasonIsDuplicateDetected(packetDropped) | count, sum(packetBytes), vector(packetBytes) | none | |
packetReceivedFromUpper | packets received from upper layer | count, sum(packetBytes), vector(packetBytes) | none | ||
packetReceivedFromLower | packets received from lower layer | count, sum(packetBytes), vector(packetBytes) | none | ||
packetDropQueueOverflow | packet drops: queue overflow | packetDropReasonIsQueueOverflow(packetDropped) | count, sum(packetBytes), vector(packetBytes) | none | |
packetDropRetryLimitReached | packet drops: retry limit reached | packetDropReasonIsRetryLimitReached(packetDropped) | count, sum(packetBytes), vector(packetBytes) | none | |
packetSentToLower | packets sent to lower layer | count, sum(packetBytes), vector(packetBytes) | none | ||
packetSentToUpper | packets sent to upper layer | count, sum(packetBytes), vector(packetBytes) | none | ||
linkBroken | link breaks | count, vector? | none | ||
packetDrop | packet drops | packetDropped | count, sum(packetBytes), vector(packetBytes) | none | |
packetDropIncorrectlyReceived | packet drops: incorrectly received | packetDropReasonIsIncorrectlyReceived(packetDropped) | count, sum(packetBytes), vector(packetBytes) | none |
Direct method calls (observed)
call to | function | info |
---|---|---|
PcapRecorder | inet::PcapRecorder::receiveSignal | packetReceivedFromLower |
PcapRecorder | inet::PcapRecorder::receiveSignal | packetSentToLower |
Ds | inet::ieee80211::Ds::processDataFrame | processDataFrame |
Ieee80211Mac | inet::ieee80211::Ieee80211Mac::processLowerFrame | processLowerFrame("%s") |
Ieee80211Mac | inet::ieee80211::Ieee80211Mac::processUpperFrame | processUpperFrame("%s") |
Rx | inet::ieee80211::Rx::lowerFrameReceived | lowerFrameReceived("%s") |
Rx | inet::ieee80211::Rx::receivedSignalPartChanged | receivedSignalPartChanged |
Rx | inet::ieee80211::Rx::receptionStateChanged | receptionStateChanged |
Rx | inet::ieee80211::Rx::transmissionStateChanged | transmissionStateChanged |
Tx | inet::ieee80211::Tx::radioTransmissionFinished | radioTransmissionFinished |
OriginatorBlockAckAgreementPolicy | inet::ieee80211::OriginatorBlockAckAgreementPolicy::receiveSignal | modesetChanged |
Dcaf | inet::ieee80211::Dcaf::receiveSignal | modesetChanged |
Edcaf | inet::ieee80211::Edcaf::receiveSignal | modesetChanged |
Dcf | inet::ieee80211::Dcf::corruptedFrameReceived | corruptedFrameReceived |
Dcf | inet::ieee80211::Dcf::processLowerFrame | processLowerFrame(%s) |
Dcf | inet::ieee80211::Dcf::processUpperFrame | processUpperFrame(%s) |
Dcf | inet::ieee80211::Dcf::receiveSignal | modesetChanged |
Hcf | inet::ieee80211::Hcf::corruptedFrameReceived | corruptedFrameReceived |
Hcf | inet::ieee80211::Hcf::processLowerFrame | processLowerFrame(%s) |
Hcf | inet::ieee80211::Hcf::processUpperFrame | processUpperFrame(%s) |
Hcf | inet::ieee80211::Hcf::receiveSignal | modesetChanged |
OriginatorAckPolicy | inet::ieee80211::OriginatorAckPolicy::receiveSignal | modesetChanged |
OriginatorQosAckPolicy | inet::ieee80211::OriginatorQosAckPolicy::receiveSignal | modesetChanged |
QosRtsPolicy | inet::ieee80211::QosRtsPolicy::receiveSignal | modesetChanged |
RtsPolicy | inet::ieee80211::RtsPolicy::receiveSignal | modesetChanged |
TxopProcedure | inet::ieee80211::TxopProcedure::receiveSignal | modesetChanged |
OriginatorProtectionMechanism | inet::ieee80211::OriginatorProtectionMechanism::receiveSignal | modesetChanged |
SingleProtectionMechanism | inet::ieee80211::SingleProtectionMechanism::receiveSignal | modesetChanged |
AarfRateControl | inet::ieee80211::AarfRateControl::receiveSignal | modesetChanged |
QosRateSelection | inet::ieee80211::QosRateSelection::receiveSignal | modesetChanged |
RateSelection | inet::ieee80211::RateSelection::receiveSignal | modesetChanged |
CtsPolicy | inet::ieee80211::CtsPolicy::receiveSignal | modesetChanged |
QosCtsPolicy | inet::ieee80211::QosCtsPolicy::receiveSignal | modesetChanged |
RecipientAckPolicy | inet::ieee80211::RecipientAckPolicy::receiveSignal | modesetChanged |
RecipientQosAckPolicy | inet::ieee80211::RecipientQosAckPolicy::receiveSignal | modesetChanged |
InterfaceTable | inet::InterfaceTable::interfaceChanged | interfaceChanged |
ApskScalarRadio | inet::physicallayer::ApskRadio::setRadioMode | setRadioMode |
Ieee80211OfdmRadio | inet::physicallayer::Ieee80211OfdmRadio::setRadioMode | setRadioMode |
Ieee80211DimensionalRadio | inet::physicallayer::Ieee80211Radio::setRadioMode | setRadioMode |
Ieee80211Radio | inet::physicallayer::Ieee80211Radio::setRadioMode | setRadioMode |
Ieee80211ScalarRadio | inet::physicallayer::Ieee80211Radio::setRadioMode | setRadioMode |
Ieee80211UnitDiskRadio | inet::physicallayer::Radio::setRadioMode | setRadioMode |
UnitDiskRadio | inet::physicallayer::UnitDiskRadio::setRadioMode | setRadioMode |
Called methods (observed)
function | info | call from |
---|---|---|
inet::ieee80211::Ieee80211Mac::handleOperationStage | handleOperationStage | ScenarioManager, SimpleEpEnergyManagement, SimpleEpEnergyStorage |
inet::ieee80211::Ieee80211Mac::processLowerFrame | processLowerFrame("%s") | Ieee80211Mac |
inet::ieee80211::Ieee80211Mac::processUpperFrame | processUpperFrame("%s") | Ds, Ieee80211Mac |
inet::ieee80211::Ieee80211Mac::receiveSignal | radioModeChanged | ApskScalarRadio, Ieee80211OfdmRadio, Ieee80211DimensionalRadio, Ieee80211Radio, Ieee80211ScalarRadio, Ieee80211UnitDiskRadio, UnitDiskRadio |
inet::ieee80211::Ieee80211Mac::receiveSignal | receivedSignalPartChanged | ApskScalarRadio, Ieee80211OfdmRadio, Ieee80211DimensionalRadio, Ieee80211Radio, Ieee80211ScalarRadio, Ieee80211UnitDiskRadio, UnitDiskRadio |
inet::ieee80211::Ieee80211Mac::receiveSignal | receptionStateChanged | ApskScalarRadio, Ieee80211OfdmRadio, Ieee80211DimensionalRadio, Ieee80211Radio, Ieee80211ScalarRadio, Ieee80211UnitDiskRadio, UnitDiskRadio |
inet::ieee80211::Ieee80211Mac::receiveSignal | transmissionStateChanged | ApskScalarRadio, Ieee80211OfdmRadio, Ieee80211DimensionalRadio, Ieee80211Radio, Ieee80211ScalarRadio, Ieee80211UnitDiskRadio, UnitDiskRadio |
inet::ieee80211::Ieee80211Mac::sendDownFrame | sendDownFrame("%s") | Tx |
inet::ieee80211::Ieee80211Mac::sendUp | sendUp("%s") | Ds |
inet::ieee80211::Ieee80211Mac::sendUpFrame | sendUpFrame("%s") | Dcf, Hcf |
Incoming messages (observed)
Outgoing messages (observed)
Packet operations (observed)
chunkType | packetAction |
---|---|
Ieee80211DataHeader | insertAtFront |
Ieee80211DataOrMgmtHeader | peekAtFront, popAtFront |
Ieee80211MacHeader | peekAtFront |
Ieee80211MacTrailer | insertAtBack, popAtBack |
Ieee80211MgmtHeader | insertAtFront |
Shared Tagging operations (observed)
tagType | tagAction |
---|---|
ErrorRateInd | findTag |
Ieee80211SubtypeReq | getTag |
InterfaceInd | addTagIfAbsent |
MacAddressInd | addTagIfAbsent |
MacAddressReq | getTag |
PacketProtocolTag | addTagIfAbsent, getTag |
UserPriorityInd | addTagIfAbsent |
UserPriorityReq | findTag |
LlcProtocolTag | addTagIfAbsent |
Source code
// // Implementation of the 802.11 MAC protocol. This module is intended // to be used in combination with the ~Ieee80211Radio module as the physical // layer. // // This module has been heavily modularized to enable customization // and extension of almost any aspect of its operation, with the aim of // better supporting experimentation and research. Because of that, its // features and details of operation are determined by its several // subcomponents, and can be altered by extending or replacing the // appropriate subcomponents. // // Some noteworthy features are: // // - Support for 802.11a/b/g/e/p, as well as partial/incomplete support for // later WiFi standards such as n and ac. // // - Implements DCF and HCF channel access, including support for QoS (EDCA). // // - Support for both infrastructure mode and ad hoc mode operation. // // - In infrastructure mode, authentication and association can be // implicit, or explicitly modeled using frame exchanges. // // - Support for advanced MAC features such as frame aggregation, // fragmentation, block acknowledgement and block agreements, // rate selection and adaptive rate control algorithms like AARF and // ONOE. // // - Ability to work with radio models of varying levels of detail, // from simple unit disk radio models to layered radio models that // explicitly model forward error correction, scrambling, symbol // encoding/decoding, etc, and may represent radio signals with a // multi-dimensional power density function over time and frequency. // // - Support for energy consumption modeling. // // The IEEE 802.11 header is represented by ~Ieee80211MacHeader and its // subclasses. // // Note about the implementation: // // Despite its appearance, Ieee80211Mac is not a plain compound module. // Although the bulk of its functionality is outsourced to submodules, // it is an active module with an underlying C++ class that subclasses // from cSimpleModule, and receives/sends messages on its own behalf. // // Notable omissions: // // - PCF is missing // - HCCA is currently not implemented. (The module exists, but it is // currently a placeholder.) // - Fields related to unsupported features are omitted from frame formats // as well (for example, FH/DS/CF parameter sets, beacon/probe timestamp // which is related to physical layer synchronization, listen interval // which is related to power management, capability information // which is related to PCF and other non-modeled features). // module Ieee80211Mac extends MacProtocolBase like IIeee80211Mac { parameters: string mibModule; string modeSet @enum("a","b","g(erp)","g(mixed)","n(mixed-2.4Ghz)","p","ac") = default("g(mixed)"); string fcsMode @enum("declared","computed") = default("declared"); string initialRadioMode @enum("off","sleep","receiver","transmitter","transceiver") = default("receiver"); int mtu @unit(B) = default(2304B); bool qosStation = default(false); *.mibModule = default(absPath(this.mibModule)); *.rxModule = "^.rx"; *.txModule = "^.tx"; @display("i=block/layer"); @class(Ieee80211Mac); @signal[linkBroken](type=inet::Packet); // TODO this signal is only present for the statistic to pass the signal check, to be removed @signal[modesetChanged](type=inet::physicallayer::Ieee80211ModeSet); @statistic[packetSentToUpper](title="packets sent to upper layer"; record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none); @statistic[packetSentToLower](title="packets sent to lower layer"; record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none); @statistic[packetReceivedFromUpper](title="packets received from upper layer"; record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none); @statistic[packetReceivedFromLower](title="packets received from lower layer"; record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none); @statistic[linkBroken](title="link breaks"; record=count,vector?; interpolationmode=none); @statistic[packetDrop](title="packet drops"; source=packetDropped; record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none); @statistic[packetDropIncorrectlyReceived](title="packet drops: incorrectly received"; source=packetDropReasonIsIncorrectlyReceived(packetDropped); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none); @statistic[packetDropNotAddressedToUs](title="packet drops: not addressed to us"; source=packetDropReasonIsNotAddressedToUs(packetDropped); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none); @statistic[packetDropQueueOverflow](title="packet drops: queue overflow"; source=packetDropReasonIsQueueOverflow(packetDropped); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none); @statistic[packetDropRetryLimitReached](title="packet drops: retry limit reached"; source=packetDropReasonIsRetryLimitReached(packetDropped); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none); @statistic[packetDropDuplicateDetected](title="packet drops: duplicate detected"; source=packetDropReasonIsDuplicateDetected(packetDropped); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none); @statistic[packetDropOther](title="packet drops: other"; source=packetDropReasonIsOther(packetDropped); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none); gates: input mgmtIn; output mgmtOut; submodules: dcf: <default("Dcf")> like IDcf { parameters: @display("p=100,100"); } hcf: <default("Hcf")> like IHcf if qosStation { parameters: @display("p=250,100"); } ds: <default("Ds")> like IDs { parameters: @display("p=400,100"); } rx: <default("Rx")> like IRx { parameters: @display("p=100,200"); } tx: <default("Tx")> like ITx { parameters: @display("p=250,200"); } }File: src/inet/linklayer/ieee80211/mac/Ieee80211Mac.ned