Hcf

Package: inet.linklayer.ieee80211.mac.coordinationfunction

Hcf

compound module

HCF -- Hybrid Coordination Function

edca : Edca

Source:
edca: Edca {
    parameters:
        numEdcafs = parent.numEdcafs;
        @display("p=150,100");
} hcca : Hcca

Source:
hcca: Hcca {
    parameters:
        @display("p=150,200");
} originatorMacDataService : OriginatorQoSMacDataService

Source:
originatorMacDataService: OriginatorQoSMacDataService {
    parameters:
        @display("p=150,300");
} recipientMacDataService : RecipientQoSMacDataService

Source:
recipientMacDataService: RecipientQoSMacDataService {
    parameters:
        @display("p=150,400");
} rateSelection : QoSRateSelection

Source:
rateSelection: QoSRateSelection {
    parameters:
        rateControlModule = "^.rateControl";
        @display("p=400,100");
} rateControl : like IRateControl

IRateControl: Interface for auto rate control modules.

Source:
rateControl: <rateControlType> like IRateControl if rateControlType != "" {
    parameters:
        @display("p=400,200");
} singleProtectionMechanism : SingleProtectionMechanism

Source:
singleProtectionMechanism: SingleProtectionMechanism {
    parameters:
        @display("p=400,300");
} edcaMgmtAndNonQoSRecoveryProcedure : NonQoSRecoveryProcedure

Source:
edcaMgmtAndNonQoSRecoveryProcedure: NonQoSRecoveryProcedure {
    parameters:
        cwCalculatorModule = "^.edca.edcaf[1]"; // best effort
        rtsPolicyModule = "^.rtsPolicy";
        @display("p=700,300");
} edcaDataRecoveryProcedures[numEdcafs] : QoSRecoveryProcedure

Source:
edcaDataRecoveryProcedures[numEdcafs]: QoSRecoveryProcedure {
    parameters:
        cwCalculatorModule = "^.edca.edcaf[" + string(index) + "]";
        rtsPolicyModule = "^.rtsPolicy";
        @display("p=700,400,column,100");
} edcaTxopProcedures[numEdcafs] : TxopProcedure

Source:
edcaTxopProcedures[numEdcafs]: TxopProcedure {
    parameters:
        @display("p=400,400,column,100");
} originatorAckPolicy : OriginatorQoSAckPolicy

Source:
originatorAckPolicy: OriginatorQoSAckPolicy {
    parameters:
        @display("p=1000,100");
} recipientAckPolicy : RecipientQoSAckPolicy

Source:
recipientAckPolicy: RecipientQoSAckPolicy {
    parameters:
        @display("p=1000,200");
} rtsPolicy : QoSRtsPolicy

Source:
rtsPolicy: QoSRtsPolicy {
    parameters:
        @display("p=1000,300");
} ctsPolicy : QoSCtsPolicy

Source:
ctsPolicy: QoSCtsPolicy {
    parameters:
        @display("p=1000,400");
} originatorBlockAckAgreementPolicy : OriginatorBlockAckAgreementPolicy

Source:
originatorBlockAckAgreementPolicy: OriginatorBlockAckAgreementPolicy if isBlockAckSupported {
    parameters:
        originatorAckPolicyModule = "^.originatorAckPolicy";
        @display("p=1000,500");
} recipientBlockAckAgreementPolicy : RecipientBlockAckAgreementPolicy

Source:
recipientBlockAckAgreementPolicy: RecipientBlockAckAgreementPolicy if isBlockAckSupported {
    parameters:
        @display("p=1000,600");
}

Usage diagram

The following diagram shows usage relationships between types. Unresolved types are missing from the diagram.

Used in compound modules

Name Type Description
Ieee80211Mac compound module

Implementation of the 802.11b MAC protocol. This module is intended to be used in combination with the Ieee80211Radio module as the physical layer. (The SnrEval80211 and Decider80211 modules should also work if per-packet bitrate setting gets implemented.)

Parameters

Name Type Default value Description
numEdcafs int 4
maxQueueSize int 100 -1 means unlimited
rateControlType string ""
isBlockAckSupported bool false
prioritizeMulticast bool false

if true, prioritize multicast frames (9.3.2.1 Fundamental access)

rxModule string
txModule string

Properties

Name Value Description
class Hcf
display i=block/queue

Signals

Name Type Unit
NF_LINK_BREAK inet::ieee80211::Ieee80211DataOrMgmtFrame
NF_PACKET_DROP inet::ieee80211::Ieee80211Frame

Unassigned submodule parameters

