# tc-ets

## NAME



           ETS - Enhanced Transmission Selection scheduler
    


## SYNOPSIS



           **tc qdisc ... ets [ bands** number **] [ strict** number **] [ quanta** bytes
           bytes bytes...  **] [ priomap** band band band...  **]**
    
           **tc class ... ets [ quantum** bytes **]**
    


## DESCRIPTION



           The Enhanced Transmission Selection scheduler is a classful
           queuing discipline that merges functionality of PRIO and DRR
           qdiscs in one scheduler. ETS makes it easy to configure a set of
           strict and bandwidth-sharing bands to implement the transmission
           selection described in 802.1Qaz.
    
           On creation with 'tc qdisc add', a fixed number of bands is
           created. Each band is a class, although it is not possible to
           directly add and remove bands with 'tc class' commands. The number
           of bands to be created must instead be specified on the command
           line as the qdisc is added.
    
           The minor number of classid to use when referring to a band is the
           band number increased by one. Thus band 0 will have classid of
           major:1, band 1 that of major:2, etc.
    
           ETS bands are of two types: some number may be in strict mode, the
           remaining ones are in bandwidth-sharing mode.
    


## ALGORITHM



           When dequeuing, strict bands are tried first, if there are any.
           Band 0 is tried first. If it did not deliver a packet, band 1 is
           tried next, and so on until one of the bands delivers a packet, or
           the strict bands are exhausted.
    
           If no packet has been dequeued from any of the strict bands, if
           there are any bandwidth-sharing bands, the dequeuing proceeds
           according to the DRR algorithm. Each bandwidth-sharing band is
           assigned a deficit counter, initialized to quantum assigned by a
           **quanta** element. ETS maintains an (internal) ''active'' list of
           bandwidth-sharing bands whose qdiscs are non-empty. This list is
           used for dequeuing. A packet is dequeued from the band at the head
           of the list if the packet size is smaller or equal to the deficit
           counter. If the counter is too small, it is increased by **quantum**
           and the scheduler moves on to the next band in the active list.
    
           Only qdiscs that own their queue should be added below the
           bandwidth-sharing bands. Attaching to them non-work-conserving
           qdiscs like TBF does not make sense -- other qdiscs in the active
           list will be skipped until the dequeue operation succeeds. This
           limitation does not exist with the strict bands.
    


## CLASSIFICATION



           The ETS qdisc allows three ways to decide which band to enqueue a
           packet to:
    
           - Packet priority can be directly set to a class handle, in which
           case that
             is the queue where the packet will be put. For example, band
           number 2 of
             a qdisc with handle of 11: will have classid 11:3. To mark a
           packet for
             queuing to this band, the packet priority should be set to
           0x110003.
    
           - A tc filter attached to the qdisc can put the packet to a band
           by using
             the **flowid** keyword.
    
           - As a last resort, the ETS qdisc consults its priomap (see
           below), which
             maps packets to bands based on packet priority.
    


## PARAMETERS



           strict The number of bands that should be created in strict mode.
                  If not given, this value is 0.
    
           quanta Each bandwidth-sharing band needs to know its quantum,
                  which is the amount of bytes a band is allowed to dequeue
                  before the scheduler moves to the next bandwidth-sharing
                  band. The **quanta** argument lists quanta for the individual
                  bandwidth-sharing bands.  The minimum value of each quantum
                  is 1. If **quanta** is not given, the default is no bandwidth-
                  sharing bands, but note that when specifying a large number
                  of **bands,** the extra ones are in bandwidth-sharing mode by
                  default.
    
           bands  Number of bands given explicitly. This value has to be at
                  least large enough to cover the strict bands specified
                  through the **strict** keyword and bandwidth-sharing bands
                  specified in **quanta.** If a larger value is given, any extra
                  bands are in bandwidth-sharing mode, and their quanta are
                  deduced from the interface MTU. If no value is given, as
                  many bands are created as necessary to cover all bands
                  implied by the **strict** and **quanta** keywords.
    
           priomap
                  The priomap maps the priority of a packet to a band. The
                  argument is a list of numbers. The first number indicates
                  which band the packets with priority 0 should be put to,
                  the second is for priority 1, and so on.
    
                  There can be up to 16 numbers in the list. If there are
                  fewer, the default band that traffic with one of the
                  unmentioned priorities goes to is the last one.
    


## EXAMPLE & USAGE



           Add a qdisc with 8 bandwidth-sharing bands, using the interface
           MTU as their quanta. Since all quanta are the same, this will lead
           to equal distribution of bandwidth between the bands, each will
           get about 12.5% of the link. The low 8 priorities go to individual
           bands in a reverse 1:1 fashion (such that the highest priority
           goes to the first band).
    
           # tc qdisc add dev eth0 root handle 1: ets bands 8 priomap 7 6 5 4
           3 2 1 0
           # tc qdisc show dev eth0
           qdisc ets 1: root refcnt 2 bands 8 quanta 1514 1514 1514 1514 1514
           1514 1514 1514 priomap 7 6 5 4 3 2 1 0 7 7 7 7 7 7 7 7
    
           Tweak the first band of the above qdisc to give it a quantum of
           2650, which will give it about 20% of the link (and about 11.5% to
           the remaining bands):
    
           # tc class change dev eth0 classid 1:1 ets quantum 2650
           # tc qdisc show dev eth0
           qdisc ets 1: root refcnt 2 bands 8 quanta 2650 1514 1514 1514 1514
           1514 1514 1514 priomap 7 6 5 4 3 2 1 0 7 7 7 7 7 7 7 7
    
           Create a purely strict Qdisc with reverse 1:1 mapping between
           priorities and bands:
    
           # tc qdisc add dev eth0 root handle 1: ets strict 8 priomap 7 6 5
           4 3 2 1 0
           # tc qdisc sh dev eth0
           qdisc ets 1: root refcnt 2 bands 8 strict 8 priomap 7 6 5 4 3 2 1
           0 7 7 7 7 7 7 7 7
    
           Add a Qdisc with 6 bands, 3 strict and 3 ETS with 35%-30%-25%
           weights:
    
           # tc qdisc add dev eth0 root handle 1: ets strict 3 quanta 3500
           3000 2500 priomap 0 1 1 1 2 3 4 5
           # tc qdisc sh dev eth0
           qdisc ets 1: root refcnt 2 bands 6 strict 3 quanta 3500 3000 2500
           priomap 0 1 1 1 2 3 4 5 5 5 5 5 5 5 5 5
    
           Create a Qdisc such that traffic with priorities 2, 3 and 4 are
           strictly prioritized over other traffic, and the rest goes into
           bandwidth-sharing classes with equal weights:
    
           # tc qdisc add dev eth0 root handle 1: ets bands 8 strict 3
           priomap 3 4 0 1 2 5 6 7
           # tc qdisc sh dev eth0
           qdisc ets 1: root refcnt 2 bands 8 strict 3 quanta 1514 1514 1514
           1514 1514 priomap 3 4 0 1 2 5 6 7 7 7 7 7 7 7 7 7
    


* * *