GatingPriorityQueue¶
Package: inet.queueing.queue
compound module GatingPriorityQueue
Implements a priority queue with multiple inner queues each having its own periodic gate for packet selection and an optional shared memory buffer.
Usage diagram¶
Inheritance diagram¶
Known subclasses¶
Name |
Type |
Description |
|---|---|---|
compound module |
(no description) |
Extends¶
Name |
Type |
Description |
|---|---|---|
compound module |
This compound module serves as a base module for complex packet queues formed by combining several queueing components. |
Parameters¶
Name |
Type |
Default value |
Description |
|---|---|---|---|
displayStringTextFormat |
string |
“contains %p pk (%l) pushed %u created %c\n pulled %o removed %r dropped %d” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
packetCapacity |
int |
-1 |
Maximum number of packets in the queue, no limit by default |
dataCapacity |
int |
-1b |
Maximum total length of packets in the queue, no limit by default |
dropperClass |
string |
“” |
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 |
numQueues |
int |
||
bitrate |
double |
Properties¶
Name |
Value |
Description |
|---|---|---|
class |
CompoundPacketQueueBase |
|
defaultStatistic |
queueLength:vector |
|
display |
i=block/queue |
Gates¶
Name |
Direction |
Size |
Description |
|---|---|---|---|
in |
input |
||
out |
output |
Signals¶
Name |
Type |
Unit |
Description |
|---|---|---|---|
packetDropped |
|||
packetPulled |
|||
packetPushEnded |
inet::Packet? |
||
packetPushStarted |
|||
packetRemoved |
Statistics¶
Name |
Title |
Source |
Record |
Unit |
Interpolation Mode |
Description |
|---|---|---|---|---|---|---|
droppedPacketLengthsQueueOverflow |
dropped packet lengths: queue overflow |
packetLength(packetDropReasonIsQueueOverflow(warmup(localSignal(packetDropped)))) |
sum,vector |
b |
none |
the statistical value is the length of the packet that is dropped due to queue overflow |
droppedPacketsQueueOverflow |
dropped packets: queue overflow |
packetDropReasonIsQueueOverflow(warmup(localSignal(packetDropped))) |
count |
pk |
none |
the statistical value is the packet that is dropped due to queue overflow |
flowIncomingDataRate |
flow specific incoming data rate |
throughput(flowPacketLength(demuxFlow(warmup(localSignal(packetPushStarted))))) |
vector |
bps |
linear |
the statistical value is the flow specific data rate of the incoming packets |
flowOutgoingDataRate |
flow specific outgoing data rate |
throughput(flowPacketLength(demuxFlow(warmup(localSignal(packetPulled))))) |
vector |
bps |
linear |
the statistical value is the flow specific data rate of the outgoing packets |
flowQueueingTime |
flow queueing times |
queueingTime(demuxFlow(warmup(localSignal(packetPulled)))) |
histogram,vector |
s |
none |
the statistical value is the flow specific queueing time of packets |
incomingDataRate |
incoming datarate |
throughput(warmup(localSignal(packetPushStarted))) |
vector |
bps |
linear |
the statistical value is the data rate of the incoming packets |
incomingPacketLengths |
incoming packet lengths |
packetLength(warmup(localSignal(packetPushStarted))) |
sum,histogram,vector |
b |
none |
the statistical value is the length of the incoming packet |
incomingPackets |
incoming packets |
warmup(localSignal(packetPushStarted)) |
count |
pk |
the statistical value is the incoming packet |
|
outgoingDataRate |
outgoing datarate |
throughput(warmup(localSignal(packetPulled))) |
vector |
bps |
linear |
the statistical value is the data rate of the outgoing packets |
outgoingPacketLengths |
outgoing packet lengths |
packetLength(warmup(localSignal(packetPulled))) |
sum,histogram,vector |
b |
none |
the statistical value is the length of the outgoing packet |
outgoingPackets |
outgoing packets |
warmup(localSignal(packetPulled)) |
count |
pk |
the statistical value is the outgoing packet |
|
queueBitLength |
queue bit length |
warmup(atomic(constant0(localSignal(packetPushEnded)) + sum(packetLength(localSignal(packetPushStarted))) - sum(packetLength(localSignal(packetPulled))) - sum(packetLength(localSignal(packetRemoved))) - sum(packetLength(localSignal(packetDropped))))) |
last,max,timeavg,vector |
b |
sample-hold |
the statistical value is the total bit length of all packets in the queue |
queueingTime |
queueing times |
queueingTime(warmup(localSignal(packetPulled))) |
histogram,vector |
s |
none |
the statistical value is the queueing time of packets |
queueLength |
queue length |
warmup(atomic(constant0(localSignal(packetPushEnded)) + count(localSignal(packetPushStarted)) - count(localSignal(packetPulled)) - count(localSignal(packetRemoved)) - count(localSignal(packetDropped)))) |
last,max,timeavg,vector |
pk |
sample-hold |
the statistical value is the number of packets in the queue |
Unassigned submodule parameters¶
Name |
Type |
Default value |
Description |
|---|---|---|---|
classifier.displayStringTextFormat |
string |
“classified %p pk (%l)” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
classifier.reverseOrder |
bool |
false |
|
classifier.classifierClass |
string |
Determines the output queue of packets, the parameter must be the name of a C++ class which implements the IPacketClassifierFunction interface and is registered via Register_Class |
|
queue.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 |
queue.packetCapacity |
int |
-1 |
Maximum number of packets in the queue, no limit by default |
queue.dataCapacity |
int |
-1b |
Maximum total length of packets in the queue, no limit by default |
queue.dropperClass |
string |
“” |
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 |
queue.comparatorClass |
string |
“” |
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 |
queue.bufferModule |
string |
exists(parent.buffer) ? “^.buffer” : “” |
Relative module path to the IPacketBuffer module used by this queue, implicit buffer by default |
gate.displayStringTextFormat |
string |
“passed %p pk (%l)” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
gate.bitrate |
double |
nan bps |
|
gate.extraLength |
int |
0b |
|
gate.extraDuration |
double |
0s |
|
gate.clockModule |
string |
“” |
Relative path of a module that implements IClock(1,:ref:2 <neddoc-msg-inet-iclock>); optional |
gate.initiallyOpen |
bool |
true |
Specifies if the gate is initially open or closed |
gate.offset |
double |
0s |
Specifies where the period starts in the list of gate state change durations; where it is in the period at the start |
gate.durations |
object |
[] |
List of time durations within the period that determine if the gate is open or closed; period is the sum of the durations |
gate.scheduleForAbsoluteTime |
bool |
true |
When a clock is used relative means that setting the clock will not affect the simulation time of the event |
gate.openSchedulingPriority |
int |
0 |
FES scheduling priority for the next gate open event |
gate.closeSchedulingPriority |
int |
0 |
FES scheduling priority for the next gate close event |
gate.enableImplicitGuardBand |
bool |
true |
Implicit guard band means that a packet is not allowed to be forwarded if it cannot finish transmission before the end of window. |
scheduler.displayStringTextFormat |
string |
“scheduled %p pk (%l)” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
scheduler.reverseOrder |
bool |
false |
Source code¶
//
// Implements a priority queue with multiple inner queues each having
// its own periodic gate for packet selection and an optional shared memory buffer.
//
module GatingPriorityQueue extends CompoundPacketQueueBase
{
parameters:
int numQueues;
double bitrate @unit(bps);
*.bitrate = default(this.bitrate);
*.extraLength = default(64b); // Overhead for Ethernet PHY header
submodules:
buffer: <default("")> like IPacketBuffer if typename != "" {
parameters:
@display("p=100,225");
}
classifier: <default("PacketClassifier")> like IPacketClassifier {
parameters:
@display("p=100,100");
}
queue[numQueues]: <default("PacketQueue")> like IPacketQueue {
parameters:
bufferModule = default(exists(parent.buffer) ? "^.buffer" : "");
@display("p=300,100,column,125");
}
gate[numQueues]: <default("PeriodicGate")> like IPacketGate {
parameters:
@display("p=500,100,column,125");
}
scheduler: <default("PriorityScheduler")> like IPacketScheduler {
parameters:
@display("p=700,100");
}
connections:
in --> { @display("m=w"); } --> classifier.in;
for i=0..sizeof(queue)-1 {
classifier.out++ --> queue[i].in;
queue[i].out --> gate[i].in;
gate[i].out --> scheduler.in++;
}
scheduler.out --> { @display("m=e"); } --> out;
}