1 #!/usr/bin/perl 2 # 3 # 4 # AF using CBQ for a single interface eth0 5 # 4 AF classes using GRED and one BE using RED 6 # Things you might want to change: 7 # - the device bandwidth (set at 10Mbits) 8 # - the bandwidth allocated for each AF class and the BE class 9 # - the drop probability associated with each AF virtual queue 10 # 11 # AF DSCP values used (based on AF draft 04) 12 # ----------------------------------------- 13 # AF DSCP values 14 # AF1 1. 0x0a 2. 0x0c 3. 0x0e 15 # AF2 1. 0x12 2. 0x14 3. 0x16 16 # AF3 1. 0x1a 2. 0x1c 3. 0x1e 17 # AF4 1. 0x22 2. 0x24 3. 0x26 18 19 # 20 # 21 # A simple DSCP-class relationship formula used to generate 22 # values in the for loop of this script; $drop stands for the 23 # DP 24 # $dscp = ($class*8+$drop*2) 25 # 26 # if you use GRIO buffer sharing, then GRED priority is set as follows: 27 # $gprio=$drop+1; 28 # 29 30 $TC = "/usr/src/iproute2-current/tc/tc"; 31 $DEV = "dev lo"; 32 $DEV = "dev eth1"; 33 $DEV = "dev eth0"; 34 # the BE-class number 35 $beclass = "5"; 36 37 #GRIO buffer sharing on or off? 38 $GRIO = ""; 39 $GRIO = "grio"; 40 # The bandwidth of your device 41 $linerate="10Mbit"; 42 # The BE and AF rates 43 %rate_table=(); 44 $berate="1500Kbit"; 45 $rate_table{"AF1rate"}="1500Kbit"; 46 $rate_table{"AF2rate"}="1500Kbit"; 47 $rate_table{"AF3rate"}="1500Kbit"; 48 $rate_table{"AF4rate"}="1500Kbit"; 49 # 50 # 51 # 52 print "\n# --- General setup ---\n"; 53 print "$TC qdisc add $DEV handle 1:0 root dsmark indices 64 set_tc_index\n"; 54 print "$TC filter add $DEV parent 1:0 protocol ip prio 1 tcindex mask 0xfc " . 55 "shift 2 pass_on\n"; 56 #"shift 2\n"; 57 print "$TC qdisc add $DEV parent 1:0 handle 2:0 cbq bandwidth $linerate ". 58 "cell 8 avpkt 1000 mpu 64\n"; 59 print "$TC filter add $DEV parent 2:0 protocol ip prio 1 tcindex ". 60 "mask 0xf0 shift 4 pass_on\n"; 61 for $class (1..4) { 62 print "\n# --- AF Class $class specific setup---\n"; 63 $AFrate=sprintf("AF%drate",$class); 64 print "$TC class add $DEV parent 2:0 classid 2:$class cbq ". 65 "bandwidth $linerate rate $rate_table{$AFrate} avpkt 1000 prio ". 66 (6-$class)." bounded allot 1514 weight 1 maxburst 21\n"; 67 print "$TC filter add $DEV parent 2:0 protocol ip prio 1 handle $class ". 68 "tcindex classid 2:$class\n"; 69 print "$TC qdisc add $DEV parent 2:$class gred setup DPs 3 default 2 ". 70 "$GRIO\n"; 71 # 72 # per DP setup 73 # 74 for $drop (1..3) { 75 print "\n# --- AF Class $class DP $drop---\n"; 76 $dscp = $class*8+$drop*2; 77 $tcindex = sprintf("1%x%x",$class,$drop); 78 print "$TC filter add $DEV parent 1:0 protocol ip prio 1 ". 79 "handle $dscp tcindex classid 1:$tcindex\n"; 80 $prob = $drop*0.02; 81 if ($GRIO) { 82 $gprio = $drop+1; 83 print "$TC qdisc change $DEV parent 2:$class gred limit 60KB min 15KB ". 84 "max 45KB burst 20 avpkt 1000 bandwidth $linerate DP $drop ". 85 "probability $prob ". 86 "prio $gprio\n"; 87 } else { 88 print "$TC qdisc change $DEV parent 2:$class gred limit 60KB min 15KB ". 89 "max 45KB burst 20 avpkt 1000 bandwidth $linerate DP $drop ". 90 "probability $prob \n"; 91 } 92 } 93 } 94 # 95 # 96 print "\n#------BE Queue setup------\n"; 97 print "$TC filter add $DEV parent 1:0 protocol ip prio 2 ". 98 "handle 0 tcindex mask 0 classid 1:1\n"; 99 print "$TC class add $DEV parent 2:0 classid 2:$beclass cbq ". 100 "bandwidth $linerate rate $berate avpkt 1000 prio 6 " . 101 "bounded allot 1514 weight 1 maxburst 21 \n"; 102 print "$TC filter add $DEV parent 2:0 protocol ip prio 1 handle 0 tcindex ". 103 "classid 2:5\n"; 104 print "$TC qdisc add $DEV parent 2:5 red limit 60KB min 15KB max 45KB ". 105 "burst 20 avpkt 1000 bandwidth $linerate probability 0.4\n"; 106