Dcf¶
Package: inet.linklayer.ieee80211.mac.coordinationfunction
compound module Dcf
Implements the DCF (Distributed 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 |
rxModule |
string |
||
txModule |
string |
Properties¶
Name |
Value |
Description |
|---|---|---|
class |
Dcf |
|
display |
i=block/layer |
Signals¶
Name |
Type |
Unit |
Description |
|---|---|---|---|
datarateSelected |
double |
||
frameSequenceFinished |
|||
frameSequenceStarted |
|||
linkBroken |
|||
packetDropped |
|||
packetReceivedFromPeer |
|||
packetSentToPeer |
Statistics¶
Name |
Title |
Source |
Record |
Unit |
Interpolation Mode |
Description |
|---|---|---|---|---|---|---|
datarateSelected |
datarates selected |
vector |
none |
|||
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 |
||||
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 |
count,sum(packetBytes),vector(packetBytes) |
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 |
|---|---|---|---|
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 |
channelAccess.pendingQueue.packetCapacity |
int |
100 |
Maximum number of packets in the queue, no limit by default |
channelAccess.pendingQueue.dataCapacity |
int |
-1b |
Maximum total length of packets in the queue, no limit by default |
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 |
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 |
channelAccess.pendingQueue.bufferModule |
string |
“” |
Relative module path to the IPacketBuffer module used by this queue, implicit buffer by default |
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 |
channelAccess.inProgressFrames.pendingQueueModule |
string |
“^.pendingQueue” |
|
channelAccess.inProgressFrames.originatorMacDataServiceModule |
string |
“^.^.originatorMacDataService” |
|
channelAccess.inProgressFrames.ackHandlerModule |
string |
“^.^.ackHandler” |
|
channelAccess.contention.displayStringTextFormat |
string |
“{fsmState}” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
channelAccess.contention.initialChannelBusy |
bool |
true |
Assume that the channel was busy before the simulation started |
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 |
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 |
|
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.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 |
|
recoveryProcedure.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
recoveryProcedure.shortRetryLimit |
int |
7 |
|
recoveryProcedure.longRetryLimit |
int |
4 |
|
originatorProtectionMechanism.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
originatorProtectionMechanism.rateSelectionModule |
string |
||
ackHandler.displayStringTextFormat |
string |
“” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
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.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 |
Source code¶
//
// Implements the DCF (Distributed Coordination Function) for IEEE 802.11.
//
module Dcf extends Module like IDcf
{
parameters:
string rxModule;
string txModule;
*.rateSelectionModule = "^.rateSelection";
*.rxModule = "^." + this.rxModule;
@class(Dcf);
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[frameSequenceStarted];
@signal[frameSequenceFinished];
@signal[datarateSelected](type=double);
@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"; record=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[frameSequenceFinished](title="finished frame sequences"; record=count);
@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);
submodules:
// TODO consider merging Dcaf into Dcf because it's not like the relationship between Hcf and Edcaf or
// TODO maybe move PendingQueue and InProgressFrames in Edcaf?
channelAccess: Dcaf {
parameters:
@display("p=150,100");
}
originatorMacDataService: OriginatorMacDataService {
parameters:
@display("p=150,200");
}
recipientMacDataService: RecipientMacDataService {
parameters:
@display("p=150,300");
}
rateSelection: RateSelection {
parameters:
rateControlModule = "^.rateControl";
@display("p=350,100");
}
rateControl: <default("")> like IRateControl if typename != "" {
parameters:
@display("p=350,200");
}
recoveryProcedure: NonQosRecoveryProcedure {
parameters:
cwCalculatorModule = "^.channelAccess";
rtsPolicyModule = "^.rtsPolicy";
@display("p=350,300");
}
originatorProtectionMechanism: OriginatorProtectionMechanism {
parameters:
@display("p=150,400");
}
ackHandler: AckHandler {
parameters:
@display("p=350,400");
}
originatorAckPolicy: <default("OriginatorAckPolicy")> like IOriginatorAckPolicy {
parameters:
@display("p=550,100");
}
recipientAckPolicy: <default("RecipientAckPolicy")> like IRecipientAckPolicy {
parameters:
@display("p=550,200");
}
rtsPolicy: <default("RtsPolicy")> like IRtsPolicy {
parameters:
@display("p=550,300");
}
ctsPolicy: <default("CtsPolicy")> like ICtsPolicy {
parameters:
@display("p=550,400");
}
}
File: src/inet/linklayer/ieee80211/mac/coordinationfunction/Dcf.ned