Ieee80211Mac

Package: inet.linklayer.ieee80211.mac

compound module Ieee80211Mac

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).

Ieee80211Macdcf: inet.linklayer.ieee80211.mac.coordinationfunction.Dcf (like IDcf) Dcf: Implements the DCF (Distributed Coordination Function) for IEEE 802.11. IDcf: Interface for modules that implement the DCF (Distributed Coordination Function) for IEEE 802.11. Source: dcf: <default("Dcf")> like IDcf { parameters: @display("p=100,100"); }dcfhcf: inet.linklayer.ieee80211.mac.coordinationfunction.Hcf (like IHcf) Hcf: Implements the HCF (Hybrid Coordination Function) for IEEE 802.11. IHcf: Interface for modules that implement the HCF (Hybrid Coordination Function) for IEEE 802.11. Source: hcf: <default("Hcf")> like IHcf if qosStation { parameters: @display("p=250,100"); }hcfds: inet.linklayer.ieee80211.mac.Ds (like IDs) Ds: Implements the DS (Distribution Service) for IEEE 802.11, which is responsible for distributing c... IDs: Interface for modules that implement the frame Distribution Service for IEEE 802.11. Source: ds: <default("Ds")> like IDs { parameters: @display("p=400,100"); }dsrx: inet.linklayer.ieee80211.mac.Rx (like IRx) Rx: Responsible for checking frames received over the radio for errors, for managing the NAV, and for... IRx: Interface for Rx processes. Source: rx: <default("Rx")> like IRx { parameters: @display("p=100,200"); }rxtx: inet.linklayer.ieee80211.mac.Tx (like ITx) Tx: Responsible for unconditionally transmitting a frame after waiting for a specified inter-frame sp... ITx: Interface for processes that unconditionally transmit a frame after waiting for a specified inter... Source: tx: <default("Tx")> like ITx { parameters: @display("p=250,200"); }tx

Usage diagram

Inheritance diagram

Used in compound modules

Name

Type

Description

ExtUpperIeee80211Interface

compound module

Provides an IEEE 802.11 network interface suitable for emulation. The upper part of the network interface is realized in the real world using a real TAP device of the host computer which is running the simulation.

Ieee80211Interface

compound module

Implements an IEEE 802.11 network interface. It implements a large subset of the IEEE 802.11 standard, and may use radio models and wireless signal representations of varying levels of detail. It is also extremely configurable, and its component structure makes it easy to experiment with various details of the protocol.

Extends

Name

Type

Description

MacProtocolBase

simple module

Module base for different MAC protocols.

Parameters

Name

Type

Default value

Description

displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

interfaceTableModule

string

mibModule

string

modeSet

string

“g(mixed)”

fcsMode

string

“declared”

initialRadioMode

string

“receiver”

mtu

int

2304B

qosStation

bool

false

Properties

Name

Value

Description

class

Ieee80211Mac

display

i=block/layer

Gates

Name

Direction

Size

Description

upperLayerIn

input

upperLayerOut

output

lowerLayerIn

input

lowerLayerOut

output

mgmtIn

input

mgmtOut

output

Signals

Name

Type

Unit

Description

linkBroken

inet::Packet

TODO this signal is only present for the statistic to pass the signal check, to be removed

modesetChanged

inet::physicallayer::Ieee80211ModeSet

packetDropped

cPacket

packetReceivedFromLower

cPacket

packetReceivedFromUpper

cPacket

packetSentToLower

cPacket

packetSentToUpper

cPacket

Statistics

Name

Title

Source

Record

Unit

Interpolation Mode

Description

linkBroken

link breaks

count,vector?

none

packetDrop

packet drops

packetDropped

count,sum(packetBytes),vector(packetBytes)

none

packetDropDuplicateDetected

packet drops: duplicate detected

packetDropReasonIsDuplicateDetected(packetDropped)

count,sum(packetBytes),vector(packetBytes)

none

packetDropIncorrectlyReceived

packet drops: incorrectly received

packetDropReasonIsIncorrectlyReceived(packetDropped)

count,sum(packetBytes),vector(packetBytes)

none

packetDropNotAddressedToUs

packet drops: not addressed to us

packetDropReasonIsNotAddressedToUs(packetDropped)

count,sum(packetBytes),vector(packetBytes)

none

packetDropOther

packet drops: other

packetDropReasonIsOther(packetDropped)

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

packetReceivedFromLower

packets received from lower layer

count,sum(packetBytes),vector(packetBytes)

none

packetReceivedFromUpper

packets received from upper layer

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

Unassigned submodule parameters

Name

Type

Default value

Description

dcf.channelAccess.pendingQueue.displayStringTextFormat

string

“contains %p pk (%l) pushed %u\npulled %o removed %r dropped %d”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

dcf.channelAccess.pendingQueue.packetCapacity

int

100

Maximum number of packets in the queue, no limit by default