Name Type Default value Description
edca.edcaf.contention.initialChannelBusy bool true

assume that 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 may be able to start transmitting immediately

rateSelection.multicastFrameBitrate double -1bps
rateSelection.responseAckFrameBitrate double -1bps
rateSelection.responseBlockAckFrameBitrate double -1bps
rateSelection.responseCtsFrameBitrate double -1bps
rateSelection.dataFrameBitrate double -1bps

fastest

rateSelection.mgmtFrameBitrate double -1bps

fastest

rateSelection.controlFrameBitrate double -1bps
singleProtectionMechanism.rateSelectionModule string
edcaMgmtAndNonQoSRecoveryProcedure.shortRetryLimit int 7
edcaMgmtAndNonQoSRecoveryProcedure.longRetryLimit int 4
edcaDataRecoveryProcedures.shortRetryLimit int 7
edcaDataRecoveryProcedures.longRetryLimit int 4
edcaTxopProcedures.txopLimit double -1s
originatorAckPolicy.rateSelectionModule string
originatorAckPolicy.blockAckReqTreshold int 5
originatorAckPolicy.maxBlockAckPolicyFrameLength int 1000B
originatorAckPolicy.blockAckTimeout double -1s
originatorAckPolicy.ackTimeout double -1s
recipientAckPolicy.rateSelectionModule string
rtsPolicy.rateSelectionModule string
rtsPolicy.ctsTimeout double -1s
rtsPolicy.rtsThreshold int 2346B
ctsPolicy.rxModule string
ctsPolicy.rateSelectionModule string
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.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

//
// HCF -- Hybrid Coordination Function
//
module Hcf
{
    parameters:
        int numEdcafs = default(4);
        int maxQueueSize = default(100); // -1 means unlimited
        string rateControlType = default("");
        bool isBlockAckSupported = default(false);
        bool prioritizeMulticast = default(false); // if true, prioritize multicast frames (9.3.2.1 Fundamental access)

        string rxModule;
        string txModule;

        *.rateSelectionModule = "^.rateSelection";
        *.rxModule = "^." + this.rxModule;

        @class(Hcf);
        @display("i=block/queue");
        @signal[NF_LINK_BREAK](type=inet::ieee80211::Ieee80211DataOrMgmtFrame);
        @signal[NF_PACKET_DROP](type=inet::ieee80211::Ieee80211Frame);

    submodules:
        edca: Edca {
            parameters:
                numEdcafs = parent.numEdcafs;
                @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");
        }
        rateSelection: QoSRateSelection {
            parameters:
                rateControlModule = "^.rateControl";
                @display("p=400,100");
        }
        rateControl: <rateControlType> like IRateControl if rateControlType != "" {
            parameters:
                @display("p=400,200");
        }
        singleProtectionMechanism: SingleProtectionMechanism {
            parameters:
                @display("p=400,300");
        }
        edcaMgmtAndNonQoSRecoveryProcedure: NonQoSRecoveryProcedure {
            parameters:
                cwCalculatorModule = "^.edca.edcaf[1]"; // best effort
                rtsPolicyModule = "^.rtsPolicy";
                @display("p=700,300");
        }
        edcaDataRecoveryProcedures[numEdcafs]: QoSRecoveryProcedure {
            parameters:
                cwCalculatorModule = "^.edca.edcaf[" + string(index) + "]";
                rtsPolicyModule = "^.rtsPolicy";
                @display("p=700,400,column,100");
        }
        edcaTxopProcedures[numEdcafs]: TxopProcedure {
            parameters:
                @display("p=400,400,column,100");
        }
        originatorAckPolicy: OriginatorQoSAckPolicy {
            parameters:
                @display("p=1000,100");
        }
        recipientAckPolicy: RecipientQoSAckPolicy {
            parameters:
                @display("p=1000,200");
        }
        rtsPolicy: QoSRtsPolicy {
            parameters:
                @display("p=1000,300");
        }
        ctsPolicy: QoSCtsPolicy {
            parameters:
                @display("p=1000,400");
        }
        originatorBlockAckAgreementPolicy: OriginatorBlockAckAgreementPolicy if isBlockAckSupported {
            parameters:
                originatorAckPolicyModule = "^.originatorAckPolicy";
                @display("p=1000,500");
        }
        recipientBlockAckAgreementPolicy: RecipientBlockAckAgreementPolicy if isBlockAckSupported {
            parameters:
                @display("p=1000,600");
        }
}
File: src/inet/linklayer/ieee80211/mac/coordinationfunction/Hcf.ned