Hcf

Package: inet.linklayer.ieee80211.mac.coordinationfunction

compound module Hcf

Implements the HCF (Hybrid Coordination Function) for IEEE 802.11.

Hcfedca: inet.linklayer.ieee80211.mac.channelaccess.Edca Implements EDCA (Enhanced Distributed Channel Access) for IEEE 802.11. Source: edca: Edca { parameters: @display("p=150,100"); }edcahcca: inet.linklayer.ieee80211.mac.channelaccess.Hcca Implements HCCA (Hybrid Coordination Function Controlled Channel Access) for IEEE 802.11. Source: hcca: Hcca { parameters: @display("p=150,200"); }hccaoriginatorMacDataService: inet.linklayer.ieee80211.mac.originator.OriginatorQosMacDataService Implements the MAC data service for the originator (sender) side in IEEE 802.11 QoS networks. Source: originatorMacDataService: OriginatorQosMacDataService { parameters: @display("p=150,300"); }originatorMacDataServicerecipientMacDataService: inet.linklayer.ieee80211.mac.recipient.RecipientQosMacDataService Implements the QoS MAC data service for the recipient side in IEEE 802.11 networks. Source: recipientMacDataService: RecipientQosMacDataService { parameters: @display("p=150,400"); }recipientMacDataServicesingleProtectionMechanism: inet.linklayer.ieee80211.mac.protectionmechanism.SingleProtectionMechanism Implements the single protection mechanism for IEEE 802.11 networks as defined in the standard se... Source: singleProtectionMechanism: SingleProtectionMechanism { parameters: @display("p=150,500"); }singleProtectionMechanismrateSelection: inet.linklayer.ieee80211.mac.rateselection.QosRateSelection Implements rate selection for IEEE 802.11 QoS frames. Source: rateSelection: QosRateSelection { 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"); }rateControloriginatorAckPolicy: inet.linklayer.ieee80211.mac.originator.OriginatorQosAckPolicy (like IOriginatorQosAckPolicy) OriginatorQosAckPolicy: Implements the default originator ACK policy for QoS stations. IOriginatorQosAckPolicy: Interface for the originator QoS ACK policies. Source: originatorAckPolicy: <default("OriginatorQosAckPolicy")> like IOriginatorQosAckPolicy { parameters: @display("p=550,100"); }originatorAckPolicyrecipientAckPolicy: inet.linklayer.ieee80211.mac.recipient.RecipientQosAckPolicy (like IRecipientQosAckPolicy) RecipientQosAckPolicy: Implements the default recipient ACK policy for QoS stations. IRecipientQosAckPolicy: Interface for recipient QoS ACK policies. Source: recipientAckPolicy: <default("RecipientQosAckPolicy")> like IRecipientQosAckPolicy { parameters: @display("p=550,200"); }recipientAckPolicyrtsPolicy: inet.linklayer.ieee80211.mac.originator.QosRtsPolicy (like IRtsPolicy) QosRtsPolicy: Implements the default RTS policy for QoS stations. IRtsPolicy: Interface for RTS policies. Source: rtsPolicy: <default("QosRtsPolicy")> like IRtsPolicy { parameters: @display("p=550,300"); }rtsPolicyctsPolicy: inet.linklayer.ieee80211.mac.recipient.QosCtsPolicy (like ICtsPolicy) QosCtsPolicy: Implements the default CTS policy for QoS stations. ICtsPolicy: Interface for CTS policies. Source: ctsPolicy: <default("QosCtsPolicy")> like ICtsPolicy { parameters: @display("p=550,400"); }ctsPolicyoriginatorBlockAckAgreementPolicy: inet.linklayer.ieee80211.mac.blockack.OriginatorBlockAckAgreementPolicy (like IOriginatorBlockAckAgreementPolicy) OriginatorBlockAckAgreementPolicy: Implements the default originator block ACK agreement policy IOriginatorBlockAckAgreementPolicy: Interface for originator Block ACK agreement policies. Source: originatorBlockAckAgreementPolicy: <default("OriginatorBlockAckAgreementPolicy")> like IOriginatorBlockAckAgreementPolicy if isBlockAckSupported { parameters: originatorAckPolicyModule = "^.originatorAckPolicy"; @display("p=550,500"); }originatorBlockAckAgreementPolicyrecipientBlockAckAgreementPolicy: inet.linklayer.ieee80211.mac.blockack.RecipientBlockAckAgreementPolicy (like IRecipientBlockAckAgreementPolicy) RecipientBlockAckAgreementPolicy: Implements the default recipient block ACK agreement policy. IRecipientBlockAckAgreementPolicy: Interface for recipient Block ACK agreement policies. Source: recipientBlockAckAgreementPolicy: <default("RecipientBlockAckAgreementPolicy")> like IRecipientBlockAckAgreementPolicy if isBlockAckSupported { parameters: @display("p=550,600"); }recipientBlockAckAgreementPolicy

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

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

inet::Packet

packetDropped

inet::Packet

packetReceivedFromPeer

inet::Packet

packetSentToPeer

inet::Packet

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

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

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