xref: /aosp_15_r20/external/iproute2/examples/cbq.init-v0.7.3 (revision de1e4e894b0c224df933550f0afdecc354b238c4)
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