dcf.channelAccess.pendingQueue.dataCapacity

int

-1b

Maximum total length of packets in the queue, no limit by default

dcf.channelAccess.pendingQueue.dropperClass

string

“inet::queueing::PacketAtCollectionEndDropper”

Determines which packets are dropped when the queue is overloaded, packets are not dropped by default; the parameter must be the name of a C++ class which implements the IPacketDropperFunction C++ interface and is registered via Register_Class

dcf.channelAccess.pendingQueue.comparatorClass

string

“inet::ieee80211::MgmtOverDataComparator”

Determines the order of packets in the queue, insertion order by default; the parameter must be the name of a C++ class which implements the IPacketComparatorFunction C++ interface and is registered via Register_Class

dcf.channelAccess.pendingQueue.bufferModule

string

“”

Relative module path to the IPacketBuffer module used by this queue, implicit buffer by default

dcf.channelAccess.inProgressFrames.displayStringTextFormat

string

“{numInProgress} packets”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

dcf.channelAccess.inProgressFrames.pendingQueueModule

string

“^.pendingQueue”

dcf.channelAccess.inProgressFrames.originatorMacDataServiceModule

string

“^.^.originatorMacDataService”

dcf.channelAccess.inProgressFrames.ackHandlerModule

string

“^.^.ackHandler”

dcf.channelAccess.contention.displayStringTextFormat

string

“{fsmState}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

dcf.channelAccess.contention.initialChannelBusy

bool

true

Assume that the channel was busy before the simulation started

dcf.channelAccess.contention.backoffOptimization

bool

true

We can pretend the frame has arrived into the queue a little bit earlier, and maybe able to start transmitting immediately

dcf.originatorMacDataService.fragmentationPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

dcf.originatorMacDataService.fragmentationPolicy.fragmentationThreshold

int

1500B

dcf.rateSelection.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

dcf.rateSelection.multicastFrameBitrate

double

-1bps

dcf.rateSelection.responseAckFrameBitrate

double

-1bps

dcf.rateSelection.responseCtsFrameBitrate

double

-1bps

dcf.rateSelection.dataFrameBitrate

double

-1bps

Fastest

dcf.rateSelection.dataFrameBandwidth

double

nan Hz

Unspecified by default

dcf.rateSelection.dataFrameNumSpatialStreams

int

-1

Unspecified by default

dcf.rateSelection.mgmtFrameBitrate

double

-1bps

Fastest

dcf.rateSelection.controlFrameBitrate

double

-1bps

dcf.recoveryProcedure.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

dcf.recoveryProcedure.shortRetryLimit

int

7

dcf.recoveryProcedure.longRetryLimit

int

4

dcf.originatorProtectionMechanism.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

dcf.originatorProtectionMechanism.rateSelectionModule

string

dcf.ackHandler.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

dcf.originatorAckPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

dcf.originatorAckPolicy.rateSelectionModule

string

dcf.originatorAckPolicy.ackTimeout

double

-1s

dcf.recipientAckPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

dcf.recipientAckPolicy.rateSelectionModule

string

dcf.rtsPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

dcf.rtsPolicy.rateSelectionModule

string

dcf.rtsPolicy.ctsTimeout

double

-1s

dcf.rtsPolicy.rtsThreshold

int

2346B

dcf.ctsPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

dcf.ctsPolicy.rxModule

string

dcf.ctsPolicy.rateSelectionModule

string

hcf.edca.edcaf.pendingQueue.displayStringTextFormat

string

“contains %p pk (%l) pushed %u\npulled %o removed %r dropped %d”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.edca.edcaf.pendingQueue.packetCapacity

int

100

Maximum number of packets in the queue, no limit by default

hcf.edca.edcaf.pendingQueue.dataCapacity

int

-1b

Maximum total length of packets in the queue, no limit by default

hcf.edca.edcaf.pendingQueue.dropperClass

string

“inet::queueing::PacketAtCollectionEndDropper”

Determines which packets are dropped when the queue is overloaded, packets are not dropped by default; the parameter must be the name of a C++ class which implements the IPacketDropperFunction C++ interface and is registered via Register_Class

hcf.edca.edcaf.pendingQueue.comparatorClass

string

“inet::ieee80211::MgmtOverDataComparator”

Determines the order of packets in the queue, insertion order by default; the parameter must be the name of a C++ class which implements the IPacketComparatorFunction C++ interface and is registered via Register_Class

hcf.edca.edcaf.pendingQueue.bufferModule

string

“”

Relative module path to the IPacketBuffer module used by this queue, implicit buffer by default

hcf.edca.edcaf.inProgressFrames.displayStringTextFormat

string

“{numInProgress} packets”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.edca.edcaf.inProgressFrames.pendingQueueModule

string

“^.pendingQueue”

hcf.edca.edcaf.inProgressFrames.originatorMacDataServiceModule

string

