Queue limits ------------ .. heading hierarchy: ------------- Chapter ************* Section (#.#) ============= Subsection (#.#.#) ############# Paragraph (no number) This section documents the queue limits model, which is used by the traffic control to limit the NetDevices queueing delay. It operates on the transmission path of the network node. The reduction of the NetDevices queueing delay is essential to improve the effectiveness of Active Queue Management (AQM) algorithms. Careful assessment of the queueing delay includes a byte-based measure of the NetDevices queue length. In this design, traffic control can use different byte-based schemes to limit the queueing delay. Currently the only available scheme is DynamicQueueLimits, which is modelled after the dynamic queue limit library of Linux. Model Description ***************** The source code for the model lives in the directory ``src/network/utils``. The model allows a byte-based measure of the netdevice queue. The byte-based measure more accurately approximates the time required to empty the queue than a packet-based measure. To inform the upper layers about the transmission of packets, NetDevices can call a couple of functions: * ``void NotifyQueuedBytes (uint32_t bytes)``: Report the number of bytes queued to the device queue * ``void NotifyTransmittedBytes (uint32_t bytes)``: Report the number of bytes transmitted by device Based on this information, the QueueLimits object can stop the transmission queue. In case of multiqueue NetDevices this mechanism is available for each queue. The QueueLimits model can be used on any NetDevice modelled in ns-3. Design ====== An abstract base class, class QueueLimits, is subclassed for specific byte-based limiting strategies. Common operations provided by the base class QueueLimits include: * ``void Reset ()``: Reset queue limits state * ``void Completed (uint32_t count)``: Record the number of completed bytes and recalculate the limit * ``int32_t Available () const``: Return how many bytes can be queued * ``void Queued (uint32_t count)``: Record number of bytes queued DynamicQueueLimits ################## Dynamic queue limits (DQL) is a basic library implemented in the Linux kernel to limit the Ethernet queueing delay. DQL is a general purpose queue length controller. The goal of DQL is to calculate the limit as the minimum number of bytes needed to prevent starvation. Three attributes are defined in the DynamicQueueLimits class: * ``HoldTime``: The DQL algorithm hold time * ``MaxLimit``: Maximum limit * ``MinLimit``: Minimum limit The DQL algorithm hold time is 1 s. Reducing the HoldTime increases the responsiveness of DQL with consequent greater number of limit variation events. Conversely, increasing the HoldTime decreases the responsiveness of DQL with a minor number of limit variation events. The limit calculated by DQL is in the range from MinLimit to MaxLimit. The default values are respectively 0 and DQL_MAX_LIMIT. Increasing the MinLimit is recommended in case of higher NetDevice transmission rate (e.g. 1 Gbps) while reducing the MaxLimit is recommended in case of lower NetDevice transmission rate (e.g. 500 Kbps). There is one trace source in DynamicQueueLimits class that may be hooked: * ``Limit``: Limit value calculated by DQL Usage ***** Helpers ======= A typical usage pattern is to create a traffic control helper and configure the queue limits type and attributes from the helper, such as this example: .. sourcecode:: cpp TrafficControlHelper tch; uint32_t handle = tch.SetRootQueueDisc ("ns3::PfifoFastQueueDisc", "Limit", UintegerValue (1000)); tch.SetQueueLimits ("ns3::DynamicQueueLimits", "HoldTime", StringValue ("4ms")); then install the configuration on a NetDevices container .. sourcecode:: cpp tch.Install (devices);