Dcf

Package: inet.linklayer.ieee80211.mac.coordinationfunction

compound module Dcf

Implements the DCF (Distributed Coordination Function) for IEEE 802.11.

DcfchannelAccess: inet.linklayer.ieee80211.mac.channelaccess.Dcaf Implements the DCAF (Distributed Channel Access Function) for IEEE 802.11. Source: channelAccess: Dcaf { parameters: @display("p=150,100"); }channelAccessoriginatorMacDataService: inet.linklayer.ieee80211.mac.originator.OriginatorMacDataService Implements the MAC data service for the originator (sender) side in non-QoS IEEE 802.11 networks. Source: originatorMacDataService: OriginatorMacDataService { parameters: @display("p=150,200"); }originatorMacDataServicerecipientMacDataService: inet.linklayer.ieee80211.mac.recipient.RecipientMacDataService Implements the MAC data service for the recipient side in non-QoS IEEE 802.11 networks. Source: recipientMacDataService: RecipientMacDataService { parameters: @display("p=150,300"); }recipientMacDataServicerateSelection: inet.linklayer.ieee80211.mac.rateselection.RateSelection Implements the default rate selection algorithm. Source: rateSelection: RateSelection { parameters: rateControlModule = "^.rateControl"; @display("p=350,100"); }rateSelectionrateControl: inet.linklayer.ieee80211.mac.contract.IRateControl (like IRateControl) IRateControl: Interface for auto rate control modules. Source: rateControl: <default("")> like IRateControl if typename != "" { parameters: @display("p=350,200"); }rateControlrecoveryProcedure: inet.linklayer.ieee80211.mac.originator.NonQosRecoveryProcedure Implements frame retransmission and recovery procedures for non-QoS frames in IEEE 802.11 networks. Source: recoveryProcedure: NonQosRecoveryProcedure { parameters: cwCalculatorModule = "^.channelAccess"; rtsPolicyModule = "^.rtsPolicy"; @display("p=350,300"); }recoveryProcedureoriginatorProtectionMechanism: inet.linklayer.ieee80211.mac.protectionmechanism.OriginatorProtectionMechanism Calculates the Duration/ID field for IEEE 802.11 frames to implement the Network Allocation Vecto... Source: originatorProtectionMechanism: OriginatorProtectionMechanism { parameters: @display("p=150,400"); }originatorProtectionMechanismackHandler: inet.linklayer.ieee80211.mac.originator.AckHandler Manages acknowledgment (ACK) status tracking for transmitted frames in IEEE 802.11 networks. Source: ackHandler: AckHandler { parameters: @display("p=350,400"); }ackHandleroriginatorAckPolicy: inet.linklayer.ieee80211.mac.originator.OriginatorAckPolicy (like IOriginatorAckPolicy) OriginatorAckPolicy: Implements the default originator ACK policy for non-QoS stations. IOriginatorAckPolicy: Interface for originator ACK policies. Source: originatorAckPolicy: <default("OriginatorAckPolicy")> like IOriginatorAckPolicy { parameters: @display("p=550,100"); }originatorAckPolicyrecipientAckPolicy: inet.linklayer.ieee80211.mac.recipient.RecipientAckPolicy (like IRecipientAckPolicy) RecipientAckPolicy: Implements the default recipient ACK policy. IRecipientAckPolicy: Interface for recipient ACK policies. Source: recipientAckPolicy: <default("RecipientAckPolicy")> like IRecipientAckPolicy { parameters: @display("p=550,200"); }recipientAckPolicyrtsPolicy: inet.linklayer.ieee80211.mac.originator.RtsPolicy (like IRtsPolicy) RtsPolicy: Implements the default RTS policy. IRtsPolicy: Interface for RTS policies. Source: rtsPolicy: <default("RtsPolicy")> like IRtsPolicy { parameters: @display("p=550,300"); }rtsPolicyctsPolicy: inet.linklayer.ieee80211.mac.recipient.CtsPolicy (like ICtsPolicy) CtsPolicy: Implements the default CTS policy. ICtsPolicy: Interface for CTS policies. Source: ctsPolicy: <default("CtsPolicy")> like ICtsPolicy { parameters: @display("p=550,400"); }ctsPolicy

Usage diagram

Inheritance diagram

Used in compound modules

Name

Type

Description

Ieee80211Mac

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

Module

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

inet::Packet

packetDropped

inet::Packet

packetReceivedFromPeer

inet::Packet

packetSentToPeer

inet::Packet

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