Table Of Contents
Table Of Contents

Ordering the Packets in the Queue

The PacketQueue module can order the packets it contains using a packet comparator function, which makes it suitable for implementing priority queueing. (Other ways of implementing priority queueing, for example using PriorityScheduler, will be covered in later steps.)

In this example network, an active packet source (ActivePacketSource) creates 1-byte packets every second with a random byte as content. The packets are pushed into a queue (PacketQueue). The queue is configured to use the PacketDataComparator function, which orders packets by data. The packets are popped from the queue by an active packet sink (ActivePacketSink) every 2 seconds.

During simulation, the producer creates packets more frequently than the collector pops them from the queue, so packets accumulate in the queue. When this happens, packets will be ordered in the queue, so the collector will receive a series of ordered sequences.

network ComparatorTutorialStep
{
    @display("bgb=600,200");
    submodules:
        producer: ActivePacketSource {
            @display("p=100,100");
        }
        queue: PacketQueue {
            @display("p=300,100");
        }
        collector: ActivePacketSink {
            @display("p=500,100");
        }
    connections allowunconnected:
        producer.out --> queue.in;
        queue.out --> collector.in;
}
[Config Comparator]
network = ComparatorTutorialStep
sim-time-limit = 10s

*.producer.packetLength = 1B
*.producer.packetData = intuniform(0,255)
*.producer.productionInterval = 1s
*.collector.collectionInterval = 2s
*.queue.comparatorClass = "inet::queueing::PacketDataComparator"

The following screenshot demonstrates the queue’s contents at the end of the simulation without the comparator function:

And this one using the comparator function (head at the top, tail at the bottom):