|
Packit |
d3f73b |
#!/usr/bin/perl
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
# AF using CBQ for a single interface eth0
|
|
Packit |
d3f73b |
# 4 AF classes using GRED and one BE using RED
|
|
Packit |
d3f73b |
# Things you might want to change:
|
|
Packit |
d3f73b |
# - the device bandwidth (set at 10Mbits)
|
|
Packit |
d3f73b |
# - the bandwidth allocated for each AF class and the BE class
|
|
Packit |
d3f73b |
# - the drop probability associated with each AF virtual queue
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
# AF DSCP values used (based on AF draft 04)
|
|
Packit |
d3f73b |
# -----------------------------------------
|
|
Packit |
d3f73b |
# AF DSCP values
|
|
Packit |
d3f73b |
# AF1 1. 0x0a 2. 0x0c 3. 0x0e
|
|
Packit |
d3f73b |
# AF2 1. 0x12 2. 0x14 3. 0x16
|
|
Packit |
d3f73b |
# AF3 1. 0x1a 2. 0x1c 3. 0x1e
|
|
Packit |
d3f73b |
# AF4 1. 0x22 2. 0x24 3. 0x26
|
|
Packit |
d3f73b |
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
# A simple DSCP-class relationship formula used to generate
|
|
Packit |
d3f73b |
# values in the for loop of this script; $drop stands for the
|
|
Packit |
d3f73b |
# DP
|
|
Packit |
d3f73b |
# $dscp = ($class*8+$drop*2)
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
# if you use GRIO buffer sharing, then GRED priority is set as follows:
|
|
Packit |
d3f73b |
# $gprio=$drop+1;
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
|
|
Packit |
d3f73b |
$TC = "/usr/src/iproute2-current/tc/tc";
|
|
Packit |
d3f73b |
$DEV = "dev lo";
|
|
Packit |
d3f73b |
$DEV = "dev eth1";
|
|
Packit |
d3f73b |
$DEV = "dev eth0";
|
|
Packit |
d3f73b |
# the BE-class number
|
|
Packit |
d3f73b |
$beclass = "5";
|
|
Packit |
d3f73b |
|
|
Packit |
d3f73b |
#GRIO buffer sharing on or off?
|
|
Packit |
d3f73b |
$GRIO = "";
|
|
Packit |
d3f73b |
$GRIO = "grio";
|
|
Packit |
d3f73b |
# The bandwidth of your device
|
|
Packit |
d3f73b |
$linerate="10Mbit";
|
|
Packit |
d3f73b |
# The BE and AF rates
|
|
Packit |
d3f73b |
%rate_table=();
|
|
Packit |
d3f73b |
$berate="1500Kbit";
|
|
Packit |
d3f73b |
$rate_table{"AF1rate"}="1500Kbit";
|
|
Packit |
d3f73b |
$rate_table{"AF2rate"}="1500Kbit";
|
|
Packit |
d3f73b |
$rate_table{"AF3rate"}="1500Kbit";
|
|
Packit |
d3f73b |
$rate_table{"AF4rate"}="1500Kbit";
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
print "\n# --- General setup ---\n";
|
|
Packit |
d3f73b |
print "$TC qdisc add $DEV handle 1:0 root dsmark indices 64 set_tc_index\n";
|
|
Packit |
d3f73b |
print "$TC filter add $DEV parent 1:0 protocol ip prio 1 tcindex mask 0xfc " .
|
|
Packit |
d3f73b |
"shift 2 pass_on\n";
|
|
Packit |
d3f73b |
#"shift 2\n";
|
|
Packit |
d3f73b |
print "$TC qdisc add $DEV parent 1:0 handle 2:0 cbq bandwidth $linerate ".
|
|
Packit |
d3f73b |
"cell 8 avpkt 1000 mpu 64\n";
|
|
Packit |
d3f73b |
print "$TC filter add $DEV parent 2:0 protocol ip prio 1 tcindex ".
|
|
Packit |
d3f73b |
"mask 0xf0 shift 4 pass_on\n";
|
|
Packit |
d3f73b |
for $class (1..4) {
|
|
Packit |
d3f73b |
print "\n# --- AF Class $class specific setup---\n";
|
|
Packit |
d3f73b |
$AFrate=sprintf("AF%drate",$class);
|
|
Packit |
d3f73b |
print "$TC class add $DEV parent 2:0 classid 2:$class cbq ".
|
|
Packit |
d3f73b |
"bandwidth $linerate rate $rate_table{$AFrate} avpkt 1000 prio ".
|
|
Packit |
d3f73b |
(6-$class)." bounded allot 1514 weight 1 maxburst 21\n";
|
|
Packit |
d3f73b |
print "$TC filter add $DEV parent 2:0 protocol ip prio 1 handle $class ".
|
|
Packit |
d3f73b |
"tcindex classid 2:$class\n";
|
|
Packit |
d3f73b |
print "$TC qdisc add $DEV parent 2:$class gred setup DPs 3 default 2 ".
|
|
Packit |
d3f73b |
"$GRIO\n";
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
# per DP setup
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
for $drop (1..3) {
|
|
Packit |
d3f73b |
print "\n# --- AF Class $class DP $drop---\n";
|
|
Packit |
d3f73b |
$dscp = $class*8+$drop*2;
|
|
Packit |
d3f73b |
$tcindex = sprintf("1%x%x",$class,$drop);
|
|
Packit |
d3f73b |
print "$TC filter add $DEV parent 1:0 protocol ip prio 1 ".
|
|
Packit |
d3f73b |
"handle $dscp tcindex classid 1:$tcindex\n";
|
|
Packit |
d3f73b |
$prob = $drop*0.02;
|
|
Packit |
d3f73b |
if ($GRIO) {
|
|
Packit |
d3f73b |
$gprio = $drop+1;
|
|
Packit |
d3f73b |
print "$TC qdisc change $DEV parent 2:$class gred limit 60KB min 15KB ".
|
|
Packit |
d3f73b |
"max 45KB burst 20 avpkt 1000 bandwidth $linerate DP $drop ".
|
|
Packit |
d3f73b |
"probability $prob ".
|
|
Packit |
d3f73b |
"prio $gprio\n";
|
|
Packit |
d3f73b |
} else {
|
|
Packit |
d3f73b |
print "$TC qdisc change $DEV parent 2:$class gred limit 60KB min 15KB ".
|
|
Packit |
d3f73b |
"max 45KB burst 20 avpkt 1000 bandwidth $linerate DP $drop ".
|
|
Packit |
d3f73b |
"probability $prob \n";
|
|
Packit |
d3f73b |
}
|
|
Packit |
d3f73b |
}
|
|
Packit |
d3f73b |
}
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
#
|
|
Packit |
d3f73b |
print "\n#------BE Queue setup------\n";
|
|
Packit |
d3f73b |
print "$TC filter add $DEV parent 1:0 protocol ip prio 2 ".
|
|
Packit |
d3f73b |
"handle 0 tcindex mask 0 classid 1:1\n";
|
|
Packit |
d3f73b |
print "$TC class add $DEV parent 2:0 classid 2:$beclass cbq ".
|
|
Packit |
d3f73b |
"bandwidth $linerate rate $berate avpkt 1000 prio 6 " .
|
|
Packit |
d3f73b |
"bounded allot 1514 weight 1 maxburst 21 \n";
|
|
Packit |
d3f73b |
print "$TC filter add $DEV parent 2:0 protocol ip prio 1 handle 0 tcindex ".
|
|
Packit |
d3f73b |
"classid 2:5\n";
|
|
Packit |
d3f73b |
print "$TC qdisc add $DEV parent 2:5 red limit 60KB min 15KB max 45KB ".
|
|
Packit |
d3f73b |
"burst 20 avpkt 1000 bandwidth $linerate probability 0.4\n";
|