Edcaf

Package: inet.linklayer.ieee80211.mac.channelaccess

compound module Edcaf

Implements EDCAF (Enhanced Distributed Channel Access Function) for IEEE 802.11. EDCAF represents one access category within EDCA.

EdcafpendingQueue: inet.linklayer.ieee80211.mac.queue.PendingQueue (like IPacketQueue) PendingQueue: Implements a priority queue for IEEE 802.11 MAC frames. IPacketQueue: Interface for packet queue modules. Source: pendingQueue: <default("PendingQueue")> like IPacketQueue { parameters: @display("p=100,100"); }pendingQueueinProgressFrames: inet.linklayer.ieee80211.mac.queue.InProgressFrames Source: inProgressFrames: InProgressFrames { parameters: pendingQueueModule = default("^.pendingQueue"); originatorMacDataServiceModule = default("^.^.^.originatorMacDataService"); ackHandlerModule = default("^.ackHandler"); @dis...inProgressFramescontention: inet.linklayer.ieee80211.mac.contention.Contention (like IContention) Contention: The default implementation of IContention. IContention: Interface for modules that implement contention-based channel access. Source: contention: <default("Contention")> like IContention { parameters: @display("p=100,300"); }contentionackHandler: inet.linklayer.ieee80211.mac.originator.QosAckHandler Manages acknowledgment handling for QoS frames in IEEE 802.11 networks. Source: ackHandler: QosAckHandler { parameters: @display("p=100,400"); }ackHandlertxopProcedure: inet.linklayer.ieee80211.mac.originator.TxopProcedure Implements the Transmission Opportunity (TXOP) mechanism in IEEE 802.11 QoS networks. Source: txopProcedure: TxopProcedure { parameters: @display("p=100,500"); }txopProcedurerecoveryProcedure: inet.linklayer.ieee80211.mac.originator.QosRecoveryProcedure Implements frame retransmission and recovery procedures for QoS frames in IEEE 802.11 networks. Source: recoveryProcedure: QosRecoveryProcedure { parameters: cwCalculatorModule = "^"; rtsPolicyModule = "^.^.^.rtsPolicy"; @display("p=100,600"); }recoveryProcedure

Usage diagram

Inheritance diagram

Used in compound modules

Name

Type

Description

Edca

compound module

Implements EDCA (Enhanced Distributed Channel Access) for IEEE 802.11. The implementation allows for a configurable number of access categories, not just four as defined by the standard.

Extends

Name

Type

Description

Module

compound module

Base module for all INET compound modules.

Parameters

Name

Type

Default value

Description

displayStringTextFormat

string

“{accessCategory}\n{contentionState}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

rxModule

string

collisionControllerModule

string

originatorMacDataServiceModule

string

accessCategory

string

aifsn

int

-1

cwMin

int

-1

cwMax

int

-1

Properties

Name

Value

Description

class

Edcaf

display

i=block/queue

Signals

Name

Type

Unit

Description

channelOwnershipChanged

bool

packetSentToPeer

inet::Packet

Statistics

Name

Title

Source

Record

Unit

Interpolation Mode

Description

channelOwnershipChanged

channel ownership

count,vector?

sample-hold

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

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

pendingQueue.packetCapacity

int

100

Maximum number of packets in the queue, no limit by default

pendingQueue.dataCapacity

int

-1b

Maximum total length of packets in the queue, no limit by default

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

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

pendingQueue.bufferModule

string

“”

Relative module path to the IPacketBuffer module used by this queue, implicit buffer by default

inProgressFrames.displayStringTextFormat

string

“{numInProgress} packets”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

inProgressFrames.pendingQueueModule

string

“^.pendingQueue”

inProgressFrames.originatorMacDataServiceModule

string

“^.^.^.originatorMacDataService”

inProgressFrames.ackHandlerModule

string

“^.ackHandler”

contention.displayStringTextFormat

string

“{fsmState}”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

contention.initialChannelBusy

bool

true

Assume that the channel was busy before the simulation started

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

ackHandler.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

txopProcedure.displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

txopProcedure.txopLimit

double

-1s

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

Source code

//
// Implements EDCAF (Enhanced Distributed Channel Access Function) for IEEE 802.11.
// EDCAF represents one access category within EDCA.
//
module Edcaf extends Module
{
    parameters:
        string rxModule;
        string collisionControllerModule;
        string originatorMacDataServiceModule;
        string accessCategory @enum("AC_BK","AC_BE","AC_VI","AC_VO");
        int aifsn = default(-1);
        int cwMin = default(-1);
        int cwMax = default(-1);
        @class(Edcaf);
        displayStringTextFormat = default("{accessCategory}\n{contentionState}");
        @display("i=block/queue");
        @signal[packetSentToPeer](type=inet::Packet);
        @signal[channelOwnershipChanged](type=bool);
        @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[channelOwnershipChanged](title="channel ownership"; record=count,vector?; interpolationmode=sample-hold);
    submodules:
        pendingQueue: <default("PendingQueue")> like IPacketQueue {
            parameters:
                @display("p=100,100");
        }
        inProgressFrames: InProgressFrames {
            parameters:
                pendingQueueModule = default("^.pendingQueue");
                originatorMacDataServiceModule = default("^.^.^.originatorMacDataService");
                ackHandlerModule = default("^.ackHandler");
                @display("p=100,200");
        }
        contention: <default("Contention")> like IContention {
            parameters:
                @display("p=100,300");
        }
        // TODO consider moving QosRecoveryProcedure and QosAckHandler from Edcaf to Hcf, as they seem to be prepared to handle all ACs?
        ackHandler: QosAckHandler {
            parameters:
                @display("p=100,400");
        }
        txopProcedure: TxopProcedure {
            parameters:
                @display("p=100,500");
        }
        // TODO consider moving QosRecoveryProcedure and QosAckHandler from Edcaf to Hcf, as they seem to be prepared to handle all ACs?
        recoveryProcedure: QosRecoveryProcedure {
            parameters:
                cwCalculatorModule = "^";
                rtsPolicyModule = "^.^.^.rtsPolicy";
                @display("p=100,600");
        }
}

File: src/inet/linklayer/ieee80211/mac/channelaccess/Edcaf.ned