1*de1e4e89SAndroid Build Coastguard Worker#!/bin/bash 2*de1e4e89SAndroid Build Coastguard Worker# 3*de1e4e89SAndroid Build Coastguard Worker# cbq.init v0.7.3 4*de1e4e89SAndroid Build Coastguard Worker# Copyright (C) 1999 Pavel Golubev <[email protected]> 5*de1e4e89SAndroid Build Coastguard Worker# Copyright (C) 2001-2004 Lubomir Bulej <[email protected]> 6*de1e4e89SAndroid Build Coastguard Worker# 7*de1e4e89SAndroid Build Coastguard Worker# chkconfig: 2345 11 89 8*de1e4e89SAndroid Build Coastguard Worker# description: sets up CBQ-based traffic control 9*de1e4e89SAndroid Build Coastguard Worker# 10*de1e4e89SAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify 11*de1e4e89SAndroid Build Coastguard Worker# it under the terms of the GNU General Public License as published by 12*de1e4e89SAndroid Build Coastguard Worker# the Free Software Foundation; either version 2 of the License, or 13*de1e4e89SAndroid Build Coastguard Worker# (at your option) any later version. 14*de1e4e89SAndroid Build Coastguard Worker# 15*de1e4e89SAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful, 16*de1e4e89SAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of 17*de1e4e89SAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*de1e4e89SAndroid Build Coastguard Worker# GNU General Public License for more details. 19*de1e4e89SAndroid Build Coastguard Worker# 20*de1e4e89SAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License 21*de1e4e89SAndroid Build Coastguard Worker# along with this program; if not, see <http://www.gnu.org/licenses/>. 22*de1e4e89SAndroid Build Coastguard Worker# 23*de1e4e89SAndroid Build Coastguard Worker# To get the latest version, check on Freshmeat for actual location: 24*de1e4e89SAndroid Build Coastguard Worker# 25*de1e4e89SAndroid Build Coastguard Worker# http://freshmeat.net/projects/cbq.init 26*de1e4e89SAndroid Build Coastguard Worker# 27*de1e4e89SAndroid Build Coastguard Worker# 28*de1e4e89SAndroid Build Coastguard Worker# VERSION HISTORY 29*de1e4e89SAndroid Build Coastguard Worker# --------------- 30*de1e4e89SAndroid Build Coastguard Worker# v0.7.3- Deepak Singhal <singhal at users.sourceforge.net> 31*de1e4e89SAndroid Build Coastguard Worker# - fix timecheck to not ignore regular TIME rules after 32*de1e4e89SAndroid Build Coastguard Worker# encountering a TIME rule that spans over midnight 33*de1e4e89SAndroid Build Coastguard Worker# - Nathan Shafer <nicodemus at users.sourceforge.net> 34*de1e4e89SAndroid Build Coastguard Worker# - allow symlinks to class files 35*de1e4e89SAndroid Build Coastguard Worker# - Seth J. Blank <antifreeze at users.sourceforge.net> 36*de1e4e89SAndroid Build Coastguard Worker# - replace hardcoded ip/tc location with variables 37*de1e4e89SAndroid Build Coastguard Worker# - Mark Davis <mark.davis at gmx.de> 38*de1e4e89SAndroid Build Coastguard Worker# - allow setting of PRIO_{MARK,RULE,REALM} in class file 39*de1e4e89SAndroid Build Coastguard Worker# - Fernando Sanch <toptnc at users.sourceforge.net> 40*de1e4e89SAndroid Build Coastguard Worker# - allow underscores in interface names 41*de1e4e89SAndroid Build Coastguard Worker# v0.7.2- Paulo Sedrez 42*de1e4e89SAndroid Build Coastguard Worker# - fix time2abs to allow hours with leading zero in TIME rules 43*de1e4e89SAndroid Build Coastguard Worker# - Svetlin Simeonov <zvero at yahoo.com> 44*de1e4e89SAndroid Build Coastguard Worker# - fix cbq_device_list to allow VLAN interfaces 45*de1e4e89SAndroid Build Coastguard Worker# - Mark Davis <mark.davis at gmx.de> 46*de1e4e89SAndroid Build Coastguard Worker# - ignore *~ backup files when looking for classes 47*de1e4e89SAndroid Build Coastguard Worker# - Mike Boyer <boyer at administrative.com> 48*de1e4e89SAndroid Build Coastguard Worker# - fix to allow arguments to be passed to "restart" command 49*de1e4e89SAndroid Build Coastguard Worker# v0.7.1- Lubomir Bulej <pallas at kadan.cz> 50*de1e4e89SAndroid Build Coastguard Worker# - default value for PERTURB 51*de1e4e89SAndroid Build Coastguard Worker# - fixed small bug in RULE parser to correctly parse rules with 52*de1e4e89SAndroid Build Coastguard Worker# identical source and destination fields 53*de1e4e89SAndroid Build Coastguard Worker# - faster initial scanning of DEVICE fields 54*de1e4e89SAndroid Build Coastguard Worker# v0.7 - Lubomir Bulej <pallas at kadan.cz> 55*de1e4e89SAndroid Build Coastguard Worker# - lots of various cleanups and reorganizations; the parsing is now 56*de1e4e89SAndroid Build Coastguard Worker# some 40% faster, but the class ID must be in range 0x0002-0xffff 57*de1e4e89SAndroid Build Coastguard Worker# (again). Because of the number of internal changes and the above 58*de1e4e89SAndroid Build Coastguard Worker# class ID restriction, I bumped the version to 0.7 to indicate 59*de1e4e89SAndroid Build Coastguard Worker# something might have got broken :) 60*de1e4e89SAndroid Build Coastguard Worker# - changed PRIO_{U32,FW,ROUTE} to PRIO_{RULE,MARK,REALM} 61*de1e4e89SAndroid Build Coastguard Worker# for consistency with filter keywords 62*de1e4e89SAndroid Build Coastguard Worker# - exposed "compile" command 63*de1e4e89SAndroid Build Coastguard Worker# - Catalin Petrescu <taz at dntis.ro> 64*de1e4e89SAndroid Build Coastguard Worker# - support for port masks in RULE (u32) filter 65*de1e4e89SAndroid Build Coastguard Worker# - Jordan Vrtanoski <obeliks at mt.net.mk> 66*de1e4e89SAndroid Build Coastguard Worker# - support for week days in TIME rules 67*de1e4e89SAndroid Build Coastguard Worker# v0.6.4- Lubomir Bulej <pallas at kadan.cz> 68*de1e4e89SAndroid Build Coastguard Worker# - added PRIO_* variables to allow easy control of filter priorities 69*de1e4e89SAndroid Build Coastguard Worker# - added caching to speed up CBQ start, the cache is invalidated 70*de1e4e89SAndroid Build Coastguard Worker# whenever any of the configuration files changes 71*de1e4e89SAndroid Build Coastguard Worker# - updated the readme section + some cosmetic fixes 72*de1e4e89SAndroid Build Coastguard Worker# v0.6.3- Lubomir Bulej <pallas at kadan.cz> 73*de1e4e89SAndroid Build Coastguard Worker# - removed setup of (unnecessary) class 1:1 - all classes 74*de1e4e89SAndroid Build Coastguard Worker# now use qdisc's default class 1:0 as their parent 75*de1e4e89SAndroid Build Coastguard Worker# - minor fix in the timecheck branch - classes 76*de1e4e89SAndroid Build Coastguard Worker# without leaf qdisc were not updated 77*de1e4e89SAndroid Build Coastguard Worker# - minor fix to avoid timecheck failure when run 78*de1e4e89SAndroid Build Coastguard Worker# at time with minutes equal to 08 or 09 79*de1e4e89SAndroid Build Coastguard Worker# - respect CBQ_PATH setting in environment 80*de1e4e89SAndroid Build Coastguard Worker# - made PRIO=5 default, rendering it optional in configs 81*de1e4e89SAndroid Build Coastguard Worker# - added support for route filter, see notes about REALM keyword 82*de1e4e89SAndroid Build Coastguard Worker# - added support for fw filter, see notes about MARK keyword 83*de1e4e89SAndroid Build Coastguard Worker# - added filter display to "list" and "stats" commands 84*de1e4e89SAndroid Build Coastguard Worker# - readme section update + various cosmetic fixes 85*de1e4e89SAndroid Build Coastguard Worker# v0.6.2- Catalin Petrescu <taz at dntis.ro> 86*de1e4e89SAndroid Build Coastguard Worker# - added tunnels interface handling 87*de1e4e89SAndroid Build Coastguard Worker# v0.6.1- Pavel Golubev <pg at ksi-linux.com> 88*de1e4e89SAndroid Build Coastguard Worker# - added sch_prio module loading 89*de1e4e89SAndroid Build Coastguard Worker# (thanks johan at iglo.virtual.or.id for reminding) 90*de1e4e89SAndroid Build Coastguard Worker# - resolved errors resulting from stricter syntax checking in bash2 91*de1e4e89SAndroid Build Coastguard Worker# - Lubomir Bulej <pallas at kadan.cz> 92*de1e4e89SAndroid Build Coastguard Worker# - various cosmetic fixes 93*de1e4e89SAndroid Build Coastguard Worker# v0.6 - Lubomir Bulej <pallas at kadan.cz> 94*de1e4e89SAndroid Build Coastguard Worker# - attempt to limit number of spawned processes by utilizing 95*de1e4e89SAndroid Build Coastguard Worker# more of sed power (use sed instead of grep+cut) 96*de1e4e89SAndroid Build Coastguard Worker# - simplified TIME parser, using bash builtins 97*de1e4e89SAndroid Build Coastguard Worker# - added initial support for SFQ as leaf qdisc 98*de1e4e89SAndroid Build Coastguard Worker# - reworked the documentation part a little 99*de1e4e89SAndroid Build Coastguard Worker# - incorporated pending patches and ideas submitted by 100*de1e4e89SAndroid Build Coastguard Worker# following people for versions 0.3 into version 0.6 101*de1e4e89SAndroid Build Coastguard Worker# - Miguel Freitas <miguel at cetuc.puc-rio.br> 102*de1e4e89SAndroid Build Coastguard Worker# - in case of overlapping TIME parameters, the last match is taken 103*de1e4e89SAndroid Build Coastguard Worker# - Juanjo Ciarlante <jjo at mendoza.gov.ar> 104*de1e4e89SAndroid Build Coastguard Worker# - chkconfig tags, list + stats startup parameters 105*de1e4e89SAndroid Build Coastguard Worker# - optional tc & ip command logging (into /var/run/cbq-*) 106*de1e4e89SAndroid Build Coastguard Worker# - Rafal Maszkowski <rzm at icm.edu.pl> 107*de1e4e89SAndroid Build Coastguard Worker# - PEAK parameter for setting TBF's burst peak rate 108*de1e4e89SAndroid Build Coastguard Worker# - fix for many config files (use find instead of ls) 109*de1e4e89SAndroid Build Coastguard Worker# v0.5.1- Lubomir Bulej <pallas at kadan.cz> 110*de1e4e89SAndroid Build Coastguard Worker# - fixed little but serious bug in RULE parser 111*de1e4e89SAndroid Build Coastguard Worker# v0.5 - Lubomir Bulej <pallas at kadan.cz> 112*de1e4e89SAndroid Build Coastguard Worker# - added options PARENT, LEAF, ISOLATED and BOUNDED. This allows 113*de1e4e89SAndroid Build Coastguard Worker# (with some attention to config file ordering) for creating 114*de1e4e89SAndroid Build Coastguard Worker# hierarchical structures of shapers with classes able (or unable) 115*de1e4e89SAndroid Build Coastguard Worker# to borrow bandwidth from their parents. 116*de1e4e89SAndroid Build Coastguard Worker# - class ID check allows hexadecimal numbers 117*de1e4e89SAndroid Build Coastguard Worker# - rewritten & simplified RULE parser 118*de1e4e89SAndroid Build Coastguard Worker# - cosmetic changes to improve readability 119*de1e4e89SAndroid Build Coastguard Worker# - reorganization to avoid duplicate code (timecheck etc.) 120*de1e4e89SAndroid Build Coastguard Worker# - timecheck doesn't check classes without TIME fields anymore 121*de1e4e89SAndroid Build Coastguard Worker# v0.4 - Lubomir Bulej <pallas at kadan.cz> 122*de1e4e89SAndroid Build Coastguard Worker# - small bugfix in RULE parsing code 123*de1e4e89SAndroid Build Coastguard Worker# - simplified configuration parsing code 124*de1e4e89SAndroid Build Coastguard Worker# - several small cosmetic changes 125*de1e4e89SAndroid Build Coastguard Worker# - TIME parameter can be now specified more than once allowing you to 126*de1e4e89SAndroid Build Coastguard Worker# differentiate RATE throughout the whole day. Time overlapping is 127*de1e4e89SAndroid Build Coastguard Worker# not checked, first match is taken. Midnight wrap (eg. 20:00-6:00) 128*de1e4e89SAndroid Build Coastguard Worker# is allowed and taken care of. 129*de1e4e89SAndroid Build Coastguard Worker# v0.3a4- fixed small bug in IF operator. Thanks to 130*de1e4e89SAndroid Build Coastguard Worker# Rafal Maszkowski <rzm at icm.edu.pl> 131*de1e4e89SAndroid Build Coastguard Worker# v0.3a3- fixed grep bug when using more than 10 eth devices. Thanks to David 132*de1e4e89SAndroid Build Coastguard Worker# Trcka <trcka at poda.cz>. 133*de1e4e89SAndroid Build Coastguard Worker# v0.3a2- fixed bug in "if" operator. Thanks kad at dgtu.donetsk.ua. 134*de1e4e89SAndroid Build Coastguard Worker# v0.3a - added TIME parameter. Example: TIME=00:00-19:00;64Kbit/6Kbit 135*de1e4e89SAndroid Build Coastguard Worker# So, between 00:00 and 19:00 the RATE will be 64Kbit. 136*de1e4e89SAndroid Build Coastguard Worker# Just start "cbq.init timecheck" periodically from cron 137*de1e4e89SAndroid Build Coastguard Worker# (every 10 minutes for example). DON'T FORGET though, to run 138*de1e4e89SAndroid Build Coastguard Worker# "cbq.init start" for CBQ to initialize. 139*de1e4e89SAndroid Build Coastguard Worker# v0.2 - Some cosmetic changes. Now it is more compatible with old bash 140*de1e4e89SAndroid Build Coastguard Worker# version. Thanks to Stanislav V. Voronyi <stas at cnti.uanet.kharkov.ua>. 141*de1e4e89SAndroid Build Coastguard Worker# v0.1 - First public release 142*de1e4e89SAndroid Build Coastguard Worker# 143*de1e4e89SAndroid Build Coastguard Worker# 144*de1e4e89SAndroid Build Coastguard Worker# README 145*de1e4e89SAndroid Build Coastguard Worker# ------ 146*de1e4e89SAndroid Build Coastguard Worker# 147*de1e4e89SAndroid Build Coastguard Worker# First of all - this is just a SIMPLE EXAMPLE of CBQ power. 148*de1e4e89SAndroid Build Coastguard Worker# Don't ask me "why" and "how" :) 149*de1e4e89SAndroid Build Coastguard Worker# 150*de1e4e89SAndroid Build Coastguard Worker# This script is meant to simplify setup and management of relatively simple 151*de1e4e89SAndroid Build Coastguard Worker# CBQ-based traffic control on Linux. Access to advanced networking features 152*de1e4e89SAndroid Build Coastguard Worker# of Linux kernel is provided by "ip" and "tc" utilities from A. Kuznetsov's 153*de1e4e89SAndroid Build Coastguard Worker# iproute2 package, available at ftp://ftp.inr.ac.ru/ip-routing. Because the 154*de1e4e89SAndroid Build Coastguard Worker# utilities serve primarily to translate user wishes to RTNETLINK commands, 155*de1e4e89SAndroid Build Coastguard Worker# their interface is rather spartan, intolerant and requires quite a lot of 156*de1e4e89SAndroid Build Coastguard Worker# typing. And typing is what this script attempts to reduce :) 157*de1e4e89SAndroid Build Coastguard Worker# 158*de1e4e89SAndroid Build Coastguard Worker# The advanced networking stuff in Linux is pretty flexible and this script 159*de1e4e89SAndroid Build Coastguard Worker# aims to bring some of its features to the not-so-hard-core Linux users. Of 160*de1e4e89SAndroid Build Coastguard Worker# course, there is a tradeoff between simplicity and flexibility and you may 161*de1e4e89SAndroid Build Coastguard Worker# realize that the flexibility suffered too much for your needs -- time to 162*de1e4e89SAndroid Build Coastguard Worker# face "ip" and "tc" interface. 163*de1e4e89SAndroid Build Coastguard Worker# 164*de1e4e89SAndroid Build Coastguard Worker# To speed up the "start" command, simple caching was introduced in version 165*de1e4e89SAndroid Build Coastguard Worker# 0.6.4. The caching works so that the sequence of "tc" commands for given 166*de1e4e89SAndroid Build Coastguard Worker# configuration is stored in a file (/var/cache/cbq.init by default) which 167*de1e4e89SAndroid Build Coastguard Worker# is used next time the "start" command is run to avoid repeated parsing of 168*de1e4e89SAndroid Build Coastguard Worker# configuration files. This cache is invalidated whenever any of the CBQ 169*de1e4e89SAndroid Build Coastguard Worker# configuration files changes. If you want to run "cbq.init start" without 170*de1e4e89SAndroid Build Coastguard Worker# caching, run it as "cbq.init start nocache". If you want to force cache 171*de1e4e89SAndroid Build Coastguard Worker# invalidation, run it as "cbq.init start invalidate". Caching is disabled 172*de1e4e89SAndroid Build Coastguard Worker# if you have logging enabled (ie. CBQ_DEBUG is not empty). 173*de1e4e89SAndroid Build Coastguard Worker# 174*de1e4e89SAndroid Build Coastguard Worker# If you only want cqb.init to translate your configuration to "tc" commands, 175*de1e4e89SAndroid Build Coastguard Worker# use "compile" command which will output "tc" commands required to build 176*de1e4e89SAndroid Build Coastguard Worker# your configuration. Bear in mind that "compile" does not check if the "tc" 177*de1e4e89SAndroid Build Coastguard Worker# commands were successful - this is done (in certain places) only when the 178*de1e4e89SAndroid Build Coastguard Worker# "start nocache" command is used, which is also useful when creating the 179*de1e4e89SAndroid Build Coastguard Worker# configuration to check whether it is completely valid. 180*de1e4e89SAndroid Build Coastguard Worker# 181*de1e4e89SAndroid Build Coastguard Worker# All CBQ parameters are valid for Ethernet interfaces only, The script was 182*de1e4e89SAndroid Build Coastguard Worker# tested on various Linux kernel versions from series 2.1 to 2.4 and several 183*de1e4e89SAndroid Build Coastguard Worker# distributions with KSI Linux (Nostromo version) as the premier one. 184*de1e4e89SAndroid Build Coastguard Worker# 185*de1e4e89SAndroid Build Coastguard Worker# 186*de1e4e89SAndroid Build Coastguard Worker# HOW DOES IT WORK? 187*de1e4e89SAndroid Build Coastguard Worker# ----------------- 188*de1e4e89SAndroid Build Coastguard Worker# 189*de1e4e89SAndroid Build Coastguard Worker# Every traffic class must be described by a file in the $CBQ_PATH directory 190*de1e4e89SAndroid Build Coastguard Worker# (/etc/sysconfig/cbq by default) - one file per class. 191*de1e4e89SAndroid Build Coastguard Worker# 192*de1e4e89SAndroid Build Coastguard Worker# The config file names must obey mandatory format: cbq-<clsid>.<name> where 193*de1e4e89SAndroid Build Coastguard Worker# <clsid> is two-byte hexadecimal number in range <0002-FFFF> (which in fact 194*de1e4e89SAndroid Build Coastguard Worker# is a CBQ class ID) and <name> is the name of the class -- anything to help 195*de1e4e89SAndroid Build Coastguard Worker# you distinguish the configuration files. For small amount of classes it is 196*de1e4e89SAndroid Build Coastguard Worker# often possible (and convenient) to let <clsid> resemble bandwidth of the 197*de1e4e89SAndroid Build Coastguard Worker# class. 198*de1e4e89SAndroid Build Coastguard Worker# 199*de1e4e89SAndroid Build Coastguard Worker# Example of valid config name: 200*de1e4e89SAndroid Build Coastguard Worker# cbq-1280.My_first_shaper 201*de1e4e89SAndroid Build Coastguard Worker# 202*de1e4e89SAndroid Build Coastguard Worker# 203*de1e4e89SAndroid Build Coastguard Worker# The configuration file may contain the following parameters: 204*de1e4e89SAndroid Build Coastguard Worker# 205*de1e4e89SAndroid Build Coastguard Worker### Device parameters 206*de1e4e89SAndroid Build Coastguard Worker# 207*de1e4e89SAndroid Build Coastguard Worker# DEVICE=<ifname>,<bandwidth>[,<weight>] mandatory 208*de1e4e89SAndroid Build Coastguard Worker# DEVICE=eth0,10Mbit,1Mbit 209*de1e4e89SAndroid Build Coastguard Worker# 210*de1e4e89SAndroid Build Coastguard Worker# <ifname> is the name of the interface you want to control 211*de1e4e89SAndroid Build Coastguard Worker# traffic on, e.g. eth0 212*de1e4e89SAndroid Build Coastguard Worker# <bandwidth> is the physical bandwidth of the device, e.g. for 213*de1e4e89SAndroid Build Coastguard Worker# ethernet 10Mbit or 100Mbit, for arcnet 2Mbit 214*de1e4e89SAndroid Build Coastguard Worker# <weight> is tuning parameter that should be proportional to 215*de1e4e89SAndroid Build Coastguard Worker# <bandwidth>. As a rule of thumb: <weight> = <bandwidth> / 10 216*de1e4e89SAndroid Build Coastguard Worker# 217*de1e4e89SAndroid Build Coastguard Worker# When you have more classes on one interface, it is enough to specify 218*de1e4e89SAndroid Build Coastguard Worker# <bandwidth> [and <weight>] only once, therefore in other files you only 219*de1e4e89SAndroid Build Coastguard Worker# need to set DEVICE=<ifname>. 220*de1e4e89SAndroid Build Coastguard Worker# 221*de1e4e89SAndroid Build Coastguard Worker### Class parameters 222*de1e4e89SAndroid Build Coastguard Worker# 223*de1e4e89SAndroid Build Coastguard Worker# RATE=<speed> mandatory 224*de1e4e89SAndroid Build Coastguard Worker# RATE=5Mbit 225*de1e4e89SAndroid Build Coastguard Worker# 226*de1e4e89SAndroid Build Coastguard Worker# Bandwidth allocated to the class. Traffic going through the class is 227*de1e4e89SAndroid Build Coastguard Worker# shaped to conform to specified rate. You can use Kbit, Mbit or bps, 228*de1e4e89SAndroid Build Coastguard Worker# Kbps and Mbps as suffices. If you don't specify any unit, bits/sec 229*de1e4e89SAndroid Build Coastguard Worker# are used. Also note that "bps" means "bytes per second", not bits. 230*de1e4e89SAndroid Build Coastguard Worker# 231*de1e4e89SAndroid Build Coastguard Worker# WEIGHT=<speed> mandatory 232*de1e4e89SAndroid Build Coastguard Worker# WEIGHT=500Kbit 233*de1e4e89SAndroid Build Coastguard Worker# 234*de1e4e89SAndroid Build Coastguard Worker# Tuning parameter that should be proportional to RATE. As a rule 235*de1e4e89SAndroid Build Coastguard Worker# of thumb, use WEIGHT ~= RATE / 10. 236*de1e4e89SAndroid Build Coastguard Worker# 237*de1e4e89SAndroid Build Coastguard Worker# PRIO=<1-8> optional, default 5 238*de1e4e89SAndroid Build Coastguard Worker# PRIO=5 239*de1e4e89SAndroid Build Coastguard Worker# 240*de1e4e89SAndroid Build Coastguard Worker# Priority of class traffic. The higher the number, the lesser 241*de1e4e89SAndroid Build Coastguard Worker# the priority. Priority of 5 is just fine. 242*de1e4e89SAndroid Build Coastguard Worker# 243*de1e4e89SAndroid Build Coastguard Worker# PARENT=<clsid> optional, default not set 244*de1e4e89SAndroid Build Coastguard Worker# PARENT=1280 245*de1e4e89SAndroid Build Coastguard Worker# 246*de1e4e89SAndroid Build Coastguard Worker# Specifies ID of the parent class to which you want this class be 247*de1e4e89SAndroid Build Coastguard Worker# attached. You might want to use LEAF=none for the parent class as 248*de1e4e89SAndroid Build Coastguard Worker# mentioned below. By using this parameter and carefully ordering the 249*de1e4e89SAndroid Build Coastguard Worker# configuration files, it is possible to create simple hierarchical 250*de1e4e89SAndroid Build Coastguard Worker# structures of CBQ classes. The ordering is important so that parent 251*de1e4e89SAndroid Build Coastguard Worker# classes are constructed prior to their children. 252*de1e4e89SAndroid Build Coastguard Worker# 253*de1e4e89SAndroid Build Coastguard Worker# LEAF=none|tbf|sfq optional, default "tbf" 254*de1e4e89SAndroid Build Coastguard Worker# 255*de1e4e89SAndroid Build Coastguard Worker# Tells the script to attach specified leaf queueing discipline to CBQ 256*de1e4e89SAndroid Build Coastguard Worker# class. By default, TBF is used. Note that attaching TBF to CBQ class 257*de1e4e89SAndroid Build Coastguard Worker# shapes the traffic to conform to TBF parameters and prevents the class 258*de1e4e89SAndroid Build Coastguard Worker# from borrowing bandwidth from its parent even if you have BOUNDED set 259*de1e4e89SAndroid Build Coastguard Worker# to "no". To allow the class to borrow bandwith (provided it is not 260*de1e4e89SAndroid Build Coastguard Worker# bounded), you must set LEAF to "none" or "sfq". 261*de1e4e89SAndroid Build Coastguard Worker# 262*de1e4e89SAndroid Build Coastguard Worker# If you want to ensure (approximately) fair sharing of bandwidth among 263*de1e4e89SAndroid Build Coastguard Worker# several hosts in the same class, you might want to specify LEAF=sfq to 264*de1e4e89SAndroid Build Coastguard Worker# attach SFQ as leaf queueing discipline to that class. 265*de1e4e89SAndroid Build Coastguard Worker# 266*de1e4e89SAndroid Build Coastguard Worker# BOUNDED=yes|no optional, default "yes" 267*de1e4e89SAndroid Build Coastguard Worker# 268*de1e4e89SAndroid Build Coastguard Worker# If set to "yes", the class is not allowed to borrow bandwidth from 269*de1e4e89SAndroid Build Coastguard Worker# its parent class in overlimit situation. If set to "no", the class 270*de1e4e89SAndroid Build Coastguard Worker# will be allowed to borrow bandwidth from its parent. 271*de1e4e89SAndroid Build Coastguard Worker# 272*de1e4e89SAndroid Build Coastguard Worker# Note: Don't forget to set LEAF to "none" or "sfq", otherwise the class will 273*de1e4e89SAndroid Build Coastguard Worker# have TBF attached to itself and will not be able to borrow unused 274*de1e4e89SAndroid Build Coastguard Worker# bandwith from its parent. 275*de1e4e89SAndroid Build Coastguard Worker# 276*de1e4e89SAndroid Build Coastguard Worker# ISOLATED=yes|no optional, default "no" 277*de1e4e89SAndroid Build Coastguard Worker# 278*de1e4e89SAndroid Build Coastguard Worker# If set to "yes", the class will not lend unused bandwidth to 279*de1e4e89SAndroid Build Coastguard Worker# its children. 280*de1e4e89SAndroid Build Coastguard Worker# 281*de1e4e89SAndroid Build Coastguard Worker### TBF qdisc parameters 282*de1e4e89SAndroid Build Coastguard Worker# 283*de1e4e89SAndroid Build Coastguard Worker# BUFFER=<bytes>[/<bytes>] optional, default "10Kb/8" 284*de1e4e89SAndroid Build Coastguard Worker# 285*de1e4e89SAndroid Build Coastguard Worker# This parameter controls the depth of the token bucket. In other 286*de1e4e89SAndroid Build Coastguard Worker# words it represents the maximal burst size the class can send. 287*de1e4e89SAndroid Build Coastguard Worker# The optional part of parameter is used to determine the length 288*de1e4e89SAndroid Build Coastguard Worker# of intervals in packet sizes, for which the transmission times 289*de1e4e89SAndroid Build Coastguard Worker# are kept. 290*de1e4e89SAndroid Build Coastguard Worker# 291*de1e4e89SAndroid Build Coastguard Worker# LIMIT=<bytes> optional, default "15Kb" 292*de1e4e89SAndroid Build Coastguard Worker# 293*de1e4e89SAndroid Build Coastguard Worker# This parameter determines the maximal length of backlog. If 294*de1e4e89SAndroid Build Coastguard Worker# the queue contains more data than specified by LIMIT, the 295*de1e4e89SAndroid Build Coastguard Worker# newly arriving packets are dropped. The length of backlog 296*de1e4e89SAndroid Build Coastguard Worker# determines queue latency in case of congestion. 297*de1e4e89SAndroid Build Coastguard Worker# 298*de1e4e89SAndroid Build Coastguard Worker# PEAK=<speed> optional, default not set 299*de1e4e89SAndroid Build Coastguard Worker# 300*de1e4e89SAndroid Build Coastguard Worker# Maximal peak rate for short-term burst traffic. This allows you 301*de1e4e89SAndroid Build Coastguard Worker# to control the absolute peak rate the class can send at, because 302*de1e4e89SAndroid Build Coastguard Worker# single TBF that allows 256Kbit/s would of course allow rate of 303*de1e4e89SAndroid Build Coastguard Worker# 512Kbit for half a second or 1Mbit for a quarter of second. 304*de1e4e89SAndroid Build Coastguard Worker# 305*de1e4e89SAndroid Build Coastguard Worker# MTU=<bytes> optional, default "1500" 306*de1e4e89SAndroid Build Coastguard Worker# 307*de1e4e89SAndroid Build Coastguard Worker# Maximum number of bytes that can be sent at once over the 308*de1e4e89SAndroid Build Coastguard Worker# physical medium. This parameter is required when you specify 309*de1e4e89SAndroid Build Coastguard Worker# PEAK parameter. It defaults to MTU of ethernet - for other 310*de1e4e89SAndroid Build Coastguard Worker# media types you might want to change it. 311*de1e4e89SAndroid Build Coastguard Worker# 312*de1e4e89SAndroid Build Coastguard Worker# Note: Setting TBF as leaf qdisc will effectively prevent the class from 313*de1e4e89SAndroid Build Coastguard Worker# borrowing bandwidth from the ancestor class, because even if the 314*de1e4e89SAndroid Build Coastguard Worker# class allows more traffic to pass through, it is then shaped to 315*de1e4e89SAndroid Build Coastguard Worker# conform to TBF. 316*de1e4e89SAndroid Build Coastguard Worker# 317*de1e4e89SAndroid Build Coastguard Worker### SFQ qdisc parameters 318*de1e4e89SAndroid Build Coastguard Worker# 319*de1e4e89SAndroid Build Coastguard Worker# The SFQ queueing discipline is a cheap way for sharing class bandwidth 320*de1e4e89SAndroid Build Coastguard Worker# among several hosts. As it is stochastic, the fairness is approximate but 321*de1e4e89SAndroid Build Coastguard Worker# it will do the job in most cases. If you want real fairness, you should 322*de1e4e89SAndroid Build Coastguard Worker# probably use WRR (weighted round robin) or WFQ queueing disciplines. Note 323*de1e4e89SAndroid Build Coastguard Worker# that SFQ does not do any traffic shaping - the shaping is done by the CBQ 324*de1e4e89SAndroid Build Coastguard Worker# class the SFQ is attached to. 325*de1e4e89SAndroid Build Coastguard Worker# 326*de1e4e89SAndroid Build Coastguard Worker# QUANTUM=<bytes> optional, default not set 327*de1e4e89SAndroid Build Coastguard Worker# 328*de1e4e89SAndroid Build Coastguard Worker# This parameter should not be set lower than link MTU, for ethernet 329*de1e4e89SAndroid Build Coastguard Worker# it is 1500b, or (with MAC header) 1514b which is the value used 330*de1e4e89SAndroid Build Coastguard Worker# in Alexey Kuznetsov's examples. 331*de1e4e89SAndroid Build Coastguard Worker# 332*de1e4e89SAndroid Build Coastguard Worker# PERTURB=<seconds> optional, default "10" 333*de1e4e89SAndroid Build Coastguard Worker# 334*de1e4e89SAndroid Build Coastguard Worker# Period of hash function perturbation. If unset, hash reconfiguration 335*de1e4e89SAndroid Build Coastguard Worker# will never take place which is what you probably don't want. The 336*de1e4e89SAndroid Build Coastguard Worker# default value of 10 seconds is probably a good one. 337*de1e4e89SAndroid Build Coastguard Worker# 338*de1e4e89SAndroid Build Coastguard Worker### Filter parameters 339*de1e4e89SAndroid Build Coastguard Worker# 340*de1e4e89SAndroid Build Coastguard Worker# RULE=[[saddr[/prefix]][:port[/mask]],][daddr[/prefix]][:port[/mask]] 341*de1e4e89SAndroid Build Coastguard Worker# 342*de1e4e89SAndroid Build Coastguard Worker# These parameters make up "u32" filter rules that select traffic for 343*de1e4e89SAndroid Build Coastguard Worker# each of the classes. You can use multiple RULE fields per config. 344*de1e4e89SAndroid Build Coastguard Worker# 345*de1e4e89SAndroid Build Coastguard Worker# The optional port mask should only be used by advanced users who 346*de1e4e89SAndroid Build Coastguard Worker# understand how the u32 filter works. 347*de1e4e89SAndroid Build Coastguard Worker# 348*de1e4e89SAndroid Build Coastguard Worker# Some examples: 349*de1e4e89SAndroid Build Coastguard Worker# 350*de1e4e89SAndroid Build Coastguard Worker# RULE=10.1.1.0/24:80 351*de1e4e89SAndroid Build Coastguard Worker# selects traffic going to port 80 in network 10.1.1.0 352*de1e4e89SAndroid Build Coastguard Worker# 353*de1e4e89SAndroid Build Coastguard Worker# RULE=10.2.2.5 354*de1e4e89SAndroid Build Coastguard Worker# selects traffic going to any port on single host 10.2.2.5 355*de1e4e89SAndroid Build Coastguard Worker# 356*de1e4e89SAndroid Build Coastguard Worker# RULE=10.2.2.5:20/0xfffe 357*de1e4e89SAndroid Build Coastguard Worker# selects traffic going to ports 20 and 21 on host 10.2.2.5 358*de1e4e89SAndroid Build Coastguard Worker# 359*de1e4e89SAndroid Build Coastguard Worker# RULE=:25,10.2.2.128/26:5000 360*de1e4e89SAndroid Build Coastguard Worker# selects traffic going from anywhere on port 50 to 361*de1e4e89SAndroid Build Coastguard Worker# port 5000 in network 10.2.2.128 362*de1e4e89SAndroid Build Coastguard Worker# 363*de1e4e89SAndroid Build Coastguard Worker# RULE=10.5.5.5:80, 364*de1e4e89SAndroid Build Coastguard Worker# selects traffic going from port 80 of single host 10.5.5.5 365*de1e4e89SAndroid Build Coastguard Worker# 366*de1e4e89SAndroid Build Coastguard Worker# 367*de1e4e89SAndroid Build Coastguard Worker# 368*de1e4e89SAndroid Build Coastguard Worker# REALM=[srealm,][drealm] 369*de1e4e89SAndroid Build Coastguard Worker# 370*de1e4e89SAndroid Build Coastguard Worker# These parameters make up "route" filter rules that classify traffic 371*de1e4e89SAndroid Build Coastguard Worker# according to packet source/destination realms. For information about 372*de1e4e89SAndroid Build Coastguard Worker# realms, see Alexey Kuznetsov's IP Command Reference. This script 373*de1e4e89SAndroid Build Coastguard Worker# does not define any realms, it justs builds "tc filter" commands 374*de1e4e89SAndroid Build Coastguard Worker# for you if you need to classify traffic this way. 375*de1e4e89SAndroid Build Coastguard Worker# 376*de1e4e89SAndroid Build Coastguard Worker# Realm is either a decimal number or a string referencing entry in 377*de1e4e89SAndroid Build Coastguard Worker# /etc/iproute2/rt_realms (usually). 378*de1e4e89SAndroid Build Coastguard Worker# 379*de1e4e89SAndroid Build Coastguard Worker# Some examples: 380*de1e4e89SAndroid Build Coastguard Worker# 381*de1e4e89SAndroid Build Coastguard Worker# REALM=russia,internet 382*de1e4e89SAndroid Build Coastguard Worker# selects traffic going from realm "russia" to realm "internet" 383*de1e4e89SAndroid Build Coastguard Worker# 384*de1e4e89SAndroid Build Coastguard Worker# REALM=freenet, 385*de1e4e89SAndroid Build Coastguard Worker# selects traffic going from realm "freenet" 386*de1e4e89SAndroid Build Coastguard Worker# 387*de1e4e89SAndroid Build Coastguard Worker# REALM=10 388*de1e4e89SAndroid Build Coastguard Worker# selects traffic going to realm 10 389*de1e4e89SAndroid Build Coastguard Worker# 390*de1e4e89SAndroid Build Coastguard Worker# 391*de1e4e89SAndroid Build Coastguard Worker# 392*de1e4e89SAndroid Build Coastguard Worker# MARK=<mark> 393*de1e4e89SAndroid Build Coastguard Worker# 394*de1e4e89SAndroid Build Coastguard Worker# These parameters make up "fw" filter rules that select traffic for 395*de1e4e89SAndroid Build Coastguard Worker# each of the classes accoring to firewall "mark". Mark is a decimal 396*de1e4e89SAndroid Build Coastguard Worker# number packets are tagged with if firewall rules say so. You can 397*de1e4e89SAndroid Build Coastguard Worker# use multiple MARK fields per config. 398*de1e4e89SAndroid Build Coastguard Worker# 399*de1e4e89SAndroid Build Coastguard Worker# 400*de1e4e89SAndroid Build Coastguard Worker# Note: Rules for different filter types can be combined. Attention must be 401*de1e4e89SAndroid Build Coastguard Worker# paid to the priority of filter rules, which can be set below using 402*de1e4e89SAndroid Build Coastguard Worker# PRIO_{RULE,MARK,REALM} variables. 403*de1e4e89SAndroid Build Coastguard Worker# 404*de1e4e89SAndroid Build Coastguard Worker### Time ranging parameters 405*de1e4e89SAndroid Build Coastguard Worker# 406*de1e4e89SAndroid Build Coastguard Worker# TIME=[<dow>,<dow>, ...,<dow>/]<from>-<till>;<rate>/<weight>[/<peak>] 407*de1e4e89SAndroid Build Coastguard Worker# TIME=0,1,2,5/18:00-06:00;256Kbit/25Kbit 408*de1e4e89SAndroid Build Coastguard Worker# TIME=60123/18:00-06:00;256Kbit/25Kbit 409*de1e4e89SAndroid Build Coastguard Worker# TIME=18:00-06:00;256Kbit/25Kbit 410*de1e4e89SAndroid Build Coastguard Worker# 411*de1e4e89SAndroid Build Coastguard Worker# This parameter allows you to differentiate the class bandwidth 412*de1e4e89SAndroid Build Coastguard Worker# throughout the day. You can specify multiple TIME parameters, if 413*de1e4e89SAndroid Build Coastguard Worker# the times overlap, last match is taken. The fields <rate>, <weight> 414*de1e4e89SAndroid Build Coastguard Worker# and <peak> correspond to parameters RATE, WEIGHT and PEAK (which 415*de1e4e89SAndroid Build Coastguard Worker# is optional and applies to TBF leaf qdisc only). 416*de1e4e89SAndroid Build Coastguard Worker# 417*de1e4e89SAndroid Build Coastguard Worker# You can also specify days of week when the TIME rule applies. <dow> 418*de1e4e89SAndroid Build Coastguard Worker# is numeric, 0 corresponds to sunday, 1 corresponds to monday, etc. 419*de1e4e89SAndroid Build Coastguard Worker# 420*de1e4e89SAndroid Build Coastguard Worker### 421*de1e4e89SAndroid Build Coastguard Worker# 422*de1e4e89SAndroid Build Coastguard Worker# Sample configuration file: cbq-1280.My_first_shaper 423*de1e4e89SAndroid Build Coastguard Worker# 424*de1e4e89SAndroid Build Coastguard Worker# -------------------------------------------------------------------------- 425*de1e4e89SAndroid Build Coastguard Worker# DEVICE=eth0,10Mbit,1Mbit 426*de1e4e89SAndroid Build Coastguard Worker# RATE=128Kbit 427*de1e4e89SAndroid Build Coastguard Worker# WEIGHT=10Kbit 428*de1e4e89SAndroid Build Coastguard Worker# PRIO=5 429*de1e4e89SAndroid Build Coastguard Worker# RULE=192.128.1.0/24 430*de1e4e89SAndroid Build Coastguard Worker# -------------------------------------------------------------------------- 431*de1e4e89SAndroid Build Coastguard Worker# 432*de1e4e89SAndroid Build Coastguard Worker# The configuration says that we will control traffic on 10Mbit ethernet 433*de1e4e89SAndroid Build Coastguard Worker# device eth0 and the traffic going to network 192.168.1.0 will be 434*de1e4e89SAndroid Build Coastguard Worker# processed with priority 5 and shaped to rate of 128Kbit. 435*de1e4e89SAndroid Build Coastguard Worker# 436*de1e4e89SAndroid Build Coastguard Worker# Note that you can control outgoing traffic only. If you want to control 437*de1e4e89SAndroid Build Coastguard Worker# traffic in both directions, you must set up CBQ for both interfaces. 438*de1e4e89SAndroid Build Coastguard Worker# 439*de1e4e89SAndroid Build Coastguard Worker# Consider the following example: 440*de1e4e89SAndroid Build Coastguard Worker# 441*de1e4e89SAndroid Build Coastguard Worker# +---------+ 192.168.1.1 442*de1e4e89SAndroid Build Coastguard Worker# BACKBONE -----eth0-| linux |-eth1------*-[client] 443*de1e4e89SAndroid Build Coastguard Worker# +---------+ 444*de1e4e89SAndroid Build Coastguard Worker# 445*de1e4e89SAndroid Build Coastguard Worker# Imagine you want to shape traffic from backbone to the client to 28Kbit 446*de1e4e89SAndroid Build Coastguard Worker# and traffic in the opposite direction to 128Kbit. You need to setup CBQ 447*de1e4e89SAndroid Build Coastguard Worker# on both eth0 and eth1 interfaces, thus you need two config files: 448*de1e4e89SAndroid Build Coastguard Worker# 449*de1e4e89SAndroid Build Coastguard Worker# cbq-028.backbone-client 450*de1e4e89SAndroid Build Coastguard Worker# -------------------------------------------------------------------------- 451*de1e4e89SAndroid Build Coastguard Worker# DEVICE=eth1,10Mbit,1Mbit 452*de1e4e89SAndroid Build Coastguard Worker# RATE=28Kbit 453*de1e4e89SAndroid Build Coastguard Worker# WEIGHT=2Kbit 454*de1e4e89SAndroid Build Coastguard Worker# PRIO=5 455*de1e4e89SAndroid Build Coastguard Worker# RULE=192.168.1.1 456*de1e4e89SAndroid Build Coastguard Worker# -------------------------------------------------------------------------- 457*de1e4e89SAndroid Build Coastguard Worker# 458*de1e4e89SAndroid Build Coastguard Worker# cbq-128.client-backbone 459*de1e4e89SAndroid Build Coastguard Worker# -------------------------------------------------------------------------- 460*de1e4e89SAndroid Build Coastguard Worker# DEVICE=eth0,10Mbit,1Mbit 461*de1e4e89SAndroid Build Coastguard Worker# RATE=128Kbit 462*de1e4e89SAndroid Build Coastguard Worker# WEIGHT=10Kbit 463*de1e4e89SAndroid Build Coastguard Worker# PRIO=5 464*de1e4e89SAndroid Build Coastguard Worker# RULE=192.168.1.1, 465*de1e4e89SAndroid Build Coastguard Worker# -------------------------------------------------------------------------- 466*de1e4e89SAndroid Build Coastguard Worker# 467*de1e4e89SAndroid Build Coastguard Worker# Pay attention to comma "," in the RULE field - it denotes source address! 468*de1e4e89SAndroid Build Coastguard Worker# 469*de1e4e89SAndroid Build Coastguard Worker# Enjoy. 470*de1e4e89SAndroid Build Coastguard Worker# 471*de1e4e89SAndroid Build Coastguard Worker############################################################################# 472*de1e4e89SAndroid Build Coastguard Worker 473*de1e4e89SAndroid Build Coastguard Workerexport LC_ALL=C 474*de1e4e89SAndroid Build Coastguard Worker 475*de1e4e89SAndroid Build Coastguard Worker### Command locations 476*de1e4e89SAndroid Build Coastguard WorkerTC=/sbin/tc 477*de1e4e89SAndroid Build Coastguard WorkerIP=/sbin/ip 478*de1e4e89SAndroid Build Coastguard WorkerMP=/sbin/modprobe 479*de1e4e89SAndroid Build Coastguard Worker 480*de1e4e89SAndroid Build Coastguard Worker### Default filter priorities (must be different) 481*de1e4e89SAndroid Build Coastguard WorkerPRIO_RULE_DEFAULT=${PRIO_RULE:-100} 482*de1e4e89SAndroid Build Coastguard WorkerPRIO_MARK_DEFAULT=${PRIO_MARK:-200} 483*de1e4e89SAndroid Build Coastguard WorkerPRIO_REALM_DEFAULT=${PRIO_REALM:-300} 484*de1e4e89SAndroid Build Coastguard Worker 485*de1e4e89SAndroid Build Coastguard Worker### Default CBQ_PATH & CBQ_CACHE settings 486*de1e4e89SAndroid Build Coastguard WorkerCBQ_PATH=${CBQ_PATH:-/etc/sysconfig/cbq} 487*de1e4e89SAndroid Build Coastguard WorkerCBQ_CACHE=${CBQ_CACHE:-/var/cache/cbq.init} 488*de1e4e89SAndroid Build Coastguard Worker 489*de1e4e89SAndroid Build Coastguard Worker### Uncomment to enable logfile for debugging 490*de1e4e89SAndroid Build Coastguard Worker#CBQ_DEBUG="/var/run/cbq-$1" 491*de1e4e89SAndroid Build Coastguard Worker 492*de1e4e89SAndroid Build Coastguard Worker### Modules to probe for. Uncomment the last CBQ_PROBE 493*de1e4e89SAndroid Build Coastguard Worker### line if you have QoS support compiled into kernel 494*de1e4e89SAndroid Build Coastguard WorkerCBQ_PROBE="sch_cbq sch_tbf sch_sfq sch_prio" 495*de1e4e89SAndroid Build Coastguard WorkerCBQ_PROBE="$CBQ_PROBE cls_fw cls_u32 cls_route" 496*de1e4e89SAndroid Build Coastguard Worker#CBQ_PROBE="" 497*de1e4e89SAndroid Build Coastguard Worker 498*de1e4e89SAndroid Build Coastguard Worker### Keywords required for qdisc & class configuration 499*de1e4e89SAndroid Build Coastguard WorkerCBQ_WORDS="DEVICE|RATE|WEIGHT|PRIO|PARENT|LEAF|BOUNDED|ISOLATED" 500*de1e4e89SAndroid Build Coastguard WorkerCBQ_WORDS="$CBQ_WORDS|PRIO_MARK|PRIO_RULE|PRIO_REALM|BUFFER" 501*de1e4e89SAndroid Build Coastguard WorkerCBQ_WORDS="$CBQ_WORDS|LIMIT|PEAK|MTU|QUANTUM|PERTURB" 502*de1e4e89SAndroid Build Coastguard Worker 503*de1e4e89SAndroid Build Coastguard Worker### Source AVPKT if it exists 504*de1e4e89SAndroid Build Coastguard Worker[ -r /etc/sysconfig/cbq/avpkt ] && . /etc/sysconfig/cbq/avpkt 505*de1e4e89SAndroid Build Coastguard WorkerAVPKT=${AVPKT:-3000} 506*de1e4e89SAndroid Build Coastguard Worker 507*de1e4e89SAndroid Build Coastguard Worker 508*de1e4e89SAndroid Build Coastguard Worker############################################################################# 509*de1e4e89SAndroid Build Coastguard Worker############################# SUPPORT FUNCTIONS ############################# 510*de1e4e89SAndroid Build Coastguard Worker############################################################################# 511*de1e4e89SAndroid Build Coastguard Worker 512*de1e4e89SAndroid Build Coastguard Worker### Get list of network devices 513*de1e4e89SAndroid Build Coastguard Workercbq_device_list () { 514*de1e4e89SAndroid Build Coastguard Worker ip link show| sed -n "/^[0-9]/ \ 515*de1e4e89SAndroid Build Coastguard Worker { s/^[0-9]\+: \([a-z0-9._]\+\)[:@].*/\1/; p; }" 516*de1e4e89SAndroid Build Coastguard Worker} # cbq_device_list 517*de1e4e89SAndroid Build Coastguard Worker 518*de1e4e89SAndroid Build Coastguard Worker 519*de1e4e89SAndroid Build Coastguard Worker### Remove root class from device $1 520*de1e4e89SAndroid Build Coastguard Workercbq_device_off () { 521*de1e4e89SAndroid Build Coastguard Worker tc qdisc del dev $1 root 2> /dev/null 522*de1e4e89SAndroid Build Coastguard Worker} # cbq_device_off 523*de1e4e89SAndroid Build Coastguard Worker 524*de1e4e89SAndroid Build Coastguard Worker 525*de1e4e89SAndroid Build Coastguard Worker### Remove CBQ from all devices 526*de1e4e89SAndroid Build Coastguard Workercbq_off () { 527*de1e4e89SAndroid Build Coastguard Worker for dev in `cbq_device_list`; do 528*de1e4e89SAndroid Build Coastguard Worker cbq_device_off $dev 529*de1e4e89SAndroid Build Coastguard Worker done 530*de1e4e89SAndroid Build Coastguard Worker} # cbq_off 531*de1e4e89SAndroid Build Coastguard Worker 532*de1e4e89SAndroid Build Coastguard Worker 533*de1e4e89SAndroid Build Coastguard Worker### Prefixed message 534*de1e4e89SAndroid Build Coastguard Workercbq_message () { 535*de1e4e89SAndroid Build Coastguard Worker echo -e "**CBQ: $*" 536*de1e4e89SAndroid Build Coastguard Worker} # cbq_message 537*de1e4e89SAndroid Build Coastguard Worker 538*de1e4e89SAndroid Build Coastguard Worker### Failure message 539*de1e4e89SAndroid Build Coastguard Workercbq_failure () { 540*de1e4e89SAndroid Build Coastguard Worker cbq_message "$@" 541*de1e4e89SAndroid Build Coastguard Worker exit 1 542*de1e4e89SAndroid Build Coastguard Worker} # cbq_failure 543*de1e4e89SAndroid Build Coastguard Worker 544*de1e4e89SAndroid Build Coastguard Worker### Failure w/ cbq-off 545*de1e4e89SAndroid Build Coastguard Workercbq_fail_off () { 546*de1e4e89SAndroid Build Coastguard Worker cbq_message "$@" 547*de1e4e89SAndroid Build Coastguard Worker cbq_off 548*de1e4e89SAndroid Build Coastguard Worker exit 1 549*de1e4e89SAndroid Build Coastguard Worker} # cbq_fail_off 550*de1e4e89SAndroid Build Coastguard Worker 551*de1e4e89SAndroid Build Coastguard Worker 552*de1e4e89SAndroid Build Coastguard Worker### Convert time to absolute value 553*de1e4e89SAndroid Build Coastguard Workercbq_time2abs () { 554*de1e4e89SAndroid Build Coastguard Worker local min=${1##*:}; min=${min##0} 555*de1e4e89SAndroid Build Coastguard Worker local hrs=${1%%:*}; hrs=${hrs##0} 556*de1e4e89SAndroid Build Coastguard Worker echo $[hrs*60 + min] 557*de1e4e89SAndroid Build Coastguard Worker} # cbq_time2abs 558*de1e4e89SAndroid Build Coastguard Worker 559*de1e4e89SAndroid Build Coastguard Worker 560*de1e4e89SAndroid Build Coastguard Worker### Display CBQ setup 561*de1e4e89SAndroid Build Coastguard Workercbq_show () { 562*de1e4e89SAndroid Build Coastguard Worker for dev in `cbq_device_list`; do 563*de1e4e89SAndroid Build Coastguard Worker [ "`tc qdisc show dev $dev| wc -l`" -eq 0 ] && continue 564*de1e4e89SAndroid Build Coastguard Worker echo -e "### $dev: queueing disciplines\n" 565*de1e4e89SAndroid Build Coastguard Worker tc $1 qdisc show dev $dev; echo 566*de1e4e89SAndroid Build Coastguard Worker 567*de1e4e89SAndroid Build Coastguard Worker [ "`tc class show dev $dev| wc -l`" -eq 0 ] && continue 568*de1e4e89SAndroid Build Coastguard Worker echo -e "### $dev: traffic classes\n" 569*de1e4e89SAndroid Build Coastguard Worker tc $1 class show dev $dev; echo 570*de1e4e89SAndroid Build Coastguard Worker 571*de1e4e89SAndroid Build Coastguard Worker [ "`tc filter show dev $dev| wc -l`" -eq 0 ] && continue 572*de1e4e89SAndroid Build Coastguard Worker echo -e "### $dev: filtering rules\n" 573*de1e4e89SAndroid Build Coastguard Worker tc $1 filter show dev $dev; echo 574*de1e4e89SAndroid Build Coastguard Worker done 575*de1e4e89SAndroid Build Coastguard Worker} # cbq_show 576*de1e4e89SAndroid Build Coastguard Worker 577*de1e4e89SAndroid Build Coastguard Worker 578*de1e4e89SAndroid Build Coastguard Worker### Check configuration and load DEVICES, DEVFIELDS and CLASSLIST from $1 579*de1e4e89SAndroid Build Coastguard Workercbq_init () { 580*de1e4e89SAndroid Build Coastguard Worker ### Get a list of configured classes 581*de1e4e89SAndroid Build Coastguard Worker CLASSLIST=`find $1 -maxdepth 1 \( -type f -or -type l \) -name 'cbq-*' \ 582*de1e4e89SAndroid Build Coastguard Worker -not -name '*~' -printf "%f\n"| sort` 583*de1e4e89SAndroid Build Coastguard Worker [ -z "$CLASSLIST" ] && 584*de1e4e89SAndroid Build Coastguard Worker cbq_failure "no configuration files found in $1!" 585*de1e4e89SAndroid Build Coastguard Worker 586*de1e4e89SAndroid Build Coastguard Worker ### Gather all DEVICE fields from $1/cbq-* 587*de1e4e89SAndroid Build Coastguard Worker DEVFIELDS=`find $1 -maxdepth 1 \( -type f -or -type l \) -name 'cbq-*' \ 588*de1e4e89SAndroid Build Coastguard Worker -not -name '*~' -print0 | xargs -0 sed -n 's/#.*//; \ 589*de1e4e89SAndroid Build Coastguard Worker s/[[:space:]]//g; /^DEVICE=[^,]*,[^,]*\(,[^,]*\)\?/ \ 590*de1e4e89SAndroid Build Coastguard Worker { s/.*=//; p; }'| sort -u` 591*de1e4e89SAndroid Build Coastguard Worker [ -z "$DEVFIELDS" ] && 592*de1e4e89SAndroid Build Coastguard Worker cbq_failure "no DEVICE field found in $1/cbq-*!" 593*de1e4e89SAndroid Build Coastguard Worker 594*de1e4e89SAndroid Build Coastguard Worker ### Check for different DEVICE fields for the same device 595*de1e4e89SAndroid Build Coastguard Worker DEVICES=`echo "$DEVFIELDS"| sed 's/,.*//'| sort -u` 596*de1e4e89SAndroid Build Coastguard Worker [ "`echo "$DEVICES"| wc -l`" -ne "`echo "$DEVFIELDS"| wc -l`" ] && 597*de1e4e89SAndroid Build Coastguard Worker cbq_failure "different DEVICE fields for single device!\n$DEVFIELDS" 598*de1e4e89SAndroid Build Coastguard Worker} # cbq_init 599*de1e4e89SAndroid Build Coastguard Worker 600*de1e4e89SAndroid Build Coastguard Worker 601*de1e4e89SAndroid Build Coastguard Worker### Load class configuration from $1/$2 602*de1e4e89SAndroid Build Coastguard Workercbq_load_class () { 603*de1e4e89SAndroid Build Coastguard Worker CLASS=`echo $2| sed 's/^cbq-0*//; s/^\([0-9a-fA-F]\+\).*/\1/'` 604*de1e4e89SAndroid Build Coastguard Worker CFILE=`sed -n 's/#.*//; s/[[:space:]]//g; /^[[:alnum:]_]\+=[[:alnum:].,:;/*@-_]\+$/ p' $1/$2` 605*de1e4e89SAndroid Build Coastguard Worker 606*de1e4e89SAndroid Build Coastguard Worker ### Check class number 607*de1e4e89SAndroid Build Coastguard Worker IDVAL=`/usr/bin/printf "%d" 0x$CLASS 2> /dev/null` 608*de1e4e89SAndroid Build Coastguard Worker [ $? -ne 0 -o $IDVAL -lt 2 -o $IDVAL -gt 65535 ] && 609*de1e4e89SAndroid Build Coastguard Worker cbq_fail_off "class ID of $2 must be in range <0002-FFFF>!" 610*de1e4e89SAndroid Build Coastguard Worker 611*de1e4e89SAndroid Build Coastguard Worker ### Set defaults & load class 612*de1e4e89SAndroid Build Coastguard Worker RATE=""; WEIGHT=""; PARENT=""; PRIO=5 613*de1e4e89SAndroid Build Coastguard Worker LEAF=tbf; BOUNDED=yes; ISOLATED=no 614*de1e4e89SAndroid Build Coastguard Worker BUFFER=10Kb/8; LIMIT=15Kb; MTU=1500 615*de1e4e89SAndroid Build Coastguard Worker PEAK=""; PERTURB=10; QUANTUM="" 616*de1e4e89SAndroid Build Coastguard Worker 617*de1e4e89SAndroid Build Coastguard Worker PRIO_RULE=$PRIO_RULE_DEFAULT 618*de1e4e89SAndroid Build Coastguard Worker PRIO_MARK=$PRIO_MARK_DEFAULT 619*de1e4e89SAndroid Build Coastguard Worker PRIO_REALM=$PRIO_REALM_DEFAULT 620*de1e4e89SAndroid Build Coastguard Worker 621*de1e4e89SAndroid Build Coastguard Worker eval "`echo "$CFILE"| grep -E "^($CBQ_WORDS)="`" 622*de1e4e89SAndroid Build Coastguard Worker 623*de1e4e89SAndroid Build Coastguard Worker ### Require RATE/WEIGHT 624*de1e4e89SAndroid Build Coastguard Worker [ -z "$RATE" -o -z "$WEIGHT" ] && 625*de1e4e89SAndroid Build Coastguard Worker cbq_fail_off "missing RATE or WEIGHT in $2!" 626*de1e4e89SAndroid Build Coastguard Worker 627*de1e4e89SAndroid Build Coastguard Worker ### Class device 628*de1e4e89SAndroid Build Coastguard Worker DEVICE=${DEVICE%%,*} 629*de1e4e89SAndroid Build Coastguard Worker [ -z "$DEVICE" ] && cbq_fail_off "missing DEVICE field in $2!" 630*de1e4e89SAndroid Build Coastguard Worker 631*de1e4e89SAndroid Build Coastguard Worker BANDWIDTH=`echo "$DEVFIELDS"| sed -n "/^$DEVICE,/ \ 632*de1e4e89SAndroid Build Coastguard Worker { s/[^,]*,\([^,]*\).*/\1/; p; q; }"` 633*de1e4e89SAndroid Build Coastguard Worker 634*de1e4e89SAndroid Build Coastguard Worker ### Convert to "tc" options 635*de1e4e89SAndroid Build Coastguard Worker PEAK=${PEAK:+peakrate $PEAK} 636*de1e4e89SAndroid Build Coastguard Worker PERTURB=${PERTURB:+perturb $PERTURB} 637*de1e4e89SAndroid Build Coastguard Worker QUANTUM=${QUANTUM:+quantum $QUANTUM} 638*de1e4e89SAndroid Build Coastguard Worker 639*de1e4e89SAndroid Build Coastguard Worker [ "$BOUNDED" = "no" ] && BOUNDED="" || BOUNDED="bounded" 640*de1e4e89SAndroid Build Coastguard Worker [ "$ISOLATED" = "yes" ] && ISOLATED="isolated" || ISOLATED="" 641*de1e4e89SAndroid Build Coastguard Worker} # cbq_load_class 642*de1e4e89SAndroid Build Coastguard Worker 643*de1e4e89SAndroid Build Coastguard Worker 644*de1e4e89SAndroid Build Coastguard Worker############################################################################# 645*de1e4e89SAndroid Build Coastguard Worker#################################### INIT ################################### 646*de1e4e89SAndroid Build Coastguard Worker############################################################################# 647*de1e4e89SAndroid Build Coastguard Worker 648*de1e4e89SAndroid Build Coastguard Worker### Check for presence of ip-route2 in usual place 649*de1e4e89SAndroid Build Coastguard Worker[ -x $TC -a -x $IP ] || 650*de1e4e89SAndroid Build Coastguard Worker cbq_failure "ip-route2 utilities not installed or executable!" 651*de1e4e89SAndroid Build Coastguard Worker 652*de1e4e89SAndroid Build Coastguard Worker 653*de1e4e89SAndroid Build Coastguard Worker### ip/tc wrappers 654*de1e4e89SAndroid Build Coastguard Workerif [ "$1" = "compile" ]; then 655*de1e4e89SAndroid Build Coastguard Worker ### no module probing 656*de1e4e89SAndroid Build Coastguard Worker CBQ_PROBE="" 657*de1e4e89SAndroid Build Coastguard Worker 658*de1e4e89SAndroid Build Coastguard Worker ip () { 659*de1e4e89SAndroid Build Coastguard Worker $IP "$@" 660*de1e4e89SAndroid Build Coastguard Worker } # ip 661*de1e4e89SAndroid Build Coastguard Worker 662*de1e4e89SAndroid Build Coastguard Worker ### echo-only version of "tc" command 663*de1e4e89SAndroid Build Coastguard Worker tc () { 664*de1e4e89SAndroid Build Coastguard Worker echo "$TC $*" 665*de1e4e89SAndroid Build Coastguard Worker } # tc 666*de1e4e89SAndroid Build Coastguard Worker 667*de1e4e89SAndroid Build Coastguard Workerelif [ -n "$CBQ_DEBUG" ]; then 668*de1e4e89SAndroid Build Coastguard Worker echo -e "# `date`" > $CBQ_DEBUG 669*de1e4e89SAndroid Build Coastguard Worker 670*de1e4e89SAndroid Build Coastguard Worker ### Logging version of "ip" command 671*de1e4e89SAndroid Build Coastguard Worker ip () { 672*de1e4e89SAndroid Build Coastguard Worker echo -e "\n# ip $*" >> $CBQ_DEBUG 673*de1e4e89SAndroid Build Coastguard Worker $IP "$@" 2>&1 | tee -a $CBQ_DEBUG 674*de1e4e89SAndroid Build Coastguard Worker } # ip 675*de1e4e89SAndroid Build Coastguard Worker 676*de1e4e89SAndroid Build Coastguard Worker ### Logging version of "tc" command 677*de1e4e89SAndroid Build Coastguard Worker tc () { 678*de1e4e89SAndroid Build Coastguard Worker echo -e "\n# tc $*" >> $CBQ_DEBUG 679*de1e4e89SAndroid Build Coastguard Worker $TC "$@" 2>&1 | tee -a $CBQ_DEBUG 680*de1e4e89SAndroid Build Coastguard Worker } # tc 681*de1e4e89SAndroid Build Coastguard Workerelse 682*de1e4e89SAndroid Build Coastguard Worker ### Default wrappers 683*de1e4e89SAndroid Build Coastguard Worker 684*de1e4e89SAndroid Build Coastguard Worker ip () { 685*de1e4e89SAndroid Build Coastguard Worker $IP "$@" 686*de1e4e89SAndroid Build Coastguard Worker } # ip 687*de1e4e89SAndroid Build Coastguard Worker 688*de1e4e89SAndroid Build Coastguard Worker tc () { 689*de1e4e89SAndroid Build Coastguard Worker $TC "$@" 690*de1e4e89SAndroid Build Coastguard Worker } # tc 691*de1e4e89SAndroid Build Coastguard Workerfi # ip/tc wrappers 692*de1e4e89SAndroid Build Coastguard Worker 693*de1e4e89SAndroid Build Coastguard Worker 694*de1e4e89SAndroid Build Coastguard Workercase "$1" in 695*de1e4e89SAndroid Build Coastguard Worker 696*de1e4e89SAndroid Build Coastguard Worker############################################################################# 697*de1e4e89SAndroid Build Coastguard Worker############################### START/COMPILE ############################### 698*de1e4e89SAndroid Build Coastguard Worker############################################################################# 699*de1e4e89SAndroid Build Coastguard Worker 700*de1e4e89SAndroid Build Coastguard Workerstart|compile) 701*de1e4e89SAndroid Build Coastguard Worker 702*de1e4e89SAndroid Build Coastguard Worker### Probe QoS modules (start only) 703*de1e4e89SAndroid Build Coastguard Workerfor module in $CBQ_PROBE; do 704*de1e4e89SAndroid Build Coastguard Worker $MP $module || cbq_failure "failed to load module $module" 705*de1e4e89SAndroid Build Coastguard Workerdone 706*de1e4e89SAndroid Build Coastguard Worker 707*de1e4e89SAndroid Build Coastguard Worker### If we are in compile/nocache/logging mode, don't bother with cache 708*de1e4e89SAndroid Build Coastguard Workerif [ "$1" != "compile" -a "$2" != "nocache" -a -z "$CBQ_DEBUG" ]; then 709*de1e4e89SAndroid Build Coastguard Worker VALID=1 710*de1e4e89SAndroid Build Coastguard Worker 711*de1e4e89SAndroid Build Coastguard Worker ### validate the cache 712*de1e4e89SAndroid Build Coastguard Worker [ "$2" = "invalidate" -o ! -f $CBQ_CACHE ] && VALID=0 713*de1e4e89SAndroid Build Coastguard Worker if [ $VALID -eq 1 ]; then 714*de1e4e89SAndroid Build Coastguard Worker [ "`find $CBQ_PATH -maxdepth 1 -newer $CBQ_CACHE| \ 715*de1e4e89SAndroid Build Coastguard Worker wc -l`" -gt 0 ] && VALID=0 716*de1e4e89SAndroid Build Coastguard Worker fi 717*de1e4e89SAndroid Build Coastguard Worker 718*de1e4e89SAndroid Build Coastguard Worker ### compile the config if the cache is invalid 719*de1e4e89SAndroid Build Coastguard Worker if [ $VALID -ne 1 ]; then 720*de1e4e89SAndroid Build Coastguard Worker $0 compile > $CBQ_CACHE || 721*de1e4e89SAndroid Build Coastguard Worker cbq_fail_off "failed to compile CBQ configuration!" 722*de1e4e89SAndroid Build Coastguard Worker fi 723*de1e4e89SAndroid Build Coastguard Worker 724*de1e4e89SAndroid Build Coastguard Worker ### run the cached commands 725*de1e4e89SAndroid Build Coastguard Worker exec /bin/sh $CBQ_CACHE 2> /dev/null 726*de1e4e89SAndroid Build Coastguard Workerfi 727*de1e4e89SAndroid Build Coastguard Worker 728*de1e4e89SAndroid Build Coastguard Worker### Load DEVICES, DEVFIELDS and CLASSLIST 729*de1e4e89SAndroid Build Coastguard Workercbq_init $CBQ_PATH 730*de1e4e89SAndroid Build Coastguard Worker 731*de1e4e89SAndroid Build Coastguard Worker 732*de1e4e89SAndroid Build Coastguard Worker### Setup root qdisc on all configured devices 733*de1e4e89SAndroid Build Coastguard Workerfor dev in $DEVICES; do 734*de1e4e89SAndroid Build Coastguard Worker ### Retrieve device bandwidth and, optionally, weight 735*de1e4e89SAndroid Build Coastguard Worker DEVTEMP=`echo "$DEVFIELDS"| sed -n "/^$dev,/ { s/$dev,//; p; q; }"` 736*de1e4e89SAndroid Build Coastguard Worker DEVBWDT=${DEVTEMP%%,*}; DEVWGHT=${DEVTEMP##*,} 737*de1e4e89SAndroid Build Coastguard Worker [ "$DEVBWDT" = "$DEVWGHT" ] && DEVWGHT="" 738*de1e4e89SAndroid Build Coastguard Worker 739*de1e4e89SAndroid Build Coastguard Worker ### Device bandwidth is required 740*de1e4e89SAndroid Build Coastguard Worker if [ -z "$DEVBWDT" ]; then 741*de1e4e89SAndroid Build Coastguard Worker cbq_message "could not determine bandwidth for device $dev!" 742*de1e4e89SAndroid Build Coastguard Worker cbq_failure "please set up the DEVICE fields properly!" 743*de1e4e89SAndroid Build Coastguard Worker fi 744*de1e4e89SAndroid Build Coastguard Worker 745*de1e4e89SAndroid Build Coastguard Worker ### Check if the device is there 746*de1e4e89SAndroid Build Coastguard Worker ip link show $dev &> /dev/null || 747*de1e4e89SAndroid Build Coastguard Worker cbq_fail_off "device $dev not found!" 748*de1e4e89SAndroid Build Coastguard Worker 749*de1e4e89SAndroid Build Coastguard Worker ### Remove old root qdisc from device 750*de1e4e89SAndroid Build Coastguard Worker cbq_device_off $dev 751*de1e4e89SAndroid Build Coastguard Worker 752*de1e4e89SAndroid Build Coastguard Worker 753*de1e4e89SAndroid Build Coastguard Worker ### Setup root qdisc + class for device 754*de1e4e89SAndroid Build Coastguard Worker tc qdisc add dev $dev root handle 1 cbq \ 755*de1e4e89SAndroid Build Coastguard Worker bandwidth $DEVBWDT avpkt $AVPKT cell 8 756*de1e4e89SAndroid Build Coastguard Worker 757*de1e4e89SAndroid Build Coastguard Worker ### Set weight of the root class if set 758*de1e4e89SAndroid Build Coastguard Worker [ -n "$DEVWGHT" ] && 759*de1e4e89SAndroid Build Coastguard Worker tc class change dev $dev root cbq weight $DEVWGHT allot 1514 760*de1e4e89SAndroid Build Coastguard Worker 761*de1e4e89SAndroid Build Coastguard Worker [ "$1" = "compile" ] && echo 762*de1e4e89SAndroid Build Coastguard Workerdone # dev 763*de1e4e89SAndroid Build Coastguard Worker 764*de1e4e89SAndroid Build Coastguard Worker 765*de1e4e89SAndroid Build Coastguard Worker### Setup traffic classes 766*de1e4e89SAndroid Build Coastguard Workerfor classfile in $CLASSLIST; do 767*de1e4e89SAndroid Build Coastguard Worker cbq_load_class $CBQ_PATH $classfile 768*de1e4e89SAndroid Build Coastguard Worker 769*de1e4e89SAndroid Build Coastguard Worker ### Create the class 770*de1e4e89SAndroid Build Coastguard Worker tc class add dev $DEVICE parent 1:$PARENT classid 1:$CLASS cbq \ 771*de1e4e89SAndroid Build Coastguard Worker bandwidth $BANDWIDTH rate $RATE weight $WEIGHT prio $PRIO \ 772*de1e4e89SAndroid Build Coastguard Worker allot 1514 cell 8 maxburst 20 avpkt $AVPKT $BOUNDED $ISOLATED || 773*de1e4e89SAndroid Build Coastguard Worker cbq_fail_off "failed to add class $CLASS with parent $PARENT on $DEVICE!" 774*de1e4e89SAndroid Build Coastguard Worker 775*de1e4e89SAndroid Build Coastguard Worker ### Create leaf qdisc if set 776*de1e4e89SAndroid Build Coastguard Worker if [ "$LEAF" = "tbf" ]; then 777*de1e4e89SAndroid Build Coastguard Worker tc qdisc add dev $DEVICE parent 1:$CLASS handle $CLASS tbf \ 778*de1e4e89SAndroid Build Coastguard Worker rate $RATE buffer $BUFFER limit $LIMIT mtu $MTU $PEAK 779*de1e4e89SAndroid Build Coastguard Worker elif [ "$LEAF" = "sfq" ]; then 780*de1e4e89SAndroid Build Coastguard Worker tc qdisc add dev $DEVICE parent 1:$CLASS handle $CLASS sfq \ 781*de1e4e89SAndroid Build Coastguard Worker $PERTURB $QUANTUM 782*de1e4e89SAndroid Build Coastguard Worker fi 783*de1e4e89SAndroid Build Coastguard Worker 784*de1e4e89SAndroid Build Coastguard Worker 785*de1e4e89SAndroid Build Coastguard Worker ### Create fw filter for MARK fields 786*de1e4e89SAndroid Build Coastguard Worker for mark in `echo "$CFILE"| sed -n '/^MARK/ { s/.*=//; p; }'`; do 787*de1e4e89SAndroid Build Coastguard Worker ### Attach fw filter to root class 788*de1e4e89SAndroid Build Coastguard Worker tc filter add dev $DEVICE parent 1:0 protocol ip \ 789*de1e4e89SAndroid Build Coastguard Worker prio $PRIO_MARK handle $mark fw classid 1:$CLASS 790*de1e4e89SAndroid Build Coastguard Worker done ### mark 791*de1e4e89SAndroid Build Coastguard Worker 792*de1e4e89SAndroid Build Coastguard Worker ### Create route filter for REALM fields 793*de1e4e89SAndroid Build Coastguard Worker for realm in `echo "$CFILE"| sed -n '/^REALM/ { s/.*=//; p; }'`; do 794*de1e4e89SAndroid Build Coastguard Worker ### Split realm into source & destination realms 795*de1e4e89SAndroid Build Coastguard Worker SREALM=${realm%%,*}; DREALM=${realm##*,} 796*de1e4e89SAndroid Build Coastguard Worker [ "$SREALM" = "$DREALM" ] && SREALM="" 797*de1e4e89SAndroid Build Coastguard Worker 798*de1e4e89SAndroid Build Coastguard Worker ### Convert asterisks to empty strings 799*de1e4e89SAndroid Build Coastguard Worker SREALM=${SREALM#\*}; DREALM=${DREALM#\*} 800*de1e4e89SAndroid Build Coastguard Worker 801*de1e4e89SAndroid Build Coastguard Worker ### Attach route filter to the root class 802*de1e4e89SAndroid Build Coastguard Worker tc filter add dev $DEVICE parent 1:0 protocol ip \ 803*de1e4e89SAndroid Build Coastguard Worker prio $PRIO_REALM route ${SREALM:+from $SREALM} \ 804*de1e4e89SAndroid Build Coastguard Worker ${DREALM:+to $DREALM} classid 1:$CLASS 805*de1e4e89SAndroid Build Coastguard Worker done ### realm 806*de1e4e89SAndroid Build Coastguard Worker 807*de1e4e89SAndroid Build Coastguard Worker ### Create u32 filter for RULE fields 808*de1e4e89SAndroid Build Coastguard Worker for rule in `echo "$CFILE"| sed -n '/^RULE/ { s/.*=//; p; }'`; do 809*de1e4e89SAndroid Build Coastguard Worker ### Split rule into source & destination 810*de1e4e89SAndroid Build Coastguard Worker SRC=${rule%%,*}; DST=${rule##*,} 811*de1e4e89SAndroid Build Coastguard Worker [ "$SRC" = "$rule" ] && SRC="" 812*de1e4e89SAndroid Build Coastguard Worker 813*de1e4e89SAndroid Build Coastguard Worker 814*de1e4e89SAndroid Build Coastguard Worker ### Split destination into address, port & mask fields 815*de1e4e89SAndroid Build Coastguard Worker DADDR=${DST%%:*}; DTEMP=${DST##*:} 816*de1e4e89SAndroid Build Coastguard Worker [ "$DADDR" = "$DST" ] && DTEMP="" 817*de1e4e89SAndroid Build Coastguard Worker 818*de1e4e89SAndroid Build Coastguard Worker DPORT=${DTEMP%%/*}; DMASK=${DTEMP##*/} 819*de1e4e89SAndroid Build Coastguard Worker [ "$DPORT" = "$DTEMP" ] && DMASK="0xffff" 820*de1e4e89SAndroid Build Coastguard Worker 821*de1e4e89SAndroid Build Coastguard Worker 822*de1e4e89SAndroid Build Coastguard Worker ### Split up source (if specified) 823*de1e4e89SAndroid Build Coastguard Worker SADDR=""; SPORT="" 824*de1e4e89SAndroid Build Coastguard Worker if [ -n "$SRC" ]; then 825*de1e4e89SAndroid Build Coastguard Worker SADDR=${SRC%%:*}; STEMP=${SRC##*:} 826*de1e4e89SAndroid Build Coastguard Worker [ "$SADDR" = "$SRC" ] && STEMP="" 827*de1e4e89SAndroid Build Coastguard Worker 828*de1e4e89SAndroid Build Coastguard Worker SPORT=${STEMP%%/*}; SMASK=${STEMP##*/} 829*de1e4e89SAndroid Build Coastguard Worker [ "$SPORT" = "$STEMP" ] && SMASK="0xffff" 830*de1e4e89SAndroid Build Coastguard Worker fi 831*de1e4e89SAndroid Build Coastguard Worker 832*de1e4e89SAndroid Build Coastguard Worker 833*de1e4e89SAndroid Build Coastguard Worker ### Convert asterisks to empty strings 834*de1e4e89SAndroid Build Coastguard Worker SADDR=${SADDR#\*}; DADDR=${DADDR#\*} 835*de1e4e89SAndroid Build Coastguard Worker 836*de1e4e89SAndroid Build Coastguard Worker ### Compose u32 filter rules 837*de1e4e89SAndroid Build Coastguard Worker u32_s="${SPORT:+match ip sport $SPORT $SMASK}" 838*de1e4e89SAndroid Build Coastguard Worker u32_s="${SADDR:+match ip src $SADDR} $u32_s" 839*de1e4e89SAndroid Build Coastguard Worker u32_d="${DPORT:+match ip dport $DPORT $DMASK}" 840*de1e4e89SAndroid Build Coastguard Worker u32_d="${DADDR:+match ip dst $DADDR} $u32_d" 841*de1e4e89SAndroid Build Coastguard Worker 842*de1e4e89SAndroid Build Coastguard Worker ### Uncomment the following if you want to see parsed rules 843*de1e4e89SAndroid Build Coastguard Worker #echo "$rule: $u32_s $u32_d" 844*de1e4e89SAndroid Build Coastguard Worker 845*de1e4e89SAndroid Build Coastguard Worker ### Attach u32 filter to the appropriate class 846*de1e4e89SAndroid Build Coastguard Worker tc filter add dev $DEVICE parent 1:0 protocol ip \ 847*de1e4e89SAndroid Build Coastguard Worker prio $PRIO_RULE u32 $u32_s $u32_d classid 1:$CLASS 848*de1e4e89SAndroid Build Coastguard Worker done ### rule 849*de1e4e89SAndroid Build Coastguard Worker 850*de1e4e89SAndroid Build Coastguard Worker [ "$1" = "compile" ] && echo 851*de1e4e89SAndroid Build Coastguard Workerdone ### classfile 852*de1e4e89SAndroid Build Coastguard Worker;; 853*de1e4e89SAndroid Build Coastguard Worker 854*de1e4e89SAndroid Build Coastguard Worker 855*de1e4e89SAndroid Build Coastguard Worker############################################################################# 856*de1e4e89SAndroid Build Coastguard Worker################################# TIME CHECK ################################ 857*de1e4e89SAndroid Build Coastguard Worker############################################################################# 858*de1e4e89SAndroid Build Coastguard Worker 859*de1e4e89SAndroid Build Coastguard Workertimecheck) 860*de1e4e89SAndroid Build Coastguard Worker 861*de1e4e89SAndroid Build Coastguard Worker### Get time + weekday 862*de1e4e89SAndroid Build Coastguard WorkerTIME_TMP=`date +%w/%k:%M` 863*de1e4e89SAndroid Build Coastguard WorkerTIME_DOW=${TIME_TMP%%/*} 864*de1e4e89SAndroid Build Coastguard WorkerTIME_NOW=${TIME_TMP##*/} 865*de1e4e89SAndroid Build Coastguard Worker 866*de1e4e89SAndroid Build Coastguard Worker### Load DEVICES, DEVFIELDS and CLASSLIST 867*de1e4e89SAndroid Build Coastguard Workercbq_init $CBQ_PATH 868*de1e4e89SAndroid Build Coastguard Worker 869*de1e4e89SAndroid Build Coastguard Worker### Run through all classes 870*de1e4e89SAndroid Build Coastguard Workerfor classfile in $CLASSLIST; do 871*de1e4e89SAndroid Build Coastguard Worker ### Gather all TIME rules from class config 872*de1e4e89SAndroid Build Coastguard Worker TIMESET=`sed -n 's/#.*//; s/[[:space:]]//g; /^TIME/ { s/.*=//; p; }' \ 873*de1e4e89SAndroid Build Coastguard Worker $CBQ_PATH/$classfile` 874*de1e4e89SAndroid Build Coastguard Worker [ -z "$TIMESET" ] && continue 875*de1e4e89SAndroid Build Coastguard Worker 876*de1e4e89SAndroid Build Coastguard Worker MATCH=0; CHANGE=0 877*de1e4e89SAndroid Build Coastguard Worker for timerule in $TIMESET; do 878*de1e4e89SAndroid Build Coastguard Worker TIME_ABS=`cbq_time2abs $TIME_NOW` 879*de1e4e89SAndroid Build Coastguard Worker 880*de1e4e89SAndroid Build Coastguard Worker ### Split TIME rule to pieces 881*de1e4e89SAndroid Build Coastguard Worker TIMESPEC=${timerule%%;*}; PARAMS=${timerule##*;} 882*de1e4e89SAndroid Build Coastguard Worker WEEKDAYS=${TIMESPEC%%/*}; INTERVAL=${TIMESPEC##*/} 883*de1e4e89SAndroid Build Coastguard Worker BEG_TIME=${INTERVAL%%-*}; END_TIME=${INTERVAL##*-} 884*de1e4e89SAndroid Build Coastguard Worker 885*de1e4e89SAndroid Build Coastguard Worker ### Check the day-of-week (if present) 886*de1e4e89SAndroid Build Coastguard Worker [ "$WEEKDAYS" != "$INTERVAL" -a \ 887*de1e4e89SAndroid Build Coastguard Worker -n "${WEEKDAYS##*$TIME_DOW*}" ] && continue 888*de1e4e89SAndroid Build Coastguard Worker 889*de1e4e89SAndroid Build Coastguard Worker ### Compute interval boundaries 890*de1e4e89SAndroid Build Coastguard Worker BEG_ABS=`cbq_time2abs $BEG_TIME` 891*de1e4e89SAndroid Build Coastguard Worker END_ABS=`cbq_time2abs $END_TIME` 892*de1e4e89SAndroid Build Coastguard Worker 893*de1e4e89SAndroid Build Coastguard Worker ### Midnight wrap fixup 894*de1e4e89SAndroid Build Coastguard Worker if [ $BEG_ABS -gt $END_ABS ]; then 895*de1e4e89SAndroid Build Coastguard Worker [ $TIME_ABS -le $END_ABS ] && 896*de1e4e89SAndroid Build Coastguard Worker TIME_ABS=$[TIME_ABS + 24*60] 897*de1e4e89SAndroid Build Coastguard Worker 898*de1e4e89SAndroid Build Coastguard Worker END_ABS=$[END_ABS + 24*60] 899*de1e4e89SAndroid Build Coastguard Worker fi 900*de1e4e89SAndroid Build Coastguard Worker 901*de1e4e89SAndroid Build Coastguard Worker ### If the time matches, remember params and set MATCH flag 902*de1e4e89SAndroid Build Coastguard Worker if [ $TIME_ABS -ge $BEG_ABS -a $TIME_ABS -lt $END_ABS ]; then 903*de1e4e89SAndroid Build Coastguard Worker TMP_RATE=${PARAMS%%/*}; PARAMS=${PARAMS#*/} 904*de1e4e89SAndroid Build Coastguard Worker TMP_WGHT=${PARAMS%%/*}; TMP_PEAK=${PARAMS##*/} 905*de1e4e89SAndroid Build Coastguard Worker 906*de1e4e89SAndroid Build Coastguard Worker [ "$TMP_PEAK" = "$TMP_WGHT" ] && TMP_PEAK="" 907*de1e4e89SAndroid Build Coastguard Worker TMP_PEAK=${TMP_PEAK:+peakrate $TMP_PEAK} 908*de1e4e89SAndroid Build Coastguard Worker 909*de1e4e89SAndroid Build Coastguard Worker MATCH=1 910*de1e4e89SAndroid Build Coastguard Worker fi 911*de1e4e89SAndroid Build Coastguard Worker done ### timerule 912*de1e4e89SAndroid Build Coastguard Worker 913*de1e4e89SAndroid Build Coastguard Worker 914*de1e4e89SAndroid Build Coastguard Worker cbq_load_class $CBQ_PATH $classfile 915*de1e4e89SAndroid Build Coastguard Worker 916*de1e4e89SAndroid Build Coastguard Worker ### Get current RATE of CBQ class 917*de1e4e89SAndroid Build Coastguard Worker RATE_NOW=`tc class show dev $DEVICE| sed -n \ 918*de1e4e89SAndroid Build Coastguard Worker "/cbq 1:$CLASS / { s/.*rate //; s/ .*//; p; q; }"` 919*de1e4e89SAndroid Build Coastguard Worker [ -z "$RATE_NOW" ] && continue 920*de1e4e89SAndroid Build Coastguard Worker 921*de1e4e89SAndroid Build Coastguard Worker ### Time interval matched 922*de1e4e89SAndroid Build Coastguard Worker if [ $MATCH -ne 0 ]; then 923*de1e4e89SAndroid Build Coastguard Worker 924*de1e4e89SAndroid Build Coastguard Worker ### Check if there is any change in class RATE 925*de1e4e89SAndroid Build Coastguard Worker if [ "$RATE_NOW" != "$TMP_RATE" ]; then 926*de1e4e89SAndroid Build Coastguard Worker NEW_RATE="$TMP_RATE" 927*de1e4e89SAndroid Build Coastguard Worker NEW_WGHT="$TMP_WGHT" 928*de1e4e89SAndroid Build Coastguard Worker NEW_PEAK="$TMP_PEAK" 929*de1e4e89SAndroid Build Coastguard Worker CHANGE=1 930*de1e4e89SAndroid Build Coastguard Worker fi 931*de1e4e89SAndroid Build Coastguard Worker 932*de1e4e89SAndroid Build Coastguard Worker ### Match not found, reset to default RATE if necessary 933*de1e4e89SAndroid Build Coastguard Worker elif [ "$RATE_NOW" != "$RATE" ]; then 934*de1e4e89SAndroid Build Coastguard Worker NEW_WGHT="$WEIGHT" 935*de1e4e89SAndroid Build Coastguard Worker NEW_RATE="$RATE" 936*de1e4e89SAndroid Build Coastguard Worker NEW_PEAK="$PEAK" 937*de1e4e89SAndroid Build Coastguard Worker CHANGE=1 938*de1e4e89SAndroid Build Coastguard Worker fi 939*de1e4e89SAndroid Build Coastguard Worker 940*de1e4e89SAndroid Build Coastguard Worker ### If there are no changes, go for next class 941*de1e4e89SAndroid Build Coastguard Worker [ $CHANGE -eq 0 ] && continue 942*de1e4e89SAndroid Build Coastguard Worker 943*de1e4e89SAndroid Build Coastguard Worker ### Replace CBQ class 944*de1e4e89SAndroid Build Coastguard Worker tc class replace dev $DEVICE classid 1:$CLASS cbq \ 945*de1e4e89SAndroid Build Coastguard Worker bandwidth $BANDWIDTH rate $NEW_RATE weight $NEW_WGHT prio $PRIO \ 946*de1e4e89SAndroid Build Coastguard Worker allot 1514 cell 8 maxburst 20 avpkt $AVPKT $BOUNDED $ISOLATED 947*de1e4e89SAndroid Build Coastguard Worker 948*de1e4e89SAndroid Build Coastguard Worker ### Replace leaf qdisc (if any) 949*de1e4e89SAndroid Build Coastguard Worker if [ "$LEAF" = "tbf" ]; then 950*de1e4e89SAndroid Build Coastguard Worker tc qdisc replace dev $DEVICE handle $CLASS tbf \ 951*de1e4e89SAndroid Build Coastguard Worker rate $NEW_RATE buffer $BUFFER limit $LIMIT mtu $MTU $NEW_PEAK 952*de1e4e89SAndroid Build Coastguard Worker fi 953*de1e4e89SAndroid Build Coastguard Worker 954*de1e4e89SAndroid Build Coastguard Worker cbq_message "$TIME_NOW: class $CLASS on $DEVICE changed rate ($RATE_NOW -> $NEW_RATE)" 955*de1e4e89SAndroid Build Coastguard Workerdone ### class file 956*de1e4e89SAndroid Build Coastguard Worker;; 957*de1e4e89SAndroid Build Coastguard Worker 958*de1e4e89SAndroid Build Coastguard Worker 959*de1e4e89SAndroid Build Coastguard Worker############################################################################# 960*de1e4e89SAndroid Build Coastguard Worker################################## THE REST ################################# 961*de1e4e89SAndroid Build Coastguard Worker############################################################################# 962*de1e4e89SAndroid Build Coastguard Worker 963*de1e4e89SAndroid Build Coastguard Workerstop) 964*de1e4e89SAndroid Build Coastguard Worker cbq_off 965*de1e4e89SAndroid Build Coastguard Worker ;; 966*de1e4e89SAndroid Build Coastguard Worker 967*de1e4e89SAndroid Build Coastguard Workerlist) 968*de1e4e89SAndroid Build Coastguard Worker cbq_show 969*de1e4e89SAndroid Build Coastguard Worker ;; 970*de1e4e89SAndroid Build Coastguard Worker 971*de1e4e89SAndroid Build Coastguard Workerstats) 972*de1e4e89SAndroid Build Coastguard Worker cbq_show -s 973*de1e4e89SAndroid Build Coastguard Worker ;; 974*de1e4e89SAndroid Build Coastguard Worker 975*de1e4e89SAndroid Build Coastguard Workerrestart) 976*de1e4e89SAndroid Build Coastguard Worker shift 977*de1e4e89SAndroid Build Coastguard Worker $0 stop 978*de1e4e89SAndroid Build Coastguard Worker $0 start "$@" 979*de1e4e89SAndroid Build Coastguard Worker ;; 980*de1e4e89SAndroid Build Coastguard Worker 981*de1e4e89SAndroid Build Coastguard Worker*) 982*de1e4e89SAndroid Build Coastguard Worker echo "Usage: `basename $0` {start|compile|stop|restart|timecheck|list|stats}" 983*de1e4e89SAndroid Build Coastguard Workeresac 984