Hcf¶
Package: inet.linklayer.ieee80211.mac.coordinationfunction
compound module Hcf
Implements the HCF (Hybrid Coordination Function) for IEEE 802.11.
Usage diagram¶
Inheritance diagram¶
Used in compound modules¶
Name |
Type |
Description |
|---|---|---|
compound module |
Implementation of the 802.11 MAC protocol. This module is intended to be used in combination with the Ieee80211Radio module as the physical layer. |
Extends¶
Name |
Type |
Description |
|---|---|---|
compound module |
Base module for all INET compound modules. |
Parameters¶
Name |
Type |
Default value |
Description |
|---|---|---|---|
displayStringTextFormat |
string |
“{frameSequenceInfo}” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
isBlockAckSupported |
bool |
false |
|
rxModule |
string |
||
txModule |
string |
Properties¶
Name |
Value |
Description |
|---|---|---|
class |
Hcf |
|
display |
i=block/layer |
Signals¶
Name |
Type |
Unit |
Description |
|---|---|---|---|
blockAckAgreementAdded |
|||
blockAckAgreementDeleted |
|||
datarateSelected |
double |
||
edcaCollisionDetected |
unsigned long |
||
frameSequenceAborted |
|||
frameSequenceFinished |
|||
frameSequenceStarted |
|||
linkBroken |
|||
packetDropped |
|||
packetReceivedFromPeer |
|||
packetSentToPeer |
Statistics¶
Name |
Title |
Source |
Record |
Unit |
Interpolation Mode |
Description |
|---|---|---|---|---|---|---|
blockAckAgreementActive |
active block ack agreements |
warmup(count(blockAckAgreementAdded)-count(blockAckAgreementDeleted)) |
vector |
sample-hold |
||
blockAckAgreementAdded |
added block ack agreements |
count |
||||
blockAckAgreementDeleted |
deleted block ack agreements |
count |
||||
datarateSelected |
datarates selected |
vector |
none |
|||
edcaCollisionDetected |
EDCA collisions detected |
count |
||||
frameSequenceActive |
frame sequence active |
warmup(count(frameSequenceStarted)-count(frameSequenceFinished)) |
vector |
sample-hold |
||
frameSequenceDuration |
frame sequence durations |
frameSequenceDuration(frameSequenceFinished) |
histogram,vector? |
|||
frameSequenceFinished |
finished frame sequences |
count,vector? |
||||
frameSequenceNumPackets |
frame sequences: number of packets |
frameSequenceNumPackets(frameSequenceFinished) |
histogram,vector? |
|||
linkBroken |
link breaks |
count,vector? |
none |
|||
packetDrop |
packet drops |
packetDropped |
count,sum(packetBytes),vector(packetBytes) |
none |
||
packetDropNotAddressedToUs |
packet drops: not addressed to us |
packetDropReasonIsNotAddressedToUs(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 |
||
packetReceivedFromPeer |
packets received |
none |
||||
packetReceivedFromPeerBroadcast |
packets received: broadcast |
ieee80211Broadcast(packetReceivedFromPeer) |
count,sum(packetBytes),vector(packetBytes) |
none |
||
packetReceivedFromPeerMulticast |
packets received: multicast |
ieee80211Multicast(packetReceivedFromPeer) |
count,sum(packetBytes),vector(packetBytes) |
none |
||
packetReceivedFromPeerUnicast |
packets received: unicast |
ieee80211Unicast(packetReceivedFromPeer) |
count,sum(packetBytes),vector(packetBytes) |
none |
||
packetReceivedFromPeerWithoutRetry |
packets received: without retry |
ieee80211NotRetry(packetReceivedFromPeer) |
count,sum(packetBytes),vector(packetBytes) |
none |
||
packetReceivedFromPeerWithRetry |
packets received: with retry |
ieee80211Retry(packetReceivedFromPeer) |
count,sum(packetBytes),vector(packetBytes) |
none |
||
packetSentToPeer |
packets sent |
count,sum(packetBytes),vector(packetBytes) |
none |
|||
packetSentToPeerBroadcast |
packets sent: broadcast |
ieee80211Broadcast(packetSentToPeer) |
count,sum(packetBytes),vector(packetBytes) |
none |
||
packetSentToPeerMulticast |
packets sent: multicast |
ieee80211Multicast(packetSentToPeer) |
count,sum(packetBytes),vector(packetBytes) |
none |
||
packetSentToPeerUnicast |
packets sent: unicast |
ieee80211Unicast(packetSentToPeer) |
count,sum(packetBytes),vector(packetBytes) |
none |
||
packetSentToPeerWithoutRetry |
packets sent: without retry |
ieee80211NotRetry(packetSentToPeer) |
count,sum(packetBytes),vector(packetBytes) |
none |
||
packetSentToPeerWithRetry |
packets sent: with retry |
ieee80211Retry(packetSentToPeer) |
count,sum(packetBytes),vector(packetBytes) |
none |
Unassigned submodule parameters¶
Name |
Type |
Default value |
Description |
|---|---|---|---|
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 |
edca.edcaf.pendingQueue.packetCapacity |
int |
100 |
Maximum number of packets in the queue, no limit by default |
edca.edcaf.pendingQueue.dataCapacity |
int |
-1b |
Maximum total length of packets in the queue, no limit by default |
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 |
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 |
edca.edcaf.pendingQueue.bufferModule |
string |
“” |
Relative module path to the IPacketBuffer module used by this queue, implicit buffer by default |
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 |
edca.edcaf.inProgressFrames.pendingQueueModule |
string |
“^.pendingQueue” |
|
edca.edcaf.inProgressFrames.originatorMacDataServiceModule |
string |
“^.^.^.originatorMacDataService” |
|
edca.edcaf.inProgressFrames.ackHandlerModule |
string |
“^.ackHandler” |
|
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 |
edca.edcaf.contention.initialChannelBusy |
bool |
true |
Assume that the channel was busy before the simulation started |
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 |
edca.edcaf.ackHandler.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
edca.edcaf.txopProcedure.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
edca.edcaf.txopProcedure.txopLimit |
double |
-1s |
|
edca.edcaf.recoveryProcedure.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
edca.edcaf.recoveryProcedure.shortRetryLimit |
int |
7 |
|
edca.edcaf.recoveryProcedure.longRetryLimit |
int |
4 |
|
edca.collisionController.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
edca.mgmtAndNonQoSRecoveryProcedure.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
edca.mgmtAndNonQoSRecoveryProcedure.shortRetryLimit |
int |
7 |
|
edca.mgmtAndNonQoSRecoveryProcedure.longRetryLimit |
int |
4 |
|
hcca.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
originatorMacDataService.msduAggregationPolicy.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
originatorMacDataService.msduAggregationPolicy.subframeNumThreshold |
int |
-1 |
Minimum number of subframes needed to compose an A-MSDU. (-1 means it won’t be checked) |
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). |
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). |
|
originatorMacDataService.mpduAggregationPolicy.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
originatorMacDataService.fragmentationPolicy.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
originatorMacDataService.fragmentationPolicy.fragmentationThreshold |
int |
1500B |
|
singleProtectionMechanism.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
singleProtectionMechanism.rateSelectionModule |
string |
||
rateSelection.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
rateSelection.multicastFrameBitrate |
double |
-1bps |
|
rateSelection.responseAckFrameBitrate |
double |
-1bps |
|
rateSelection.responseBlockAckFrameBitrate |
double |
-1bps |
|
rateSelection.responseCtsFrameBitrate |
double |
-1bps |
|
rateSelection.dataFrameBitrate |
double |
-1bps |
Fastest |
rateSelection.dataFrameBandwidth |
double |
nan Hz |
Unspecified by default |
rateSelection.dataFrameNumSpatialStreams |
int |
-1 |
Unspecified by default |
rateSelection.mgmtFrameBitrate |
double |
-1bps |
Fastest |
rateSelection.controlFrameBitrate |
double |
-1bps |
|
originatorAckPolicy.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
originatorAckPolicy.rateSelectionModule |
string |
||
originatorAckPolicy.blockAckReqThreshold |
int |
5 |
|
originatorAckPolicy.maxBlockAckPolicyFrameLength |
int |
1000B |
|
originatorAckPolicy.blockAckTimeout |
double |
-1s |
|
originatorAckPolicy.ackTimeout |
double |
-1s |
|
recipientAckPolicy.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
recipientAckPolicy.rateSelectionModule |
string |
||
rtsPolicy.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
rtsPolicy.rateSelectionModule |
string |
||
rtsPolicy.ctsTimeout |
double |
-1s |
|
rtsPolicy.rtsThreshold |
int |
2346B |
|
ctsPolicy.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
ctsPolicy.rxModule |
string |
||
ctsPolicy.rateSelectionModule |
string |
||
originatorBlockAckAgreementPolicy.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
originatorBlockAckAgreementPolicy.delayedAckPolicySupported |
bool |
false |
|
originatorBlockAckAgreementPolicy.aMsduSupported |
bool |
true |
|
originatorBlockAckAgreementPolicy.maximumAllowedBufferSize |
int |
64 |
|
originatorBlockAckAgreementPolicy.blockAckTimeoutValue |
double |
0s |
0 means that it depends on the originator |
recipientBlockAckAgreementPolicy.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
recipientBlockAckAgreementPolicy.delayedAckPolicySupported |
bool |
false |
|
recipientBlockAckAgreementPolicy.aMsduSupported |
bool |
true |
|
recipientBlockAckAgreementPolicy.maximumAllowedBufferSize |
int |
64 |
|
recipientBlockAckAgreementPolicy.blockAckTimeoutValue |
double |
0s |
0 means that it depends on the originator |
Source code¶
//
// Implements the HCF (Hybrid Coordination Function) for IEEE 802.11.
//
module Hcf extends Module like IHcf
{
parameters:
bool isBlockAckSupported = default(false);
string rxModule;
string txModule;
*.rateSelectionModule = "^.rateSelection";
*.rxModule = "^." + this.rxModule;
*.*.originatorMacDataServiceModule = "^.^.originatorMacDataService";
@class(Hcf);
displayStringTextFormat = default("{frameSequenceInfo}");
@display("i=block/layer");
@signal[packetSentToPeer](type=inet::Packet);
@signal[packetReceivedFromPeer](type=inet::Packet);
@signal[linkBroken](type=inet::Packet);
@signal[packetDropped](type=inet::Packet);
@signal[edcaCollisionDetected](type=unsigned long);
@signal[frameSequenceStarted];
@signal[frameSequenceFinished];
@signal[frameSequenceAborted];
@signal[datarateSelected](type=double);
@signal[blockAckAgreementAdded];
@signal[blockAckAgreementDeleted];
@statistic[packetSentToPeer](title="packets sent"; record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none);
@statistic[packetSentToPeerUnicast](title="packets sent: unicast"; source=ieee80211Unicast(packetSentToPeer); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none);
@statistic[packetSentToPeerMulticast](title="packets sent: multicast"; source=ieee80211Multicast(packetSentToPeer); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none);
@statistic[packetSentToPeerBroadcast](title="packets sent: broadcast "; source=ieee80211Broadcast(packetSentToPeer); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none);
@statistic[packetSentToPeerWithRetry](title="packets sent: with retry"; source=ieee80211Retry(packetSentToPeer); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none);
@statistic[packetSentToPeerWithoutRetry](title="packets sent: without retry"; source=ieee80211NotRetry(packetSentToPeer); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none);
@statistic[packetReceivedFromPeer](title="packets received"; count,sum(packetBytes),vector(packetBytes); interpolationmode=none);
@statistic[packetReceivedFromPeerUnicast](title="packets received: unicast"; source=ieee80211Unicast(packetReceivedFromPeer); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none);
@statistic[packetReceivedFromPeerMulticast](title="packets received: multicast"; source=ieee80211Multicast(packetReceivedFromPeer); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none);
@statistic[packetReceivedFromPeerBroadcast](title="packets received: broadcast"; source=ieee80211Broadcast(packetReceivedFromPeer); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none);
@statistic[packetReceivedFromPeerWithRetry](title="packets received: with retry"; source=ieee80211Retry(packetReceivedFromPeer); record=count,sum(packetBytes),vector(packetBytes); interpolationmode=none);
@statistic[packetReceivedFromPeerWithoutRetry](title="packets received: without retry"; source=ieee80211NotRetry(packetReceivedFromPeer); 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[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[edcaCollisionDetected](title="EDCA collisions detected"; record=count);
@statistic[frameSequenceFinished](title="finished frame sequences"; record=count,vector?);
@statistic[frameSequenceDuration](title="frame sequence durations"; source=frameSequenceDuration(frameSequenceFinished); record=histogram,vector?);
@statistic[frameSequenceNumPackets](title="frame sequences: number of packets"; source=frameSequenceNumPackets(frameSequenceFinished); record=histogram,vector?);
@statistic[frameSequenceActive](title="frame sequence active"; source=warmup(count(frameSequenceStarted)-count(frameSequenceFinished)); record=vector; interpolationmode=sample-hold; autoWarmupFilter=false);
@statistic[datarateSelected](title="datarates selected"; record=vector; interpolationmode=none);
@statistic[blockAckAgreementAdded](title="added block ack agreements"; record=count);
@statistic[blockAckAgreementDeleted](title="deleted block ack agreements"; record=count);
@statistic[blockAckAgreementActive](title="active block ack agreements"; source=warmup(count(blockAckAgreementAdded)-count(blockAckAgreementDeleted)); record=vector; interpolationmode=sample-hold; autoWarmupFilter=false);
submodules:
edca: Edca {
parameters:
@display("p=150,100");
}
hcca: Hcca {
parameters:
@display("p=150,200");
}
originatorMacDataService: OriginatorQosMacDataService {
parameters:
@display("p=150,300");
}
recipientMacDataService: RecipientQosMacDataService {
parameters:
@display("p=150,400");
}
singleProtectionMechanism: SingleProtectionMechanism {
parameters:
@display("p=150,500");
}
rateSelection: QosRateSelection {
parameters:
rateControlModule = "^.rateControl";
@display("p=350,100");
}
rateControl: <default("")> like IRateControl if typename != "" {
parameters:
@display("p=350,200");
}
originatorAckPolicy: <default("OriginatorQosAckPolicy")> like IOriginatorQosAckPolicy {
parameters:
@display("p=550,100");
}
recipientAckPolicy: <default("RecipientQosAckPolicy")> like IRecipientQosAckPolicy {
parameters:
@display("p=550,200");
}
rtsPolicy: <default("QosRtsPolicy")> like IRtsPolicy {
parameters:
@display("p=550,300");
}
ctsPolicy: <default("QosCtsPolicy")> like ICtsPolicy {
parameters:
@display("p=550,400");
}
originatorBlockAckAgreementPolicy: <default("OriginatorBlockAckAgreementPolicy")> like IOriginatorBlockAckAgreementPolicy if isBlockAckSupported {
parameters:
originatorAckPolicyModule = "^.originatorAckPolicy";
@display("p=550,500");
}
recipientBlockAckAgreementPolicy: <default("RecipientBlockAckAgreementPolicy")> like IRecipientBlockAckAgreementPolicy if isBlockAckSupported {
parameters:
@display("p=550,600");
}
}
File: src/inet/linklayer/ieee80211/mac/coordinationfunction/Hcf.ned