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