TC(8)                    (December 2019)                    TC(8)

     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 pro-
          ceeds 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

     Page 1                      iproute2            (printed 5/25/22)

     TC(8)                    (December 2019)                    TC(8)

          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 speci-
               fied through the strict keyword and bandwidth-sharing
               bands specified in quanta. If a larger value is given,

     Page 2                      iproute2            (printed 5/25/22)

     TC(8)                    (December 2019)                    TC(8)

               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 inter-
          face 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

     Page 3                      iproute2            (printed 5/25/22)

     TC(8)                    (December 2019)                    TC(8)

          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

     SEE ALSO
          tc(8), tc-prio(8), tc-drr(8)

     AUTHOR
          Parts of both this manual page and the code itself are taken
          from PRIO and DRR qdiscs.
          ETS qdisc itself was written by Petr Machata.

     Page 4                      iproute2            (printed 5/25/22)