“^.^.^.originatorMacDataService”

hcf.edca.edcaf.inProgressFrames.ackHandlerModule

string

“^.ackHandler”

hcf.edca.edcaf.contention.displayStringTextFormat

string

“{fsmState}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.edca.edcaf.contention.initialChannelBusy

bool

true

Assume that the channel was busy before the simulation started

hcf.edca.edcaf.contention.backoffOptimization

bool

true

We can pretend the frame has arrived into the queue a little bit earlier, and maybe able to start transmitting immediately

hcf.edca.edcaf.ackHandler.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.edca.edcaf.txopProcedure.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.edca.edcaf.txopProcedure.txopLimit

double

-1s

hcf.edca.edcaf.recoveryProcedure.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.edca.edcaf.recoveryProcedure.shortRetryLimit

int

7

hcf.edca.edcaf.recoveryProcedure.longRetryLimit

int

4

hcf.edca.collisionController.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.edca.mgmtAndNonQoSRecoveryProcedure.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.edca.mgmtAndNonQoSRecoveryProcedure.shortRetryLimit

int

7

hcf.edca.mgmtAndNonQoSRecoveryProcedure.longRetryLimit

int

4

hcf.hcca.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.originatorMacDataService.msduAggregationPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.originatorMacDataService.msduAggregationPolicy.subframeNumThreshold

int

-1

Minimum number of subframes needed to compose an A-MSDU. (-1 means it won’t be checked)

hcf.originatorMacDataService.msduAggregationPolicy.aggregationLengthThreshold

int

-1

The minimum length for an aggregated payload necessary to create an A-MSDU (-1 means it won’t be checked).

hcf.originatorMacDataService.msduAggregationPolicy.maxAMsduSize

int

4065

-1 means infinity

hcf.originatorMacDataService.msduAggregationPolicy.qOsCheck

bool

true

Turns on/off the check of the presence of the QoS flag (false means off – this is needed for aggregation in DCF mode).

hcf.originatorMacDataService.mpduAggregationPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.originatorMacDataService.fragmentationPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.originatorMacDataService.fragmentationPolicy.fragmentationThreshold

int

1500B

hcf.singleProtectionMechanism.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.singleProtectionMechanism.rateSelectionModule

string

hcf.rateSelection.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.rateSelection.multicastFrameBitrate

double

-1bps

hcf.rateSelection.responseAckFrameBitrate

double

-1bps

hcf.rateSelection.responseBlockAckFrameBitrate

double

-1bps

hcf.rateSelection.responseCtsFrameBitrate

double

-1bps

hcf.rateSelection.dataFrameBitrate

double

-1bps

Fastest

hcf.rateSelection.dataFrameBandwidth

double

nan Hz

Unspecified by default

hcf.rateSelection.dataFrameNumSpatialStreams

int

-1

Unspecified by default

hcf.rateSelection.mgmtFrameBitrate

double

-1bps

Fastest

hcf.rateSelection.controlFrameBitrate

double

-1bps

hcf.originatorAckPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.originatorAckPolicy.rateSelectionModule

string

hcf.originatorAckPolicy.blockAckReqThreshold

int

5

hcf.originatorAckPolicy.maxBlockAckPolicyFrameLength

int

1000B

hcf.originatorAckPolicy.blockAckTimeout

double

-1s

hcf.originatorAckPolicy.ackTimeout

double

-1s

hcf.recipientAckPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.recipientAckPolicy.rateSelectionModule

string

hcf.rtsPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.rtsPolicy.rateSelectionModule

string

hcf.rtsPolicy.ctsTimeout

double

-1s

hcf.rtsPolicy.rtsThreshold

int

2346B

hcf.ctsPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.ctsPolicy.rxModule

string

hcf.ctsPolicy.rateSelectionModule

string

hcf.originatorBlockAckAgreementPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.originatorBlockAckAgreementPolicy.delayedAckPolicySupported

bool

false

hcf.originatorBlockAckAgreementPolicy.aMsduSupported

bool

true

hcf.originatorBlockAckAgreementPolicy.maximumAllowedBufferSize

int

64

hcf.originatorBlockAckAgreementPolicy.blockAckTimeoutValue

double

0s

0 means that it depends on the originator

hcf.recipientBlockAckAgreementPolicy.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

hcf.recipientBlockAckAgreementPolicy.delayedAckPolicySupported

bool

false

hcf.recipientBlockAckAgreementPolicy.aMsduSupported

bool

true

hcf.recipientBlockAckAgreementPolicy.maximumAllowedBufferSize

int

64

hcf.recipientBlockAckAgreementPolicy.blockAckTimeoutValue

double

0s

0 means that it depends on the originator

ds.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

ds.mibModule

string

rx.displayStringTextFormat

string

“{rxStatus}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

tx.displayStringTextFormat

string

“{txFramePrefix}{txState}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

tx.rxModule

string

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