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