Blame README.iproute2+tc

Packit d3f73b
iproute2+tc*
Packit d3f73b
Packit d3f73b
It's the first release of Linux traffic control engine.
Packit d3f73b
Packit d3f73b
Packit d3f73b
NOTES.
Packit d3f73b
* csz scheduler is inoperational at the moment, and probably
Packit d3f73b
  never will be repaired but replaced with h-pfq scheduler.
Packit d3f73b
* To use "fw" classifier you will need ipfwchains patch.
Packit d3f73b
* No manual available. Ask me, if you have problems (only try to guess
Packit d3f73b
  answer yourself at first 8)).
Packit d3f73b
Packit d3f73b
Packit d3f73b
Micro-manual how to start it the first time
Packit d3f73b
-------------------------------------------
Packit d3f73b
Packit d3f73b
A. Attach CBQ to eth1:
Packit d3f73b
Packit d3f73b
tc qdisc add dev eth1 root handle 1: cbq bandwidth 10Mbit allot 1514 cell 8 \
Packit d3f73b
avpkt 1000 mpu 64
Packit d3f73b
Packit d3f73b
B. Add root class:
Packit d3f73b
Packit d3f73b
tc class add dev eth1 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit \
Packit d3f73b
allot 1514 cell 8 weight 1Mbit prio 8 maxburst 20 avpkt 1000
Packit d3f73b
Packit d3f73b
C. Add default interactive class:
Packit d3f73b
Packit d3f73b
tc class add dev eth1 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 1Mbit \
Packit d3f73b
allot 1514 cell 8 weight 100Kbit prio 3 maxburst 20 avpkt 1000 split 1:0 \
Packit d3f73b
defmap c0
Packit d3f73b
Packit d3f73b
D. Add default class:
Packit d3f73b
Packit d3f73b
tc class add dev eth1 parent 1:1 classid 1:3 cbq bandwidth 10Mbit rate 8Mbit \
Packit d3f73b
allot 1514 cell 8 weight 800Kbit prio 7 maxburst 20 avpkt 1000 split 1:0 \
Packit d3f73b
defmap 3f
Packit d3f73b
Packit d3f73b
etc. etc. etc. Well, it is enough to start 8) The rest can be guessed 8)
Packit d3f73b
Look also at more elaborated example, ready to start rsvpd,
Packit d3f73b
in rsvp/cbqinit.eth1.
Packit d3f73b
Packit d3f73b
Packit d3f73b
Terminology and advices about setting CBQ parameters may be found in Sally Floyd
Packit d3f73b
papers.
Packit d3f73b
Packit d3f73b
Packit d3f73b
Pairs X:Y are class handles, X:0 are qdisc handles.
Packit d3f73b
weight should be proportional to rate for leaf classes
Packit d3f73b
(I repeated it ten times less, but it is not necessary)
Packit d3f73b
Packit d3f73b
defmap is bitmap of logical priorities served by this class.
Packit d3f73b
Packit d3f73b
E. Another qdiscs are simpler. F.e. let's join TBF on class 1:2
Packit d3f73b
Packit d3f73b
tc qdisc add dev eth1 parent 1:2 tbf rate 64Kbit buffer 5Kb/8 limit 10Kb
Packit d3f73b
Packit d3f73b
F. Look at all that we created:
Packit d3f73b
Packit d3f73b
tc qdisc ls dev eth1
Packit d3f73b
tc class ls dev eth1
Packit d3f73b
Packit d3f73b
G. Install "route" classifier on root of cbq and map destination from realm
Packit d3f73b
1 to class 1:2
Packit d3f73b
Packit d3f73b
tc filter add dev eth1 parent 1:0 protocol ip prio 100 route to 1 classid 1:2
Packit d3f73b
Packit d3f73b
H. Assign routes to 10.11.12.0/24 to realm 1
Packit d3f73b
Packit d3f73b
ip route add 10.11.12.0/24 dev eth1 via whatever realm 1
Packit d3f73b
Packit d3f73b
etc. The same thing can be made with rules.
Packit d3f73b
I still did not test ipchains, but they should work too.
Packit d3f73b
Packit d3f73b
Packit d3f73b
Setup and code example of BPF classifier and action can be found under
Packit d3f73b
examples/bpf/, which should explain everything for getting started.
Packit d3f73b
Packit d3f73b
Packit d3f73b
Setup of rsvp and u32 classifiers is more hairy.
Packit d3f73b
If you read RSVP specs, you will understand how rsvp classifier
Packit d3f73b
works easily. What's about u32... That's example:
Packit d3f73b
Packit d3f73b
Packit d3f73b
#! /bin/sh
Packit d3f73b
Packit d3f73b
TC=/home/root/tc
Packit d3f73b
Packit d3f73b
# Setup classifier root on eth1 root (it is cbq)
Packit d3f73b
$TC filter add dev eth1 parent 1:0 prio 5 protocol ip u32
Packit d3f73b
Packit d3f73b
# Create hash table of 256 slots with ID 1:
Packit d3f73b
$TC filter add dev eth1 parent 1:0 prio 5 handle 1: u32 divisor 256
Packit d3f73b
Packit d3f73b
# Add to 6th slot of hash table rule to select tcp/telnet to 193.233.7.75
Packit d3f73b
# direct it to class 1:4 and prescribe to fall to best effort,
Packit d3f73b
# if traffic violate TBF (32kbit,5K)
Packit d3f73b
$TC filter add dev eth1 parent 1:0 prio 5 u32 ht 1:6: \
Packit d3f73b
	match ip dst 193.233.7.75 \
Packit d3f73b
	match tcp dst 0x17 0xffff \
Packit d3f73b
	flowid 1:4 \
Packit d3f73b
	police rate 32kbit buffer 5kb/8 mpu 64 mtu 1514 index 1
Packit d3f73b
Packit d3f73b
# Add to 1th slot of hash table rule to select icmp to 193.233.7.75
Packit d3f73b
# direct it to class 1:4 and prescribe to fall to best effort,
Packit d3f73b
# if traffic violate TBF (10kbit,5K)
Packit d3f73b
$TC filter add dev eth1 parent 1:0 prio 5 u32 ht 1:: \
Packit d3f73b
	sample ip protocol 1 0xff \
Packit d3f73b
	match ip dst 193.233.7.75 \
Packit d3f73b
	flowid 1:4 \
Packit d3f73b
	police rate 10kbit buffer 5kb/8 mpu 64 mtu 1514 index 2
Packit d3f73b
Packit d3f73b
# Lookup hash table, if it is not fragmented frame
Packit d3f73b
# Use protocol as hash key
Packit d3f73b
$TC filter add dev eth1 parent 1:0 prio 5 handle ::1 u32 ht 800:: \
Packit d3f73b
	match ip nofrag \
Packit d3f73b
	offset mask 0x0F00 shift 6 \
Packit d3f73b
	hashkey mask 0x00ff0000 at 8 \
Packit d3f73b
	link 1:
Packit d3f73b
Packit d3f73b
Packit d3f73b
Alexey Kuznetsov
Packit d3f73b
kuznet@ms2.inr.ac.ru