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).
Usage diagram¶
Inheritance diagram¶
Used in compound modules¶
Name |
Type |
Description |
|---|---|---|
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. |
|
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 |
|---|---|---|
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 |
TODO this signal is only present for the statistic to pass the signal check, to be removed |
||
modesetChanged |
|||
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 |
||
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
|
string |
|||
double |
-1s |
||
int |
2346B |
||
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
|
string |
|||
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 |
|
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 |
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 |
||
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
|
string |
|||
double |
-1s |
||
int |
2346B |
||
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
|
string |
|||
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");
}
}