* Finally, CBQ nearly completely documented
@ 2001-12-01 0:33 bert hubert
2001-12-03 2:00 ` CBQ and all other qdiscs now REALLY completely documented (almost!) bert hubert
0 siblings, 1 reply; 21+ messages in thread
From: bert hubert @ 2001-12-01 0:33 UTC (permalink / raw)
To: lartc; +Cc: linux-kernel, kuznet, hadi
Hi,
After preparing my talk on CBQ/HTB (http://ds9a.nl/cbq-presentation ), I
finally understood how CBQ and filters etc truly work. And I wrote it down.
Check out the Linux Advanced Routing & Shaping HOWTO, it's changed a lot!
Especially this part is very new, please check it for mistakes and
inconsistencies:
http://ds9a.nl/2.4Routing/HOWTO//cvs/2.4routing/output/2.4routing-9.html
I even got 'split' and 'defmap' figured out, which should be a first. There
is not a single other page online that tells you correctly what these do.
One thing - does *anybody* understand how hash tables work in tc filter, and
what they do? Furthermore, I could use some help with the tc filter police
things.
So if you do understand how these work, please drop me a line.
Thanks!
--
http://www.PowerDNS.com Versatile DNS Software & Services
Trilab The Technology People
Netherlabs BV / Rent-a-Nerd.nl - Nerd Available -
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet
^ permalink raw reply [flat|nested] 21+ messages in thread
* CBQ and all other qdiscs now REALLY completely documented (almost!)
2001-12-01 0:33 Finally, CBQ nearly completely documented bert hubert
@ 2001-12-03 2:00 ` bert hubert
2001-12-03 2:26 ` [LARTC] " Jim Fleming
2001-12-08 19:20 ` jamal
0 siblings, 2 replies; 21+ messages in thread
From: bert hubert @ 2001-12-03 2:00 UTC (permalink / raw)
To: lartc, linux-kernel, kuznet, hadi, netdev
On Sat, Dec 01, 2001 at 01:33:41AM +0100, bert hubert wrote:
> One thing - does *anybody* understand how hash tables work in tc filter, and
> what they do? Furthermore, I could use some help with the tc filter police
> things.
Thanks to Andreas Steinmetz and David Sauer, tc hash tables are now
documented as well, thanks!
See:
http://ds9a.nl/2.4Routing/HOWTO//cvs/2.4routing/output/2.4routing-12.html
And then 'Hashing filters for very fast massive filtering'.
I also finished documenting all parameters for TBF, CBQ, SFQ, PRIO,
bfifo, pfifo and pfifo_fast. All queues in the Linux kernel are now
described in the Linux Advanced Routing & Shaping HOWTO, which can be found on
http://ds9a.nl/2.4Routing
I want to send this off to the LDP and Freshmeat somewhere next week, I
*would really* like people who are knowledgeable about this subject (this
means you, ANK & Jamal 8) ) to read through this.
This HOWTO is rapidly becoming the perceived authoritative source for
traffic control in linux (google on 'Linux Routing' finds it), it might as
well be right! So if you have any time at all, check the parts you know
about. I expect mistakes.
The parts of the table of contents that document stuff in the kernel not
documented elsewhere:
9. Queueing Disciplines for Bandwidth Management
9.1 Queues and Queueing Disciplines explained
9.2 Simple, classless Queueing Disciplines
9.2.1 pfifo_fast
9.2.1.1 Parameters & usage
9.2.2 Token Bucket Filter
9.2.2.1 Parameters & usage
9.2.2.2 Sample configuration
9.2.3 Stochastic Fairness Queueing
9.2.3.1 Parameters & usage
9.2.3.2 Sample configuration
9.3 Advice for when to use which queue
9.4 Classful Queueing Disciplines
9.4.1 Flow within classful qdiscs & classes
9.4.2 The qdisc family: roots, handles, siblings and parents
9.4.2.1 How filters are used to classify traffic
9.4.2.2 How packets are dequeued to the hardware
9.4.3 The PRIO qdisc
9.4.3.1 PRIO parameters & usage
9.4.3.2 Sample configuration
9.4.4 The famous CBQ qdisc
9.4.4.1 CBQ shaping in detail
9.4.4.2 CBQ classful behaviour
9.4.4.3 CBQ parameters that determine link sharing & borrowing
9.4.4.4 Sample configuration
9.4.4.5 Other CBQ parameters: split & defmap
9.4.5 Hierarchical Token Bucket
9.4.5.1 Sample configuration
9.5 Classifying packets with filters
9.5.1 Some simple filtering examples
9.5.2 All the filtering commands you will normally need
(...)
12. Advanced filters for (re-)classifying packets
12.1 The "u32" classifier
12.1.1 U32 selector
12.1.2 General selectors
12.1.3 Specific selectors
12.2 The "route" classifier
12.3 Policing filters
12.4 Hashing filters for very fast massive filtering
(...)
14. Advanced & less common queueing disciplines
14.1 bfifo/pfifo
14.1.1 Parameters & usage
14.2 Clark-Shenker-Zhang algorithm (CSZ)
14.3 DSMARK
14.3.1 Introduction
14.3.2 What is Dsmark related to?
14.3.3 Differentiated Services guidelines
14.3.4 Working with Dsmark
14.3.5 How SCH_DSMARK works.
14.3.6 TC_INDEX Filter
14.4 Ingress policer qdisc
14.5 Random Early Drop (RED)
14.6 VC/ATM emulation
14.7 Weighted Round Robin (WRR)
The only thing left to document are Policing filters.
Regards,
bert hubert
--
http://www.PowerDNS.com Versatile DNS Software & Services
Trilab The Technology People
Netherlabs BV / Rent-a-Nerd.nl - Nerd Available -
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [LARTC] CBQ and all other qdiscs now REALLY completely documented (almost!)
2001-12-03 2:00 ` CBQ and all other qdiscs now REALLY completely documented (almost!) bert hubert
@ 2001-12-03 2:26 ` Jim Fleming
2001-12-08 19:20 ` jamal
1 sibling, 0 replies; 21+ messages in thread
From: Jim Fleming @ 2001-12-03 2:26 UTC (permalink / raw)
To: bert hubert, lartc, linux-kernel, kuznet, hadi, netdev
----- Original Message -----
From: "bert hubert" <ahu@ds9a.nl>
>
> The only thing left to document are Policing filters.
>
This may help...
http://www.dot-biz.com/IPv4/Tutorial/
Jim Fleming
http://www.IPv8.info
IPv16....One Better !!
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented (almost!)
2001-12-03 2:00 ` CBQ and all other qdiscs now REALLY completely documented (almost!) bert hubert
2001-12-03 2:26 ` [LARTC] " Jim Fleming
@ 2001-12-08 19:20 ` jamal
2001-12-08 19:55 ` further CBQ/tc documentation ds9a.nl/lartc/manpages bert hubert
2001-12-08 23:23 ` CBQ and all other qdiscs now REALLY completely documented (almost!) bert hubert
1 sibling, 2 replies; 21+ messages in thread
From: jamal @ 2001-12-08 19:20 UTC (permalink / raw)
To: bert hubert; +Cc: lartc, linux-kernel, kuznet, netdev
On Mon, 3 Dec 2001, bert hubert wrote:
> On Sat, Dec 01, 2001 at 01:33:41AM +0100, bert hubert wrote:
>
> > One thing - does *anybody* understand how hash tables work in tc filter, and
> > what they do? Furthermore, I could use some help with the tc filter police
> > things.
>
> Thanks to Andreas Steinmetz and David Sauer, tc hash tables are now
> documented as well, thanks!
>
> See:
>
> http://ds9a.nl/2.4Routing/HOWTO//cvs/2.4routing/output/2.4routing-12.html
>
> And then 'Hashing filters for very fast massive filtering'.
>
> I also finished documenting all parameters for TBF, CBQ, SFQ, PRIO,
> bfifo, pfifo and pfifo_fast. All queues in the Linux kernel are now
> described in the Linux Advanced Routing & Shaping HOWTO, which can be found on
>
> http://ds9a.nl/2.4Routing
>
> I want to send this off to the LDP and Freshmeat somewhere next week, I
> *would really* like people who are knowledgeable about this subject (this
> means you, ANK & Jamal 8) ) to read through this.
>
> This HOWTO is rapidly becoming the perceived authoritative source for
> traffic control in linux (google on 'Linux Routing' finds it), it might as
> well be right! So if you have any time at all, check the parts you know
> about. I expect mistakes.
>
> The parts of the table of contents that document stuff in the kernel not
> documented elsewhere:
"not documented elsewhere" comes out rude. Werner and I (and even
Alexey when he was in the mood -- and i have seen some good documentation
by other people as well) have spent numerous hours documenting, presenting
and answering questions on mailing lists at times
Sample docs that i was personally involved in:
ftp://icaftp.epfl.ch/pub/linux/diffserv/misc/dsid-01.txt.gz
You need to introduce the big picture to the user.
and what is wrong with the definitions used in
http://www.davin.ottawa.on.ca/ols/img10.htm that forced you to introduce
your own?
Actually, the big picture is:
http://www.davin.ottawa.on.ca/ols/img9.htm
Also
http://www.linuxjournal.com/article.php?sid=3369
(was written in 98 but got published in 99)
Now despite all the bitching above, i think your efforts are noble.
[My complaints about your style is you often are trying to present facts
by using opinions. For example despite a lot of effort in the past to
explain ingress qdisc to you in the past and, pointing you to very good
documentation from CISCO you still ended using your opinions on what you
thought it should be;->
My scanning of the document shows opinions still posing as miscontrued
facts. It is improving compared to what i saw last when we discussed ingress.
Let me clarify one thing in this email; i'll read what you have later.
Lets start by your description of TC_PRIO and TOS mappings etc:
Your descriptions of these values is insufficient. Consider this a
tutorial and reword it as you wish but please avoid opinions.
Ok here's clarification, this applies to both prio, default fifo 3 band
queueing and CBQ defaultmap classification; applies to both packets being
forwarded as well as locally generated:
First Step:
===========
Define TOS: This is a 4 bit value used as defined in RFC 1349.
0 1 2 3 4 5 6 7
+-----+-----+-----+-----+-----+-----+-----+-----+
| | | |
| PRECEDENCE | TOS | MBZ |
| | | |
+-----+-----+-----+-----+-----+-----+-----+-----+
Then define the values possible as:
1000 -- minimize delay
0100 -- maximize throughput
0010 -- maximize reliability
0001 -- minimize monetary cost
0000 -- normal service
Look at RFC 1349 for typical values used by different applications
Then of course note that RFC 1349 is obsoleted by RFC 2474 (yes, you can
weep);
Having said all that:
Linux remaps packets incoming with different values to some internal
value; the colum "mapped to" shows the internal mapping
8value(hex) TOS(dec) mapped to(dec)
----------------------------------
0x0 0 0
1 7
2 0
3 0
4 2
5 2
6 2
7 2
0x10 8 6
9 6
10 6
11 6
12 2
13 2
14 2
15 2
Fill in the "8value(hex)" column gaps using the bitmap from RFC1349 for
the 8 bits; These are the values ou would see with tcpdump -vvv
I filled the two easiest ones i could compute in my head.
Second step:
Take the default priority map:
1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1
This applies for both default prio and the 3-band FIFO queue.
Note the queue map fitted on the last column
8 but value TOS mapped to queue map
---------------------------------------------
0x0 0 0 1
1 7 2
2 0 2
3 0 2
4 2 1
5 2 2
6 2 0
7 2 0
0x10 8 6 1
9 6 1
10 6 1
11 6 1
12 2 1
13 2 1
14 2 1
15 2 1
Queue 0 gets processed first then queue 1 then queue 2. In the strict
priority processing such as in prio or default 3 band sched, queue 0 is
processed until no more packets are left, then queue1 etc. This could
result in starvation. You could avoid starvation by inserting a TBF
in a prio; limit the size of the fifo in a class or use CBQ configured
as WRR.
I hope the above explains why you have to recreate the priomap everytime
you change the number of bands. You used the word "probably" which is
wrong. The proper word is "MUST".
What i think would be useful for you to do is describe some of the vlaues
used by some applications (RFC 1349 cut-n-paste job would help).
cheers,
jamal
^ permalink raw reply [flat|nested] 21+ messages in thread
* further CBQ/tc documentation ds9a.nl/lartc/manpages
2001-12-08 19:20 ` jamal
@ 2001-12-08 19:55 ` bert hubert
2001-12-08 20:43 ` jamal
2001-12-08 23:23 ` CBQ and all other qdiscs now REALLY completely documented (almost!) bert hubert
1 sibling, 1 reply; 21+ messages in thread
From: bert hubert @ 2001-12-08 19:55 UTC (permalink / raw)
To: jamal; +Cc: lartc, linux-kernel, kuznet, netdev
On Sat, Dec 08, 2001 at 02:20:20PM -0500, jamal wrote:
> > The parts of the table of contents that document stuff in the kernel not
> > documented elsewhere:
>
> "not documented elsewhere" comes out rude. Werner and I (and even
> Alexey when he was in the mood -- and i have seen some good documentation
> by other people as well) have spent numerous hours documenting, presenting
> and answering questions on mailing lists at times
True. I should have worded that better but I lost sight of politeness due to
my great enthusiasm at finally understanding everything. Some parts required
literally *hours* of digging through sources and disembodied slides -
presentations lose something without a speaker.
> Sample docs that i was personally involved in:
> ftp://icaftp.epfl.ch/pub/linux/diffserv/misc/dsid-01.txt.gz
These days I understand this document, but I didn't used to. That might be
because I'm thick, though.
> You need to introduce the big picture to the user.
> and what is wrong with the definitions used in
> http://www.davin.ottawa.on.ca/ols/img10.htm that forced you to introduce
> your own?
I've since moved to this terminology. Please also see the manpages I'm
writing at
http://ds9a.nl/lartc/manpages
> Actually, the big picture is:
> http://www.davin.ottawa.on.ca/ols/img9.htm
> Also
> http://www.linuxjournal.com/article.php?sid=3369
> (was written in 98 but got published in 99)
Google is surely to be praised - I had found all these links already. But to
summarize: stuff is out there.
> [My complaints about your style is you often are trying to present facts
> by using opinions. For example despite a lot of effort in the past to
> explain ingress qdisc to you in the past and, pointing you to very good
> documentation from CISCO you still ended using your opinions on what you
> thought it should be;->
I really didn't understand how everything worked back then, sadly. I do now,
hopefully.
> My scanning of the document shows opinions still posing as miscontrued
> facts. It is improving compared to what i saw last when we discussed ingress.
> Let me clarify one thing in this email; i'll read what you have later.
Some stuff remains from that time, am working on removing it. My current
efforts is writing the manpages and getting them 100% right and devoid of
opinion.
Once they are finished & reviewed, I'm 'backporting' the insight to the
HOWTO, which will then lose a lot of content and instead refer to the
manpages.
> Lets start by your description of TC_PRIO and TOS mappings etc:
> Your descriptions of these values is insufficient. Consider this a
> tutorial and reword it as you wish but please avoid opinions.
Will do, it makes sense now.
> Look at RFC 1349 for typical values used by different applications
> Then of course note that RFC 1349 is obsoleted by RFC 2474 (yes, you can
> weep);
That confused me greatly, yes.
> What i think would be useful for you to do is describe some of the vlaues
> used by some applications (RFC 1349 cut-n-paste job would help).
Thanks. I'm working on making the HOWTO more factual and the manpages 100%
factual. I'm always happy with critiques.
Regards,
bert
--
http://www.PowerDNS.com Versatile DNS Software & Services
Trilab The Technology People
Netherlabs BV / Rent-a-Nerd.nl - Nerd Available -
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: further CBQ/tc documentation ds9a.nl/lartc/manpages
2001-12-08 19:55 ` further CBQ/tc documentation ds9a.nl/lartc/manpages bert hubert
@ 2001-12-08 20:43 ` jamal
0 siblings, 0 replies; 21+ messages in thread
From: jamal @ 2001-12-08 20:43 UTC (permalink / raw)
To: bert hubert; +Cc: lartc, linux-kernel, kuznet, netdev
For starters, i think you need a defintions sections. Look at:
http://www.ietf.org/internet-drafts/draft-ietf-diffserv-model-06.txt
(eg what is a shaper etc and how trhings are placed together). At least
that will ensure that you dont sday things like "Prio cant shape".
It is a good model but may be insufficient given Linux TCs
capabilities. Email me when unsure.
Some other things:
- In your comment "Do not confuse this classless simple qdisc with the
classful PRIO one!". This is misleading:
the default 3 band FIFO queue is conceptually the same as the
default prio qdisc (the priomaps are identical). 3 bands; same
prioritization schemes.
- You really need to fix ingress section:
it works for both forwarding and packets coming in to local sockets.
More importantly, It takes advantages of _all_ filter schemes
available for TC as well as the policing functionality (which sadly seemed
to have been replicated by someone in netfilter, wrongly if i may add ;->).
- You keep saying "reodering" -- dont know what that means. Reordering is
generally considered a Bad Thing(tm).
- your description of the "peakrate" (same in TBF as well as policing)
Well captured. It took ages to get this into peoples heads. This also
applies to CBQ.
- your description of "MTU"
Not very good description:
This is just what it literally says; maximum transmit unit;
A packet larger than this will be dropped. Default is 2K. For ethernet,
MTUs of 1500 bytes, this is fine; however, you should put a cautionary
statement here in regards to people having MTUs smaller than 2K (example
the lo device); they might find that all their packets greater than 2K
being dropped.
More later if dont get distracted.
cheers,
jamal
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented (almost!)
2001-12-08 19:20 ` jamal
2001-12-08 19:55 ` further CBQ/tc documentation ds9a.nl/lartc/manpages bert hubert
@ 2001-12-08 23:23 ` bert hubert
2001-12-09 1:14 ` jamal
1 sibling, 1 reply; 21+ messages in thread
From: bert hubert @ 2001-12-08 23:23 UTC (permalink / raw)
To: jamal; +Cc: lartc, linux-kernel, kuznet, netdev
On Sat, Dec 08, 2001 at 02:20:20PM -0500, jamal wrote:
> Linux remaps packets incoming with different values to some internal
> value; the colum "mapped to" shows the internal mapping
>
> 8value(hex) TOS(dec) mapped to(dec)
> ----------------------------------
> 0x0 0 0
> 1 7
> 2 0
> 3 0
> 4 2
> 5 2
> 6 2
> 7 2
> 0x10 8 6
> 9 6
> 10 6
> 11 6
> 12 2
> 13 2
> 14 2
> 15 2
I find this tos2prio table in the kernel (2.5.x), which is somewhat
different than your table:
0 TC_PRIO_BESTEFFORT, 0
1 TC_PRIO_(FILLER), 1
2 TC_PRIO_BESTEFFORT, 0
3 TC_PRIO_(BESTEFFORT), 0
4 TC_PRIO_BULK, 2
5 TC_PRIO_(BULK), 2
6 TC_PRIO_BULK, 2
7 TC_PRIO_(BULK), 2
8 TC_PRIO_INTERACTIVE, 6
9 TC_PRIO_(INTERACTIVE), 6
10 TC_PRIO_INTERACTIVE, 6
11 TC_PRIO_(INTERACTIVE), 6
12 TC_PRIO_INTERACTIVE_BULK, 4
13 TC_PRIO_(INTERACTIVE_BULK), 4
14 TC_PRIO_INTERACTIVE_BULK, 4
15 TC_PRIO_(INTERACTIVE_BULK) 4
> Fill in the "8value(hex)" column gaps using the bitmap from RFC1349 for
> the 8 bits; These are the values ou would see with tcpdump -vvv
> I filled the two easiest ones i could compute in my head.
>
> Second step:
>
> Take the default priority map:
> 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1
> This applies for both default prio and the 3-band FIFO queue.
> Note the queue map fitted on the last column
>
> 8 but value TOS mapped to queue map
> ---------------------------------------------
> 0x0 0 0 1
> 1 7 2
> 2 0 2
> 3 0 2
> 4 2 1
> 5 2 2
> 6 2 0
> 7 2 0
> 0x10 8 6 1
> 9 6 1
> 10 6 1
> 11 6 1
> 12 2 1
> 13 2 1
> 14 2 1
> 15 2 1
I've changed this table to:
TOS Bits Means Linux Priority Band
------------------------------------------------------------
0x0 0 Normal Service 0 Best Effort 1
0x2 1 Minimize Monetary Cost 1 Filler 2
0x4 2 Maximize Reliability 0 Best Effort 1
0x6 3 mmc+mr 0 Best Effort 1
0x8 4 Maximize Throughput 2 Bulk 2
0xa 5 mmc+mt 2 Bulk 2
0xc 6 mr+mt 2 Bulk 2
0xe 7 mmc+mr+mt 2 Bulk 2
0x10 8 Minimize Delay 6 Interactive 0
0x12 9 mmc+md 6 Interactive 0
0x14 10 mr+md 6 Interactive 0
0x16 11 mmc+mr+md 6 Interactive 0
0x18 12 mt+md 4 Int. Bulk 1
0x1a 13 mmc+mt+md 4 Int. Bulk 1
0x1c 14 mr+mt+md 4 Int. Bulk 1
0x1e 15 mmc+mr+mt+md 4 Int. Bulk 1
http://ds9a.nl/lartc/HOWTO/cvs/2.4routing/output/2.4routing-9.html#ss9.2
Your table appears to imply that a Maximum Reliability, Mininum Delay
packet, TOS bits=9, gets mapped to band 1, not 0, which would not make
sense.
Laying it out like this, which does appear how it works, does mean that you
can specify priorities in the priomap which do not correspond to possible
TOS values.
Is it possible at all to set skb->priority from userspace without going
through the tos2prio mapping?
CBQ can use the skb->priority to classify:
/*
* Step 1. If skb->priority points to one of our classes, use it.
*/
if (TC_H_MAJ(prio^sch->handle) == 0 &&
(cl = cbq_class_lookup(q, prio)) != NULL)
return cl;
But to do this, you would need to be able to set skb->priority to a 32bit
number:
include/linux/pkt_sched.h:#define TC_H_MAJ_MASK (0xFFFF0000U)
include/linux/pkt_sched.h:#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK)
I can't find where you would do this, any clues?
Thanks again for taking the time to help me.
Regards,
bert
--
http://www.PowerDNS.com Versatile DNS Software & Services
Trilab The Technology People
Netherlabs BV / Rent-a-Nerd.nl - Nerd Available -
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented (almost!)
2001-12-08 23:23 ` CBQ and all other qdiscs now REALLY completely documented (almost!) bert hubert
@ 2001-12-09 1:14 ` jamal
2001-12-09 1:30 ` bert hubert
2001-12-09 18:14 ` CBQ and all other qdiscs now REALLY completely documented kuznet
0 siblings, 2 replies; 21+ messages in thread
From: jamal @ 2001-12-09 1:14 UTC (permalink / raw)
To: bert hubert; +Cc: lartc, linux-kernel, kuznet, netdev
On Sun, 9 Dec 2001, bert hubert wrote:
> On Sat, Dec 08, 2001 at 02:20:20PM -0500, jamal wrote:
>
> > Linux remaps packets incoming with different values to some internal
> > value; the colum "mapped to" shows the internal mapping
> >
> > 8value(hex) TOS(dec) mapped to(dec)
> > ----------------------------------
> > 0x0 0 0
> > 1 7
> > 2 0
> > 3 0
> > 4 2
> > 5 2
> > 6 2
> > 7 2
> > 0x10 8 6
> > 9 6
> > 10 6
> > 11 6
> > 12 2
> > 13 2
> > 14 2
> > 15 2
>
> I find this tos2prio table in the kernel (2.5.x), which is somewhat
> different than your table:
>
> 0 TC_PRIO_BESTEFFORT, 0
> 1 TC_PRIO_(FILLER), 1
> 2 TC_PRIO_BESTEFFORT, 0
> 3 TC_PRIO_(BESTEFFORT), 0
> 4 TC_PRIO_BULK, 2
> 5 TC_PRIO_(BULK), 2
> 6 TC_PRIO_BULK, 2
> 7 TC_PRIO_(BULK), 2
> 8 TC_PRIO_INTERACTIVE, 6
> 9 TC_PRIO_(INTERACTIVE), 6
> 10 TC_PRIO_INTERACTIVE, 6
> 11 TC_PRIO_(INTERACTIVE), 6
> 12 TC_PRIO_INTERACTIVE_BULK, 4
> 13 TC_PRIO_(INTERACTIVE_BULK), 4
> 14 TC_PRIO_INTERACTIVE_BULK, 4
> 15 TC_PRIO_(INTERACTIVE_BULK) 4
>
>
> > Fill in the "8value(hex)" column gaps using the bitmap from RFC1349 for
> > the 8 bits; These are the values ou would see with tcpdump -vvv
> > I filled the two easiest ones i could compute in my head.
> >
> > Second step:
> >
> > Take the default priority map:
> > 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1
> > This applies for both default prio and the 3-band FIFO queue.
> > Note the queue map fitted on the last column
> >
> > 8 but value TOS mapped to queue map
> > ---------------------------------------------
> > 0x0 0 0 1
> > 1 7 2
> > 2 0 2
> > 3 0 2
> > 4 2 1
> > 5 2 2
> > 6 2 0
> > 7 2 0
> > 0x10 8 6 1
> > 9 6 1
> > 10 6 1
> > 11 6 1
> > 12 2 1
> > 13 2 1
> > 14 2 1
> > 15 2 1
>
> I've changed this table to:
> TOS Bits Means Linux Priority Band
> ------------------------------------------------------------
> 0x0 0 Normal Service 0 Best Effort 1
> 0x2 1 Minimize Monetary Cost 1 Filler 2
> 0x4 2 Maximize Reliability 0 Best Effort 1
> 0x6 3 mmc+mr 0 Best Effort 1
> 0x8 4 Maximize Throughput 2 Bulk 2
> 0xa 5 mmc+mt 2 Bulk 2
> 0xc 6 mr+mt 2 Bulk 2
> 0xe 7 mmc+mr+mt 2 Bulk 2
> 0x10 8 Minimize Delay 6 Interactive 0
> 0x12 9 mmc+md 6 Interactive 0
> 0x14 10 mr+md 6 Interactive 0
> 0x16 11 mmc+mr+md 6 Interactive 0
> 0x18 12 mt+md 4 Int. Bulk 1
> 0x1a 13 mmc+mt+md 4 Int. Bulk 1
> 0x1c 14 mr+mt+md 4 Int. Bulk 1
> 0x1e 15 mmc+mr+mt+md 4 Int. Bulk 1
>
Yes, sorry the last 4 are int_bulk (value 4) and not just bulk (2). good
eye. You are still abusing the word TOS. Thats only 4 bits not 8;
Use the terminology from RFC1349 at least.
> http://ds9a.nl/lartc/HOWTO/cvs/2.4routing/output/2.4routing-9.html#ss9.2
>
> Your table appears to imply that a Maximum Reliability, Mininum Delay
> packet, TOS bits=9, gets mapped to band 1, not 0, which would not make
> sense.
>
This is the priomap: 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1
It says 1 is the right value
> Laying it out like this, which does appear how it works, does mean that you
> can specify priorities in the priomap which do not correspond to possible
> TOS values.
>
You cant remap the 3 band scheduler trivially, but you should be able to
replace it with a default prio qdisc get exactly the same behavior and use
whatever map you want (eg your 0 to 1 substitution for TOS 1001)
> Is it possible at all to set skb->priority from userspace without going
> through the tos2prio mapping?
>
SO_PRIORITY socket option is doable; you have to be root.
> CBQ can use the skb->priority to classify:
so do prio and pfifo_fast (as i am sure you are aware)
> /*
> * Step 1. If skb->priority points to one of our classes, use it.
> */
> if (TC_H_MAJ(prio^sch->handle) == 0 &&
> (cl = cbq_class_lookup(q, prio)) != NULL)
> return cl;
>
> But to do this, you would need to be able to set skb->priority to a 32bit
> number:
>
Cant think of a straight way to do this .... Alexey would know,
cheers,
jamal
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented (almost!)
2001-12-09 1:14 ` jamal
@ 2001-12-09 1:30 ` bert hubert
2001-12-09 2:10 ` jamal
2001-12-09 18:14 ` CBQ and all other qdiscs now REALLY completely documented kuznet
1 sibling, 1 reply; 21+ messages in thread
From: bert hubert @ 2001-12-09 1:30 UTC (permalink / raw)
To: lartc, linux-kernel, netdev
On Sat, Dec 08, 2001 at 08:14:10PM -0500, jamal wrote:
> Yes, sorry the last 4 are int_bulk (value 4) and not just bulk (2). good
> eye. You are still abusing the word TOS. Thats only 4 bits not 8;
> Use the terminology from RFC1349 at least.
Will do.
> > http://ds9a.nl/lartc/HOWTO/cvs/2.4routing/output/2.4routing-9.html#ss9.2
> >
> > Your table appears to imply that a Maximum Reliability, Mininum Delay
> > packet, TOS bits=9, gets mapped to band 1, not 0, which would not make
> > sense.
>
> This is the priomap: 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1
> It says 1 is the right value
AFAICT, the priomap maps skb->priority to band. So the translation is as
follows:
Type of Service octet, which is fed to:
skb->priority = rt_tos2priority(iph->tos);
To extract the four TOS bits, and to translate to prio:
static inline char rt_tos2priority(u8 tos)
{
return ip_tos2prio[IPTOS_TOS(tos)>>1];
}
----
__u8 ip_tos2prio[16] = {
TC_PRIO_BESTEFFORT,
ECN_OR_COST(FILLER),
TC_PRIO_BESTEFFORT,
ECN_OR_COST(BESTEFFORT),
TC_PRIO_BULK,
ECN_OR_COST(BULK),
TC_PRIO_BULK,
ECN_OR_COST(BULK),
TC_PRIO_INTERACTIVE,
ECN_OR_COST(INTERACTIVE),
TC_PRIO_INTERACTIVE,
ECN_OR_COST(INTERACTIVE),
TC_PRIO_INTERACTIVE_BULK,
ECN_OR_COST(INTERACTIVE_BULK),
TC_PRIO_INTERACTIVE_BULK,
ECN_OR_COST(INTERACTIVE_BULK)
};
---
#define TC_PRIO_BESTEFFORT 0
#define TC_PRIO_FILLER 1
#define TC_PRIO_BULK 2
#define TC_PRIO_INTERACTIVE_BULK 4
#define TC_PRIO_INTERACTIVE 6
#define TC_PRIO_CONTROL 7
#define TC_PRIO_MAX 15
net/sched/sched_generic.c:
static const u8 prio2band[TC_PRIO_MAX+1] =
{ 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1 };
list = ((struct sk_buff_head*)qdisc->data) +
prio2band[skb->priority&TC_PRIO_MAX];
> > CBQ can use the skb->priority to classify:
>
> so do prio and pfifo_fast (as i am sure you are aware)
Of course, but only CBQ (& HTB, by the way) can extract a classid directly
from it, without a priomap. Devik is planning to learn HTB to extract a
classid directly from the fwmark, to skip a layer of indirection.
Regards,
bert hubert
--
http://www.PowerDNS.com Versatile DNS Software & Services
Trilab The Technology People
Netherlabs BV / Rent-a-Nerd.nl - Nerd Available -
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented (almost!)
2001-12-09 1:30 ` bert hubert
@ 2001-12-09 2:10 ` jamal
0 siblings, 0 replies; 21+ messages in thread
From: jamal @ 2001-12-09 2:10 UTC (permalink / raw)
To: bert hubert; +Cc: lartc, linux-kernel, netdev
On Sun, 9 Dec 2001, bert hubert wrote:
> On Sat, Dec 08, 2001 at 08:14:10PM -0500, jamal wrote:
>
> AFAICT, the priomap maps skb->priority to band. So the translation is as
> follows:
>
yes ;->
> >
> > so do prio and pfifo_fast (as i am sure you are aware)
>
> Of course, but only CBQ (& HTB, by the way) can extract a classid directly
> from it, without a priomap. Devik is planning to learn HTB to extract a
> classid directly from the fwmark, to skip a layer of indirection.
>
I am not sure if this is such a nice hack. Whats wrong with with using the
fwmark classifier to select classes?
cheers,
jamal
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented
2001-12-09 1:14 ` jamal
2001-12-09 1:30 ` bert hubert
@ 2001-12-09 18:14 ` kuznet
2001-12-09 18:18 ` bert hubert
` (2 more replies)
1 sibling, 3 replies; 21+ messages in thread
From: kuznet @ 2001-12-09 18:14 UTC (permalink / raw)
To: jamal; +Cc: ahu, lartc, linux-kernel, netdev
Hello!
> > But to do this, you would need to be able to set skb->priority to a 32bit
> > number:
> >
>
> Cant think of a straight way to do this .... Alexey would know,
SO_PRIORITY. Or I did not follow you?
Alexey
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented
2001-12-09 18:14 ` CBQ and all other qdiscs now REALLY completely documented kuznet
@ 2001-12-09 18:18 ` bert hubert
2001-12-09 21:45 ` jamal
2001-12-10 0:41 ` CBQ MANPAGE: I hear the theme of '2001, A Space Odyssey' bert hubert
2 siblings, 0 replies; 21+ messages in thread
From: bert hubert @ 2001-12-09 18:18 UTC (permalink / raw)
To: kuznet; +Cc: jamal, lartc, linux-kernel, netdev
On Sun, Dec 09, 2001 at 09:14:46PM +0300, kuznet@ms2.inr.ac.ru wrote:
> > > But to do this, you would need to be able to set skb->priority to a 32bit
> > > number:
> > Cant think of a straight way to do this .... Alexey would know,
>
> SO_PRIORITY. Or I did not follow you?
Ah yes, thanks, that sets sk->priority which later sets skb->priority.
Regards,
bert
--
http://www.PowerDNS.com Versatile DNS Software & Services
Trilab The Technology People
Netherlabs BV / Rent-a-Nerd.nl - Nerd Available -
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented
2001-12-09 18:14 ` CBQ and all other qdiscs now REALLY completely documented kuznet
2001-12-09 18:18 ` bert hubert
@ 2001-12-09 21:45 ` jamal
2001-12-09 21:53 ` bert hubert
2001-12-10 17:04 ` kuznet
2001-12-10 0:41 ` CBQ MANPAGE: I hear the theme of '2001, A Space Odyssey' bert hubert
2 siblings, 2 replies; 21+ messages in thread
From: jamal @ 2001-12-09 21:45 UTC (permalink / raw)
To: kuznet; +Cc: ahu, lartc, linux-kernel, netdev
On Sun, 9 Dec 2001 kuznet@ms2.inr.ac.ru wrote:
> Hello!
>
> > > But to do this, you would need to be able to set skb->priority to a 32bit
> > > number:
> > >
> >
> > Cant think of a straight way to do this .... Alexey would know,
>
> SO_PRIORITY. Or I did not follow you?
>
So priority limits the size of skb->priority to be from 0..6; this wont
work with that check in cbq.
cheers,
jamal
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented
2001-12-09 21:45 ` jamal
@ 2001-12-09 21:53 ` bert hubert
2001-12-09 22:07 ` jamal
2001-12-10 17:04 ` kuznet
1 sibling, 1 reply; 21+ messages in thread
From: bert hubert @ 2001-12-09 21:53 UTC (permalink / raw)
To: jamal; +Cc: kuznet, linux-kernel, netdev
On Sun, Dec 09, 2001 at 04:45:01PM -0500, jamal wrote:
> > > Cant think of a straight way to do this .... Alexey would know,
> >
> > SO_PRIORITY. Or I did not follow you?
>
> So priority limits the size of skb->priority to be from 0..6; this wont
> work with that check in cbq.
No, only IP_TOS does so.
Regards,
bert
--
http://www.PowerDNS.com Versatile DNS Software & Services
Trilab The Technology People
Netherlabs BV / Rent-a-Nerd.nl - Nerd Available -
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented
2001-12-09 21:53 ` bert hubert
@ 2001-12-09 22:07 ` jamal
2001-12-09 22:13 ` bert hubert
0 siblings, 1 reply; 21+ messages in thread
From: jamal @ 2001-12-09 22:07 UTC (permalink / raw)
To: bert hubert; +Cc: kuznet, linux-kernel, netdev
On Sun, 9 Dec 2001, bert hubert wrote:
> On Sun, Dec 09, 2001 at 04:45:01PM -0500, jamal wrote:
> > > > Cant think of a straight way to do this .... Alexey would know,
> > >
> > > SO_PRIORITY. Or I did not follow you?
> >
> > So priority limits the size of skb->priority to be from 0..6; this wont
> > work with that check in cbq.
>
> No, only IP_TOS does so.
>
probaly ip precedence. Have you tried this or you are following what the
man pages say?
cheers,
jamal
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented
2001-12-09 22:07 ` jamal
@ 2001-12-09 22:13 ` bert hubert
2001-12-10 0:58 ` jamal
0 siblings, 1 reply; 21+ messages in thread
From: bert hubert @ 2001-12-09 22:13 UTC (permalink / raw)
To: jamal; +Cc: kuznet, linux-kernel, netdev
On Sun, Dec 09, 2001 at 05:07:03PM -0500, jamal wrote:
> > > So priority limits the size of skb->priority to be from 0..6; this wont
> > > work with that check in cbq.
> >
> > No, only IP_TOS does so.
>
> probaly ip precedence. Have you tried this or you are following what the
> man pages say?
I have been living in the source for quite a while now - see ip_setsockopt()
in net/ipv4/ip_sockglue.c.
Regards,
bert
--
http://www.PowerDNS.com Versatile DNS Software & Services
Trilab The Technology People
Netherlabs BV / Rent-a-Nerd.nl - Nerd Available -
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet
^ permalink raw reply [flat|nested] 21+ messages in thread
* CBQ MANPAGE: I hear the theme of '2001, A Space Odyssey'
2001-12-09 18:14 ` CBQ and all other qdiscs now REALLY completely documented kuznet
2001-12-09 18:18 ` bert hubert
2001-12-09 21:45 ` jamal
@ 2001-12-10 0:41 ` bert hubert
2001-12-10 1:04 ` jamal
2 siblings, 1 reply; 21+ messages in thread
From: bert hubert @ 2001-12-10 0:41 UTC (permalink / raw)
To: kuznet; +Cc: jamal, lartc, linux-kernel, netdev
[-- Attachment #1: Type: text/plain, Size: 1304 bytes --]
... to the sound of 'Also sprach Zarathustra':
After weeks of social deprivation and much digging through heaps of code, I
bring you
tc-cbq.8
The CBQ manpage. Nearly 2500 words, 8 printed pages, of nearly
unintelligible gobledygook, explaining mostly how CBQ works.
It is part of the Linux Advanced Routing & Traffic Control documentation
project which contains a HOWTO, a mailinglist, an IRC channel and now
manpages:
http://ds9a.nl/lartc
I want to thank Jamal for stubbornly straightening me out when I use messy
language and explaining how things work. The errors are mine though.
I *implore* ANK and others to read through this. I'm about exhausted and
running out of time (need to get on with work), and have a hard time
figuring out the exact details of the CBQ link sharing algorithm. I need
help, so to speak. The manpage indicates where.
Thanks for your attention. Please find tc-cbq.8 attached.
Regards,
bert hubert
--
http://www.PowerDNS.com Versatile DNS Software & Services
Trilab The Technology People
Netherlabs BV / Rent-a-Nerd.nl - Nerd Available -
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet
[-- Attachment #2: tc-cbq.8 --]
[-- Type: text/plain, Size: 14069 bytes --]
.TH CBQ 8 "8 December 2001" "iproute2" "Linux"
.SH NAME
CBQ \- Class Based Queueing
.SH SYNOPSIS
.B tc qdisc ... dev
dev
.B ( parent
classid
.B | root) [ handle
major:
.B ] cbq avpkt
bytes
.B bandwidth
rate
.B [ cell
bytes
.B ] [ ewma
log
.B ] [ mpu
bytes
.B ]
.B tc class ... dev
dev
.B parent
major:[minor]
.B [ classid
major:minor
.B ] cbq allot
bytes
.B [ bandwidth
rate
.B ] [ rate
rate
.B ] prio
priority
.B [ weight
weight
.B ] [ minburst
packets
.B ] [ maxburst
packets
.B ] [ ewma
log
.B ] [ cell
bytes
.B ] avpkt
bytes
.B [ mpu
bytes
.B ] [ bounded isolated ] [ split
handle
.B & defmap
defmap
.B ] [ estimator
interval timeconstant
.B ]
.SH DESCRIPTION
Class Based Queueing is a classful qdisc that implements a rich
linksharing hierarchy of classes. It contains shaping elements as
well as prioritizing capabilities. Shaping is performed using link
idle time calculations based on the timing of dequeue events and
underlying link bandwidth.
.SH SHAPING ALGORITHM
Shaping is done using link idle time calculations, and actions taken if
these calculations deviate from set limits.
When shape a 10mbit/s connection to 1mbit/s, the link will
be idle 90% of the time. If it isn't, it needs to be throttled so that it
IS idle 90% of the time.
>From the kernel's perspecive, this is hard to measure, so CBQ instead
derives the idle time from the number of microseconds that elapse between
requests from the hardware layer for more data. Combined with the
knowledge of packet sizes, this is used to approximate how full or empty
the link is.
This is rather circumspect and doesn't always arrive at proper
results. For example, what is the actual link speed of an interface
that is not really able to transmit the full 100mbit/s of data,
perhaps because of a badly implemented driver? A PCMCIA network card
will also never achieve 100mbit/s because of the way the bus is
designed - again, how do we calculate the idle time?
The physical link bandwidth may be ill defined in case of not-quite-real
network devices like PPP over Ethernet or PPTP over TCP/IP. The effective
bandwidth in that case is probably determined by the efficiency of pipes
to userspace - which not defined.
During operations, the effective idletime is measured using an
exponential weighted moving average (EWMA), which considers recent
packets to be exponentially more important than past ones. The unix
loadaverage is calculated in the same way.
The calculated idle time is substracted from the EWMA measured one,
the resulting number is called 'avgidle'. A perfectly loaded link has
an avgidle of zero: packets arrive exactly at the calculated
interval.
An overloaded link has a negative avgidle and if it gets too negative,
CBQ throttles and is then 'overlimit'.
Conversely, an idle link might amass a huge avgidle, which would then
allow infinite bandwidths after a few hours of silence. To prevent
this, avgidle is capped at
.B maxidle.
If overlimit, in theory, the CBQ could throttle itself for exactly the
amount of time that was calculated to pass between packets, and then
pass one packet, and throttle again. Due to timer resolution constraints,
this may not be feasible, see the
.B minburst
parameter below.
.SH CLASSIFICATION
Within the one CBQ instance many classes may exist. Each of these classes
contains another qdisc, by default
.BR tc-pfifo (8).
When enqueueing a packet, CBQ starts at the root and uses various methods to
determine which class should receive the data. If a verdict is reached, this
process is repeated for the recipient class which might have further
means of classifying traffic to its children, if any.
CBQ has the following methods available to classify a packet to any child
classes.
.TP
(i)
.B skb->priority class encoding.
Can be set from userspace by an application with the
.B IP_PRIO
setsockopt.
The
.B skb->priority class encoding
only applies if the skb->priority holds a major:minor handle of an existing
class within this qdisc.
.TP
(ii)
tc filters attached to the class.
.TP
(iii)
The defmap of a class, as set with the
.B split & defmap
parameters. The defmap may contain instructions for each possible Linux packet
priority.
.P
Each class also has a
.B level.
Leaf nodes, attached to the bottom of the class hierarchy, have a level of 0.
.SH CLASSIFICATION ALGORITHM
Classification is a loop, which terminates when a leaf class is found. At any
point the loop may jump to the fallback algorithm.
The loop consists of the following steps:
.TP
(i)
If the packet is generated locally and has a valid classid encoded within its
.B skb->priority,
choose it and terminate.
.TP
(ii)
Consult the tc filters, if any, attached to this child. If these return
a class which is not a leaf class, restart loop from the class returned.
If it is a leaf, choose it and terminate.
.TP
(iii)
If the tc filters did not return a class, but did return a classid,
try to find a class with that id within this qdisc.
Check if the found class is of a lower
.B level
than the current class. If so, and the returned class is not a leaf node,
restart the loop at the found class. If it is a leaf node, terminate.
If we found an upward reference to a higher level, enter the fallback
algorithm.
.TP
(iv)
If the tc filters did not return a class, nor a valid reference to one,
consider the minor number of the reference to be the priority. Retrieve
a class from the defmap of this class for the priority. If this did not
contain a class, consult the defmap of this class for the
.B BEST_EFFORT
class. If this is an upward reference, or no
.B BEST_EFFORT
class was defined,
enter the fallback algorithm. If a valid class was found, and it is not a
leaf node, restart the loop at this class. If it is a leaf, choose it and
terminate. If
neither the priority distilled from the classid, nor the
.B BEST_EFFORT
priority yielded a class, enter the fallback algorithm.
.P
The fallback algorithm resides outside of the loop and is as follows.
.TP
(i)
Consult the defmap of the class at which the jump to fallback occured. If
the defmap contains a class for the
.B
priority
of the class (which is related to the TOS field), choose this class and
terminate.
.TP
(ii)
Consult the map for a class for the
.B BEST_EFFORT
priority. If found, choose it, and terminate.
.TP
(iii)
Choose the class at which breakout to the fallback algorithm occured. Terminate.
.P
The packet is enqueued to the class which was chosen when either algorithm
terminated. It is therefore possible for a packet to be enqueued *not* at a
leaf node, but in the middle of the hierarchy.
.SH LINK SHARING ALGORITHM
When dequeueing for sending to the network device, CBQ decides which of its
classes will be allowed to send. It does so with a Weighted Round Robin process
in which each class with packets gets a chance to send in turn. The WRR process
starts by asking the highest priority classes (lowest numerically -
highest semantically) for packets, and will continue to do so until they
have no more data to offer, in which case the process repeats for lower
priorities.
.B CERTAINTY ENDS HERE, ANK PLEASE HELP
Each class is not allowed to send at length though - they can only dequeue a
configurable amount of data during each round.
If a class is about to go overlimit, and it is not
.B bounded
it will try to borrow avgidle from siblings that are not
.B isolated.
This process is repeated from the bottom upwards. If a class is unable
to borrow enough avgidle to send a packet, it is throttled and not asked
for a packet for enough time for the avgidle to increase above zero.
.B I REALLY NEED HELP FIGURING THIS OUT. REST OF DOCUMENT IS PRETTY CERTAIN
.B AGAIN.
.SH QDISC
The root qdisc of a CBQ class tree has the following parameters:
.TP
parent major:minor | root
This mandatory parameter determines the place of the CBQ instance, either at the
.B root
of an interface or within an existing class.
.TP
handle major:
Like all other qdiscs, the CBQ can be assigned a handle. Should consist only
of a major number, followed by a colon. Optional.
.TP
avpkt bytes
For calculations, the average packet size must be known. It is silently capped
at a minimum of 2/3 of the interface MTU. Mandatory.
.TP
bandwidth rate
To determine the idle time, CBQ must know the bandwidth of your underlying
physical interface, or parent qdisc. This is a vital parameter, more about it
later. Mandatory.
.TP
cell
The cell size determines he granularity of packet transmission time calculations. Has a sensible default.
.TP
mpu
A zero sized packet may still take time to transmit. This value is the lower
cap for packet transmission time calculations - packets smaller than this value
are still deemed to have this size. Defaults to zero.
.TP
ewma log
When CBQ needs to measure the average idle time, it does so using an
Exponentially Weighted Moving Average which smoothes out measurements into
a moving average. The EWMA LOG determines how much smoothing occurs. Defaults
to 5. Lower values imply greater sensitivity. Must be between 0 and 31.
.P
A CBQ qdisc does not shape out of its own accord. It only needs to know certain
parameters about the underlying link. Actual shaping is done in classes.
.SH CLASSES
Classes have a host of parameters to configure their operation.
.TP
parent major:minor
Place of this class within the hierarchy. If attached directly to a qdisc
and not to another class, minor can be omitted. Mandatory.
.TP
classid major:minor
Like qdiscs, classes can be named. The major number must be equal to the
major number of the qdisc to which it belongs. Optional, but needed if this
class is going to have children.
.TP
weight weight
When dequeueing to the interface, classes are tried for traffic in a
round-robin fashion. Classes with a higher configured qdisc will generally
have more traffic to offer during each round, so it makes sense to allow
it to dequeue more traffic. All weights under a class are normalized, so
only the ratios matter. Defaults to the configured rate, unless the priority
of this class is maximal, in which case it is set to 1.
.TP
allot bytes
Allot specifies how many bytes a qdisc can dequeue
during each round of the process. This parameter is weighted using the
renormalized class weight described above.
.TP
priority priority
In the round-robin process, classes with the lowest priority field are tried
for packets first. Mandatory.
.TP
rate rate
Maximum rate this class and all its children combined can send at. Mandatory.
.TP
bandwidth rate
This is different from the bandwidth specified when creating a CBQ disc. Only
used to determine maxidle and offtime, which are only calculated when
specifying maxburst or minburst. Mandatory if specifying maxburst or minburst.
.TP
maxburst
This number of packets is used to calculate maxidle so that when
avgidle is at maxidle, this number of average packets can be burst
before avgidle drops to 0. Set it higher to be more tolerant of
bursts. You can't set maxidle directly, only via this parameter.
.TP
minburst
As mentioned before, CBQ needs to throttle in case of
overlimit. The ideal solution is to do so for exactly the calculated
idle time, and pass 1 packet. However, Unix kernels generally have a
hard time scheduling events shorter than 10ms, so it is better to
throttle for a longer period, and then pass minburst packets in one
go, and then sleep minburst times longer.
The time to wait is called the offtime. Higher values of minburst lead
to more accurate shaping in the long term, but to bigger bursts at
millisecond timescales.
.TP
minidle
If avgidle is below 0, we are overlimits and need to wait until
avgidle will be big enough to send one packet. To prevent a sudden
burst from shutting down the link for a prolonged period of time,
avgidle is reset to minidle if it gets too low.
Minidle is specified in negative microseconds, so 10 means that
avgidle is capped at -10us.
.TP
bounded
Signifies that this class will not borrow bandwidth from its siblings.
.TP
isolated
Means that this class will not borrow bandwidth to its siblings
.TP
split major:minor & defmap bitmap[/bitmap]
If consulting filters attached to a class did not give a verdict,
CBQ can also classify based on the packet's priority. There are 16
priorities available, numbered from 0 to 15.
The defmap specifies which priorities this class wants to receive,
specified as a bitmap. The Least Significant Bit corresponds to priority
zero. The
.B split
parameter tells CBQ at which class the decision must be made, which should
be a (grand)parent of the class you are adding.
As an example, 'tc class add ... classid 10:1 cbq .. split 10:0 defmap c0'
configures class 10:0 to send packets with priorities 6 and 7 to 10:1.
The complimentary configuration would then
be: 'tc class add ... classid 10:2 cbq ... split 10:0 defmap 3f'
Which would send all packets 0, 1, 2, 3, 4 and 5 to 10:1.
.TP
estimator interval timeconstant
CBQ can measure how much bandwidth each class is using, which tc filters
can use to classify packets with. In order to determine the bandwidth
it uses a very simple estimator that measures once every
.B interval
microseconds how much traffic has passed. This again is a EWMA, for which
the time constant can be specified, also in microseconds. The
.B time constant
corresponds to the sluggishness of the measurement or, conversely, to the
sensitivity of the average to short bursts. Higher values mean less
sensitivity.
.SH SOURCES
.TP
o
Sally Floyd and Van Jacobson, "Link-sharing and Resource
Management Models for Packet Networks",
IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
.TP
o
Sally Floyd, "Notes on CBQ and Guaranted Service", 1995
.TP
o
Sally Floyd, "Notes on Class-Based Queueing: Setting
Parameters", 1996
.TP
o
Sally Floyd and Michael Speer, "Experimental Results
for Class-Based Queueing", 1998, not published.
.SH SEE ALSO
.BR tc (8)
.SH AUTHOR
Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
bert hubert <ahu@ds9a.nl>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented
2001-12-09 22:13 ` bert hubert
@ 2001-12-10 0:58 ` jamal
0 siblings, 0 replies; 21+ messages in thread
From: jamal @ 2001-12-10 0:58 UTC (permalink / raw)
To: bert hubert; +Cc: kuznet, linux-kernel, netdev
On Sun, 9 Dec 2001, bert hubert wrote:
> On Sun, Dec 09, 2001 at 05:07:03PM -0500, jamal wrote:
> > > > So priority limits the size of skb->priority to be from 0..6; this wont
> > > > work with that check in cbq.
> > >
> > > No, only IP_TOS does so.
> >
> > probaly ip precedence. Have you tried this or you are following what the
> > man pages say?
>
> I have been living in the source for quite a while now - see ip_setsockopt()
> in net/ipv4/ip_sockglue.c.
>
Thats the wrong place to look. Look instead at:
net/core/sock.c
I got it; non root is limited to 0..6; root can set the full 32 bit range.
cheers,
jamal
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ MANPAGE: I hear the theme of '2001, A Space Odyssey'
2001-12-10 0:41 ` CBQ MANPAGE: I hear the theme of '2001, A Space Odyssey' bert hubert
@ 2001-12-10 1:04 ` jamal
2001-12-10 1:12 ` bert hubert
0 siblings, 1 reply; 21+ messages in thread
From: jamal @ 2001-12-10 1:04 UTC (permalink / raw)
To: bert hubert; +Cc: kuznet, lartc, linux-kernel, netdev
Sorry didnt read it; did the 30 sec scan ..
If this is meant to be for users, why are you talking about skb->priority?
Isnt it sufficient to just call it prioirity?
Also, if you think that Alexeys imp. is based on Floyd only, you are
highly mistaken;
Going back to high latency response mode ...
cheers,
jamal
On Mon, 10 Dec 2001, bert hubert wrote:
> ... to the sound of 'Also sprach Zarathustra':
>
> After weeks of social deprivation and much digging through heaps of code, I
> bring you
>
> tc-cbq.8
>
> The CBQ manpage. Nearly 2500 words, 8 printed pages, of nearly
> unintelligible gobledygook, explaining mostly how CBQ works.
>
> It is part of the Linux Advanced Routing & Traffic Control documentation
> project which contains a HOWTO, a mailinglist, an IRC channel and now
> manpages:
>
> http://ds9a.nl/lartc
>
> I want to thank Jamal for stubbornly straightening me out when I use messy
> language and explaining how things work. The errors are mine though.
>
> I *implore* ANK and others to read through this. I'm about exhausted and
> running out of time (need to get on with work), and have a hard time
> figuring out the exact details of the CBQ link sharing algorithm. I need
> help, so to speak. The manpage indicates where.
>
> Thanks for your attention. Please find tc-cbq.8 attached.
>
> Regards,
>
> bert hubert
>
>
> --
> http://www.PowerDNS.com Versatile DNS Software & Services
> Trilab The Technology People
> Netherlabs BV / Rent-a-Nerd.nl - Nerd Available -
> 'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ MANPAGE: I hear the theme of '2001, A Space Odyssey'
2001-12-10 1:04 ` jamal
@ 2001-12-10 1:12 ` bert hubert
0 siblings, 0 replies; 21+ messages in thread
From: bert hubert @ 2001-12-10 1:12 UTC (permalink / raw)
To: jamal; +Cc: kuznet, lartc, linux-kernel, netdev
On Sun, Dec 09, 2001 at 08:04:42PM -0500, jamal wrote:
> Sorry didnt read it; did the 30 sec scan ..
> If this is meant to be for users, why are you talking about skb->priority?
> Isnt it sufficient to just call it prioirity?
It's not done yet and may need some readability tuning. Note however that
skb->priority is a bit overloaded. It can contain a priority, but also a
32bit encoded classid. These are different things, so they deserve different
mention.
> Also, if you think that Alexeys imp. is based on Floyd only, you are
> highly mistaken;
I just copied the attribution from the kernel, am glad to rectify things.
> Going back to high latency response mode ...
Thanks for reviewing.
Regards,
bert
--
http://www.PowerDNS.com Versatile DNS Software & Services
Trilab The Technology People
Netherlabs BV / Rent-a-Nerd.nl - Nerd Available -
'SYN! .. SYN|ACK! .. ACK!' - the mating call of the internet
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: CBQ and all other qdiscs now REALLY completely documented
2001-12-09 21:45 ` jamal
2001-12-09 21:53 ` bert hubert
@ 2001-12-10 17:04 ` kuznet
1 sibling, 0 replies; 21+ messages in thread
From: kuznet @ 2001-12-10 17:04 UTC (permalink / raw)
To: jamal; +Cc: ahu, lartc, linux-kernel, netdev
Hello!
> So priority limits the size of skb->priority to be from 0..6; this wont
> work with that check in cbq.
No, it does not. Values different of "low prio" defaults (0..6)
are not allowed to user without privileges by evident reasons.
User with correspoding capability may direct traffic to any class.
Alexey
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2001-12-10 17:04 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2001-12-01 0:33 Finally, CBQ nearly completely documented bert hubert
2001-12-03 2:00 ` CBQ and all other qdiscs now REALLY completely documented (almost!) bert hubert
2001-12-03 2:26 ` [LARTC] " Jim Fleming
2001-12-08 19:20 ` jamal
2001-12-08 19:55 ` further CBQ/tc documentation ds9a.nl/lartc/manpages bert hubert
2001-12-08 20:43 ` jamal
2001-12-08 23:23 ` CBQ and all other qdiscs now REALLY completely documented (almost!) bert hubert
2001-12-09 1:14 ` jamal
2001-12-09 1:30 ` bert hubert
2001-12-09 2:10 ` jamal
2001-12-09 18:14 ` CBQ and all other qdiscs now REALLY completely documented kuznet
2001-12-09 18:18 ` bert hubert
2001-12-09 21:45 ` jamal
2001-12-09 21:53 ` bert hubert
2001-12-09 22:07 ` jamal
2001-12-09 22:13 ` bert hubert
2001-12-10 0:58 ` jamal
2001-12-10 17:04 ` kuznet
2001-12-10 0:41 ` CBQ MANPAGE: I hear the theme of '2001, A Space Odyssey' bert hubert
2001-12-10 1:04 ` jamal
2001-12-10 1:12 ` bert hubert
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.