#!/bin/sh
# description: Starts stops and restarts the basic shaping
# chkconfig: 2345 90 35
TC=/sbin/tc
addshaping ()
{
$TC qdisc add dev $DEV root handle 1: htb default 90
# Setup parent class
$TC class add dev $DEV parent 1: classid 1:1 htb rate $RATE
# Add prio 1 queue (highest)
$TC class add dev $DEV parent 1:1 classid 1:10 htb rate $RATE ceil $RATE prio 0
$TC qdisc add dev $DEV parent 1:10 handle 10: red limit 1052 min 132 max 263 burst 2 avpkt 128 bandwidth $RATE probability 1
# Add prio 2 queue
$TC class add dev $DEV parent 1:1 classid 1:20 htb rate $RATE ceil $RATE prio 1
$TC qdisc add dev $DEV parent 1:20 handle 20: red limit 2624 min 328 max 656 burst 2 avpkt 256 bandwidth $RATE probability 1
# Add prio 3 queue (VoIP)
$TC class add dev $DEV parent 1:1 classid 1:30 htb rate $RATE ceil $RATE prio 2
$TC qdisc add dev $DEV parent 1:30 handle 30: red limit 1052 min 132 max 263 burst 2 avpkt 128 bandwidth $RATE probability 1
# Add prio 4 queue (ICMP & TCP ACK)
$TC class add dev $DEV parent 1:1 classid 1:40 htb rate $RATE ceil $RATE prio 3
$TC qdisc add dev $DEV parent 1:40 handle 40: red limit 5244 min 656 max 1311 burst 2 avpkt 512 bandwidth $RATE probability 0.01
# Add prio 5 queue (UDP)
$TC class add dev $DEV parent 1:1 classid 1:50 htb rate $RATE ceil $RATE prio 4
$TC qdisc add dev $DEV parent 1:50 handle 50: red limit 6292 min 787 max 1573 burst 2 avpkt 768 bandwidth $RATE probability 0.01
# Add prio 6 queue
$TC class add dev $DEV parent 1:1 classid 1:60 htb rate $RATE ceil $RATE prio 5
$TC qdisc add dev $DEV parent 1:60 handle 60: red limit 8392 min 1049 max 2098 burst 2 avpkt 1024 bandwidth $RATE probability 0.02
# Add prio 7 queue
$TC class add dev $DEV parent 1:1 classid 1:70 htb rate $RATE ceil $RATE prio 6
$TC qdisc add dev $DEV parent 1:70 handle 70: red limit 10488 min 1311 max 2622 burst 2 avpkt 1024 bandwidth $RATE probability 0.02
# Add prio 8 queue
$TC class add dev $DEV parent 1:1 classid 1:80 htb rate $RATE ceil $RATE prio 7
$TC qdisc add dev $DEV parent 1:80 handle 80: red limit 15732 min 1967 max 3933 burst 3 avpkt 1024 bandwidth $RATE probability 0.03
# Add prio 9 queue (lowest)
$TC class add dev $DEV parent 1:1 classid 1:90 htb rate $RATE ceil $RATE prio 8
$TC qdisc add dev $DEV parent 1:90 handle 90: red limit 31460 min 3933 max 7865 burst 6 avpkt 1024 bandwidth $RATE probability 0.04
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x0 0xff flowid 1:90
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x8 0xff flowid 1:90
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x10 0xff flowid 1:90
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x18 0xff flowid 1:90
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x20 0xff flowid 1:80
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x28 0xff flowid 1:80
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x30 0xff flowid 1:80
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x38 0xff flowid 1:80
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x40 0xff flowid 1:70
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x48 0xff flowid 1:70
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x50 0xff flowid 1:70
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x58 0xff flowid 1:70
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x60 0xff flowid 1:60
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x68 0xff flowid 1:60
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x70 0xff flowid 1:60
$TC filter add dev $DEV protocol ip prio 4 u32 match ip tos 0x78 0xff flowid 1:60
$TC filter add dev $DEV protocol ip prio 1 u32 match ip tos 0x80 0xff flowid 1:50
$TC filter add dev $DEV protocol ip prio 1 u32 match ip tos 0x88 0xff flowid 1:50
$TC filter add dev $DEV protocol ip prio 1 u32 match ip tos 0x90 0xff flowid 1:50
$TC filter add dev $DEV protocol ip prio 1 u32 match ip tos 0x98 0xff flowid 1:50
$TC filter add dev $DEV protocol ip prio 1 u32 match ip tos 0xA0 0xff flowid 1:40
$TC filter add dev $DEV protocol ip prio 1 u32 match ip tos 0xA8 0xff flowid 1:40
$TC filter add dev $DEV protocol ip prio 1 u32 match ip tos 0xB0 0xff flowid 1:40
$TC filter add dev $DEV protocol ip prio 1 u32 match ip tos 0xB8 0xff flowid 1:30
$TC filter add dev $DEV protocol ip prio 0 u32 match ip tos 0xC0 0xff flowid 1:20
$TC filter add dev $DEV protocol ip prio 0 u32 match ip tos 0xC8 0xff flowid 1:20
$TC filter add dev $DEV protocol ip prio 0 u32 match ip tos 0xD0 0xff flowid 1:20
$TC filter add dev $DEV protocol ip prio 0 u32 match ip tos 0xD8 0xff flowid 1:20
$TC filter add dev $DEV protocol ip prio 0 u32 match ip tos 0xE0 0xff flowid 1:10
$TC filter add dev $DEV protocol ip prio 0 u32 match ip tos 0xE8 0xff flowid 1:10
$TC filter add dev $DEV protocol ip prio 0 u32 match ip tos 0xF0 0xff flowid 1:10
$TC filter add dev $DEV protocol ip prio 0 u32 match ip tos 0xF8 0xff flowid 1:10
}
removeshaping ()
{
$TC qdisc del dev $DEV root handle 1: htb default 60
}
case "$1" in
'start')
DEV=eth0.50
RATE=2mbit
addshaping
touch /var/lock/subsys/shaping
;;
'restart')
$0 stop
$0 start
;;
'stop')
DEV=eth0.50
removeshaping
rm -f /var/lock/subsys/shaping
;;
*)
echo "Usage: $0 { start | stop | restart}"
;;
esac
exit 0