ESFQ for Linux 2.6

ESFQ is the Enhanced Stochastic Fairness Queueing discipline.

For current information on ESFQ, go to http://fatooh.org/esfq-2.6/



=============INSTALLATION=============

1.  Download the ESFQ tar file from http://fatooh.org/esfq-2.6/
    current: http://fatooh.org/esfq-2.6/esfq-2.6.10-rc1.tar.gz

2.  Download iproute2 from http://developer.osdl.org/dev/iproute2/
    current: http://developer.osdl.org/dev/iproute2/download/iproute2-2.6.9-041019.tar.gz

3.  Download Linux 2.6 from http://www.kernel.org/
    current: http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.9.tar.bz2
    patch:   http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.10-rc1.bz2

4.  Untar the files you downloaded, somewhere. Commands in the following
    instructions are examples; you'll have to modify them depending on where
    you untarred the files.

5.  Patch the kernel with ESFQ.
    $ cd /usr/src/linux
    $ patch -p1 --dry-run < ~/esfq-2.6.10-rc1/esfq-kernel.patch
    (and, if it works...)
    $ patch -p1 < ~/esfq-2.6.10-rc1/esfq-kernel.patch

6.  Configure the kernel to include ESFQ.
    a. The easiest way is use an old config file, if you have it. The config
       you use doesn't have to be from the same kernel version, but if it isn't
       you'll be asked other questions besides ESFQ.
      $ cd /usr/src/linux
      $ cp /boot/config-2.6.10-rc1 .config
      $ make oldconfig
      When you get to ESFQ, choose y, or m to use it as a module.
      
    b. If you want to use 'make menuconfig' instead, ESFQ is buried in:
       Device Drivers --->
        Networking support --->
         Networking options --->
          QoS and/or fair queueing --->
           < >   ESFQ queue

7.  Compile and install the kernel as usual.
    WARNING: ESFQ *and SFQ* will not work until you compile a patched version of
    tc (in iproute2). You may want to delay rebooting to the patched kernel
    until you have tc ready.

8.  Patch the iproute2 package so tc can use ESFQ.
    cd ~/iproute2-2.6.9
    patch -p1 --dry-run < ~/esfq-2.6.10-rc1/esfq-iproute2.patch
    (and, if it works...)
    patch -p1 < ~/esfq-2.6.10-rc1/esfq-iproute2.patch
   
9.  Compile iproute2.
    $ make
    a. You don't necessarily have to install the entire patched version of
       iproute2 if you don't want to (perhaps you would rather keep your
       distribution's package). All you need is the tc binary.
       $ cp -p tc/tc /sbin/tc-esfq
       Just modify your scripts to use /sbin/tc-esfq instead of /sbin/tc.

    b. Otherwise, go ahead and install iproute2.
       $ make install

10. Reboot to your new kernel, and have fun!



=============USAGE==============

... esfq [ perturb SECS ] [ quantum BYTES ] [ limit PKTS ]
         [ depth FLOWS ] [ divisor HASHBITS ] [ hash HASHTYPE] 
Where:
HASHTYPE := { classic | src | dst }

Options:

perturb SECS
   Default: none
   Recommended: 10
   
   SFQ and ESFQ don't actually allocate traffic to queues in a one-to-one
   manner; instead, they divide traffic among a large (but limited) number of
   queues. When two "flows" of traffic share a queue, they have to divide up
   the bandwidth that queue is allocated. Setting perturb to some value causes
   the flows to be redistributed, and flows that have to share a queue don't
   need to for long.

quantum BYTES
   Default: 1 MTU-sized packet
   Recommended: default

   Amount of bytes a stream is allowed to dequeue before the next queue gets a
   turn. Do not set below the MTU!

limit PKTS
   Default: 128
   Recommended: default
   
   The total number of packets that will be queued by this ESFQ before packets
   start getting dropped. In practice, it is best to have ESFQ as a leaf
   qdisc below a classful qdisc such as HTB. In that case, HTB can control what
   packets get dropped when, and this parameter is irrelevant. Limit must be
   less than or equal to depth.

depth FLOWS
   Default: 128
   
   ???   

divisor HASHBITS
   Default: 10

   Divisor sets the number of bits to use for the hash table, and results in
   2^HASHBITS possible queues. 10 means 1024 queues, 11 means 2048 queues, etc.
   

hash HASHTYPE
   Default: classic

   The hash option determines the basis upon which ESFQ separates traffic into
   queues. HASHTYPE can be either classic, src, or dst. The classic type is how
   the original SFQ works: traffic is separated by flow (TCP connection, UDP
   stream, etc. Src and dst divide traffic based upon the source or destination,
   respectively, of each packet.


==============EXAMPLES=============

Set up esfq just like sfq, as root for eth0:
# tc qdisc add dev eth0 root esfq perturb 10

Attach esfq to a parent class (such as HTB) and hash by dst IP. Very useful if
eth0 is on a LAN with bandwidth-consuming clients.
# tc qdisc add dev eth0 parent 1:12 handle 12: esfq perturb 10 hash dst

Like the example above, but for the WAN interface (eth1 instead of eth0, and
src instead of dst).
# tc qdisc add dev eth1 parent 1:12 handle 12: esfq perturb 10 hash src
      
