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.
Usage diagram¶
Inheritance diagram¶
Used in compound modules¶
Name |
Type |
Description |
|---|---|---|
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 |
|---|---|---|
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 |
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