[LARTC] Best QoS Policy for VoIP

rsenykoff@harrislogic.com rsenykoff@harrislogic.com
Wed, 5 Jan 2005 14:41:50 -0600


This is a multipart message in MIME format.
--=_alternative 0071B18086256F80_=
Content-Type: text/plain; charset="US-ASCII"

Hello all,

I've got a couple redundant (Spanning Tree Protocol) boxes running FC1 
minimal install + bridge-utils and they are working great for QoS + ntop 
monitoring. I'm wondering if I should handle the VoIP traffic a little 
differently. I don't mind letting VoIP and Video lend out traffic when it 
isn't being used, so that's why I gave them such large chunks of the 
bandwidth. Especially the video, which is only used sometimes, and even 
then it only usually needs around 400 / 400. It seems that CBQ is pretty 
good just because I can vary the bounded / isolated stuff. For example, 
Citrix is isolated and always gets that bandwidth. Video and VoIP are 
bounded, but not isolated. Sametime is a instant messaging client. Here's 
my script (have 2 scripts, both the same except that one is for eth0, the 
other for eth1. Also, we have 3Mb / 3Mb connection.

#!/bin/sh
#####################################
############ VARIABLES ##############
#                                   #
e=eth0       # interface
t1=2.40Mbit  # size of your WAN - remember you can't max this or you'll 
experience latency. 75-80% of max is a good place to start.
el=100Mbit   # size of eth0
w=0.24Mbit   # weighting of your WAN (10% of t1)

sizeCitrix=0.4Mbit
sizeVoIP=0.8Mbit
sizeVideo=1.0Mbit
sizeBulk=0.1Mbit
sizeSametime=0.1Mbit

weightCitrix=0.04Mbit
weightVoIP=0.08Mbit
weightVideo=0.1Mbit
weightBulk=0.01Mbit
weightSametime=0.01Mbit

CONNECTRIA1="XXX.XXX.XXX.XXX"
CONNECTRIA2="XXX.XXX.XXX.XXX"
SAMETIME="XXX.XXX.XXX.XXX"

#                                   #
#####################################
#####################################

# Delete any old rules #
tc qdisc del root dev $e

## each class is able to take more bandwidth as it is available, but must
## surrender it as the higher priorities (2, 3, then 4) need it.
## The lower the priority number, the more priority it gets. Thus when
## there is extra bandwidth available, the lower number classes get it as
## they need it.

# root qdisc /  qdisc = queueing discipline #
tc qdisc add dev $e root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 
8

tc class add dev $e parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate $t1 
weight $w prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

# child qdiscs (like child nodes on a tree) #
tc class add dev $e parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 
$sizeCitrix weight $weightCitrix prio 8 allot 1514 cell 8 maxburst 20 
avpkt 300 isolated
tc qdisc add dev $e parent 1:3 handle 30: sfq perturb 20

tc class add dev $e parent 1:1 classid 1:5 cbq bandwidth 100Mbit rate 
$sizeVoIP weight $weightVoIP prio 8 allot 1514 cell 8 maxburst 20 avpkt 
204 bounded

tc class add dev $e parent 1:1 classid 1:6 cbq bandwidth 100Mbit rate 
$sizeVideo weight $weightVideo prio 8 allot 1514 cell 8 maxburst 20 avpkt 
580 bounded

tc class add dev $e parent 1:1 classid 1:7 cbq bandwidth 100Mbit rate 
$sizeSametime weight $weightSametime prio 8 allot 1514 cell 8 maxburst 20 
avpkt 550
tc qdisc add dev $e parent 1:7 handle 70: sfq perturb 20

tc class add dev $e parent 1:1 classid 1:9 cbq bandwidth 100Mbit rate 
$sizeBulk weight $weightBulk prio 8 allot 1514 cell 8 maxburst 20 avpkt 
1000
tc qdisc add dev $e parent 1:9 handle 90: sfq perturb 20

#####################################
############### Citrix ##############
#                                   #

# SSH #
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip sport 22 
0xffff flowid 1:3
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip dport 22 
0xffff flowid 1:3

# CITRIX/ICA #
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip sport 1494 
0xffff flowid 1:3
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip dport 1494 
0xffff flowid 1:3

# CITRIX Metaframe #
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip src 
$CONNECTRIA1/32 flowid 1:3
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip dst 
$CONNECTRIA1/32 flowid 1:3

tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip src 
$CONNECTRIA2/32 flowid 1:3
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip dst 
$CONNECTRIA2/32 flowid 1:3

#####################################
############### VoIP ################
#                                   #

# IAX # this is the old format - IAX2 should be what's really seen going 
on
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip sport 5036 
0xffff flowid 1:5
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip dport 5036 
0xffff flowid 1:5

# IAX2 #
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip sport 4569 
0xffff flowid 1:5
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip dport 4569 
0xffff flowid 1:5

#### Remotely VPNd SIP Phones   #####

# Ron Senykoff Home
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip src 
XXX.XXX.XXX.XXX/32 flowid 1:5
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip dst 
XXX.XXX.XXX.XXX/32 flowid 1:5

#####################################
############### Video ###############
#                                   #

# H323 #
tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip sport 1720 
0xffff flowid 1:6
tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip dport 1720 
0xffff flowid 1:6

tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip sport 
15328 0xffff flowid 1:6
tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip dport 
15328 0xffff flowid 1:6

tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip sport 
15329 0xffff flowid 1:6
tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip dport 
15329 0xffff flowid 1:6

tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip sport 
15330 0xffff flowid 1:6
tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip dport 
15330 0xffff flowid 1:6

tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip sport 
15331 0xffff flowid 1:6
tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip dport 
15331 0xffff flowid 1:6

tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip sport 
15332 0xffff flowid 1:6
tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip dport 
15332 0xffff flowid 1:6

tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip sport 3230 
0xffff flowid 1:6
tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip dport 3230 
0xffff flowid 1:6
.
. shortened for posting purposes
.
.
tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip sport 3247 
0xffff flowid 1:6
tc filter add dev $e protocol ip parent 1:0 prio 2 u32 match ip dport 3247 
0xffff flowid 1:6

#####################################
############ Sametime ###############
#                                   #

tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip src 
$SAMETIME/32 flowid 1:7
tc filter add dev $e protocol ip parent 1:0 prio 1 u32 match ip dst 
$SAMETIME/32 flowid 1:7

#####################################
######### Bulk / Default ############
#                                   #

tc filter add dev $e protocol ip parent 1:0 prio 3 u32 match ip src 
0.0.0.0/0 flowid 1:9
tc filter add dev $e protocol ip parent 1:0 prio 3 u32 match ip dst 
0.0.0.0/0 flowid 1:9



--=_alternative 0071B18086256F80_=
Content-Type: text/html; charset="US-ASCII"


<br><font size=2 face="Courier New">Hello all,</font>
<br>
<br><font size=2 face="Courier New">I've got a couple redundant (Spanning
Tree Protocol) boxes running FC1 minimal install + bridge-utils and they
are working great for QoS + ntop monitoring. I'm wondering if I should
handle the VoIP traffic a little differently. I don't mind letting VoIP
and Video lend out traffic when it isn't being used, so that's why I gave
them such large chunks of the bandwidth. Especially the video, which is
only used sometimes, and even then it only usually needs around 400 / 400.
It seems that CBQ is pretty good just because I can vary the bounded /
isolated stuff. For example, Citrix is isolated and always gets that bandwidth.
Video and VoIP are bounded, but not isolated. Sametime is a instant messaging
client. Here's my script (have 2 scripts, both the same except that one
is for eth0, the other for eth1. Also, we have 3Mb / 3Mb connection.</font>
<br>
<br><font size=2 face="Courier New">#!/bin/sh</font>
<br><font size=2 face="Courier New">#####################################</font>
<br><font size=2 face="Courier New">############ VARIABLES ##############</font>
<br><font size=2 face="Courier New"># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; #</font>
<br><font size=2 face="Courier New">e=eth0 &nbsp; &nbsp; &nbsp; # interface</font>
<br><font size=2 face="Courier New">t1=2.40Mbit &nbsp;# size of your WAN
- remember you can't max this or you'll experience latency. 75-80% of max
is a good place to start.</font>
<br><font size=2 face="Courier New">el=100Mbit &nbsp; # size of eth0</font>
<br><font size=2 face="Courier New">w=0.24Mbit &nbsp; # weighting of your
WAN (10% of t1)</font>
<br>
<br><font size=2 face="Courier New">sizeCitrix=0.4Mbit</font>
<br><font size=2 face="Courier New">sizeVoIP=0.8Mbit</font>
<br><font size=2 face="Courier New">sizeVideo=1.0Mbit</font>
<br><font size=2 face="Courier New">sizeBulk=0.1Mbit</font>
<br><font size=2 face="Courier New">sizeSametime=0.1Mbit</font>
<br>
<br><font size=2 face="Courier New">weightCitrix=0.04Mbit</font>
<br><font size=2 face="Courier New">weightVoIP=0.08Mbit</font>
<br><font size=2 face="Courier New">weightVideo=0.1Mbit</font>
<br><font size=2 face="Courier New">weightBulk=0.01Mbit</font>
<br><font size=2 face="Courier New">weightSametime=0.01Mbit</font>
<br>
<br><font size=2 face="Courier New">CONNECTRIA1=&quot;XXX.XXX.XXX.XXX&quot;</font>
<br><font size=2 face="Courier New">CONNECTRIA2=&quot;XXX.XXX.XXX.XXX&quot;</font>
<br><font size=2 face="Courier New">SAMETIME=&quot;XXX.XXX.XXX.XXX&quot;</font>
<br>
<br><font size=2 face="Courier New"># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; #</font>
<br><font size=2 face="Courier New">#####################################</font>
<br><font size=2 face="Courier New">#####################################</font>
<br>
<br><font size=2 face="Courier New"># Delete any old rules #</font>
<br><font size=2 face="Courier New">tc qdisc del root dev $e</font>
<br>
<br><font size=2 face="Courier New">## each class is able to take more
bandwidth as it is available, but must</font>
<br><font size=2 face="Courier New">## surrender it as the higher priorities
(2, 3, then 4) need it.</font>
<br><font size=2 face="Courier New">## The lower the priority number, the
more priority it gets. Thus when</font>
<br><font size=2 face="Courier New">## there is extra bandwidth available,
the lower number classes get it as</font>
<br><font size=2 face="Courier New">## they need it.</font>
<br>
<br><font size=2 face="Courier New"># root qdisc / &nbsp;qdisc = queueing
discipline #</font>
<br><font size=2 face="Courier New">tc qdisc add dev $e root handle 1:0
cbq bandwidth 100Mbit avpkt 1000 cell 8</font>
<br>
<br><font size=2 face="Courier New">tc class add dev $e parent 1:0 classid
1:1 cbq bandwidth 100Mbit rate $t1 weight $w prio 8 allot 1514 cell 8 maxburst
20 avpkt 1000 bounded</font>
<br>
<br><font size=2 face="Courier New"># child qdiscs (like child nodes on
a tree) #</font>
<br><font size=2 face="Courier New">tc class add dev $e parent 1:1 classid
1:3 cbq bandwidth 100Mbit rate $sizeCitrix weight $weightCitrix prio 8
allot 1514 cell 8 maxburst 20 avpkt 300 isolated</font>
<br><font size=2 face="Courier New">tc qdisc add dev $e parent 1:3 handle
30: sfq perturb 20</font>
<br>
<br><font size=2 face="Courier New">tc class add dev $e parent 1:1 classid
1:5 cbq bandwidth 100Mbit rate $sizeVoIP weight $weightVoIP prio 8 allot
1514 cell 8 maxburst 20 avpkt 204 bounded</font>
<br>
<br><font size=2 face="Courier New">tc class add dev $e parent 1:1 classid
1:6 cbq bandwidth 100Mbit rate $sizeVideo weight $weightVideo prio 8 allot
1514 cell 8 maxburst 20 avpkt 580 bounded</font>
<br>
<br><font size=2 face="Courier New">tc class add dev $e parent 1:1 classid
1:7 cbq bandwidth 100Mbit rate $sizeSametime weight $weightSametime prio
8 allot 1514 cell 8 maxburst 20 avpkt 550</font>
<br><font size=2 face="Courier New">tc qdisc add dev $e parent 1:7 handle
70: sfq perturb 20</font>
<br>
<br><font size=2 face="Courier New">tc class add dev $e parent 1:1 classid
1:9 cbq bandwidth 100Mbit rate $sizeBulk weight $weightBulk prio 8 allot
1514 cell 8 maxburst 20 avpkt 1000</font>
<br><font size=2 face="Courier New">tc qdisc add dev $e parent 1:9 handle
90: sfq perturb 20</font>
<br>
<br><font size=2 face="Courier New">#####################################</font>
<br><font size=2 face="Courier New">############### Citrix ##############</font>
<br><font size=2 face="Courier New"># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; #</font>
<br>
<br><font size=2 face="Courier New"># SSH #</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip sport 22 0xffff flowid 1:3</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip dport 22 0xffff flowid 1:3</font>
<br>
<br><font size=2 face="Courier New"># CITRIX/ICA #</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip sport 1494 0xffff flowid 1:3</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip dport 1494 0xffff flowid 1:3</font>
<br>
<br><font size=2 face="Courier New"># CITRIX Metaframe #</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip src $CONNECTRIA1/32 flowid 1:3</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip dst $CONNECTRIA1/32 flowid 1:3</font>
<br>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip src $CONNECTRIA2/32 flowid 1:3</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip dst $CONNECTRIA2/32 flowid 1:3</font>
<br>
<br><font size=2 face="Courier New">#####################################</font>
<br><font size=2 face="Courier New">############### VoIP ################</font>
<br><font size=2 face="Courier New"># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; #</font>
<br>
<br><font size=2 face="Courier New"># IAX # this is the old format - IAX2
should be what's really seen going on</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip sport 5036 0xffff flowid 1:5</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip dport 5036 0xffff flowid 1:5</font>
<br>
<br><font size=2 face="Courier New"># IAX2 #</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip sport 4569 0xffff flowid 1:5</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip dport 4569 0xffff flowid 1:5</font>
<br>
<br><font size=2 face="Courier New">#### Remotely VPNd SIP Phones &nbsp;
#####</font>
<br>
<br><font size=2 face="Courier New"># Ron Senykoff Home</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip src XXX.XXX.XXX.XXX/32 flowid 1:5</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip dst XXX.XXX.XXX.XXX/32 flowid 1:5</font>
<br>
<br><font size=2 face="Courier New">#####################################</font>
<br><font size=2 face="Courier New">############### Video ###############</font>
<br><font size=2 face="Courier New"># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; #</font>
<br>
<br><font size=2 face="Courier New"># H323 #</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip sport 1720 0xffff flowid 1:6</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip dport 1720 0xffff flowid 1:6</font>
<br>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip sport 15328 0xffff flowid 1:6</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip dport 15328 0xffff flowid 1:6</font>
<br>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip sport 15329 0xffff flowid 1:6</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip dport 15329 0xffff flowid 1:6</font>
<br>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip sport 15330 0xffff flowid 1:6</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip dport 15330 0xffff flowid 1:6</font>
<br>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip sport 15331 0xffff flowid 1:6</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip dport 15331 0xffff flowid 1:6</font>
<br>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip sport 15332 0xffff flowid 1:6</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip dport 15332 0xffff flowid 1:6</font>
<br>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip sport 3230 0xffff flowid 1:6</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip dport 3230 0xffff flowid 1:6</font>
<br><font size=2 face="Courier New">.</font>
<br><font size=2 face="Courier New">. shortened for posting purposes</font>
<br><font size=2 face="Courier New">.</font>
<br><font size=2 face="Courier New">.</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip sport 3247 0xffff flowid 1:6</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 2 u32 match ip dport 3247 0xffff flowid 1:6</font>
<br>
<br><font size=2 face="Courier New">#####################################</font>
<br><font size=2 face="Courier New">############ Sametime ###############</font>
<br><font size=2 face="Courier New"># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; #</font>
<br>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip src $SAMETIME/32 flowid 1:7</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 1 u32 match ip dst $SAMETIME/32 flowid 1:7</font>
<br>
<br><font size=2 face="Courier New">#####################################</font>
<br><font size=2 face="Courier New">######### Bulk / Default ############</font>
<br><font size=2 face="Courier New"># &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; #</font>
<br>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 3 u32 match ip src 0.0.0.0/0 flowid 1:9</font>
<br><font size=2 face="Courier New">tc filter add dev $e protocol ip parent
1:0 prio 3 u32 match ip dst 0.0.0.0/0 flowid 1:9</font>
<br>
<br>
<br>
--=_alternative 0071B18086256F80_=--