]> code.delx.au - monosys/commitdiff
Added Linux Traffic Control script
authorJames Bunton <jamesbunton@fastmail.fm>
Mon, 1 Dec 2008 15:32:26 +0000 (02:32 +1100)
committerJames Bunton <jamesbunton@fastmail.fm>
Mon, 1 Dec 2008 15:32:26 +0000 (02:32 +1100)
scripts/shaper [new file with mode: 0755]

diff --git a/scripts/shaper b/scripts/shaper
new file mode 100755 (executable)
index 0000000..52376bb
--- /dev/null
@@ -0,0 +1,146 @@
+#!/bin/bash
+
+# Tweakables
+IFACE="ppp0"
+VOIP_HOST="203.2.134.1"
+
+UPLINK_RATE=192
+DOWNLINK_RATE=1024
+R2Q=2
+
+VOIP_RATE=64
+HIGH_RATE=32
+NORM_RATE=64
+BULK_RATE=32
+
+
+
+cd /
+
+# Print status of classes
+if [ "$1" = "status" ]
+then
+       tc -s qdisc ls dev ${IFACE}
+       tc -s class ls dev ${IFACE}
+       exit
+fi
+
+
+# clean existing down- and uplink qdiscs, hide errors
+tc qdisc del dev ${IFACE} root    2> /dev/null > /dev/null
+tc qdisc del dev ${IFACE} ingress 2> /dev/null > /dev/null
+
+if [ "$1" = "stop" ] 
+then 
+       exit
+fi
+
+
+# Symbolic 'constants'
+ROOT=1
+LIMIT=1
+VOIP_TRAFFIC=10
+HIGH_TRAFFIC=20
+NORM_TRAFFIC=30
+BULK_TRAFFIC=40
+
+
+
+########## uplink #############
+
+# install root HTB, point default traffic to NORM_TRAFFIC
+tc qdisc add dev ${IFACE} \
+       root handle ${ROOT}:0 \
+       htb default ${NORM_TRAFFIC} r2q ${R2Q}
+
+
+# LIMIT class shapes everything at $UPLINK_RATE speed
+# this prevents huge queues in the DSL modem which destroy latency
+tc class add dev ${IFACE} \
+       parent ${ROOT}:0 classid ${ROOT}:${LIMIT} \
+       htb rate ${UPLINK_RATE}Kbit ceil ${UPLINK_RATE}Kbit
+
+
+# VoIP traffic class gets guaranteed bandwidth
+tc class add dev ${IFACE} \
+       parent ${ROOT}:${LIMIT} classid ${ROOT}:${VOIP_TRAFFIC} \
+       htb rate ${VOIP_RATE}Kbit ceil $[3*${VOIP_RATE}/2]Kbit prio 0
+
+# High priority traffic
+tc class add dev ${IFACE} \
+       parent ${ROOT}:${LIMIT} classid ${ROOT}:${HIGH_TRAFFIC} \
+       htb rate ${HIGH_RATE}Kbit ceil ${UPLINK_RATE}Kbit prio 1
+
+# Normal priority traffic
+tc class add dev ${IFACE} \
+       parent ${ROOT}:${LIMIT} classid ${ROOT}:${NORM_TRAFFIC} \
+       htb rate ${NORM_RATE}Kbit ceil ${UPLINK_RATE}Kbit prio 2
+
+# Bulk traffic gets little default allowance
+tc class add dev ${IFACE} \
+       parent ${ROOT}:${LIMIT} classid ${ROOT}:${BULK_TRAFFIC} \
+       htb rate ${BULK_RATE}Kbit ceil ${UPLINK_RATE}Kbit prio 3
+
+# Stochastic Fairness
+tc qdisc add dev ${IFACE} \
+       parent ${ROOT}:${HIGH_TRAFFIC} handle ${HIGH_TRAFFIC}:0 \
+       sfq perturb 10
+tc qdisc add dev ${IFACE} \
+       parent ${ROOT}:${NORM_TRAFFIC} handle ${NORM_TRAFFIC}:0 \
+       sfq perturb 10
+tc qdisc add dev ${IFACE} \
+       parent ${ROOT}:${BULK_TRAFFIC} handle ${BULK_TRAFFIC}:0 \
+       sfq perturb 10
+
+
+
+
+
+# Match VoIP traffic as highest priority
+tc filter add dev ${IFACE} \
+       parent ${ROOT}:0 protocol ip prio 10 u32 \
+       match ip dst ${VOIP_HOST} flowid ${ROOT}:${VOIP_TRAFFIC}
+
+# ICMP (ip protocol 1) in the HIGH_TRAFFIC class
+tc filter add dev ${IFACE} \
+       parent ${ROOT}:0 protocol ip prio 10 u32 \
+       match ip protocol 1 0xff flowid ${ROOT}:${HIGH_TRAFFIC}
+
+# TOS Minimum-Delay (eg ssh but not scp) in HIGH_TRAFFIC
+tc filter add dev ${IFACE} \
+       parent ${ROOT}:0 protocol ip prio 10 u32 \
+       match ip tos 0x10 0xff flowid ${ROOT}:${HIGH_TRAFFIC}
+
+# TOS Maximise-Throughput (eg rtorrent) in BULK_TRAFFIC
+tc filter add dev ${IFACE} \
+       parent ${ROOT}:0 protocol ip prio 10 u32 \
+       match ip tos 0x08 0xff flowid ${ROOT}:${BULK_TRAFFIC}
+
+# To speed up downloads while an upload is going on, ACK is HIGH_TRAFFIC
+tc filter add dev ${IFACE} \
+       parent ${ROOT}:0 protocol ip prio 10 u32 \
+       match ip protocol 6 0xff \
+       match u8 0x05 0x0f at 0 \
+       match u16 0x0000 0xffc0 at 2 \
+       match u8 0x10 0xff at 33 \
+       flowid ${ROOT}:${HIGH_TRAFFIC}
+
+
+
+########## downlink #############
+
+tc qdisc add dev ${IFACE} \
+       handle ffff: ingress
+
+# Matching incoming VoIP traffic here so it isn't policed by the next rule
+tc filter add dev ${IFACE} \
+       parent ffff: protocol ip prio 1 u32 \
+       match ip src ${VOIP_HOST}/32 \
+       flowid :1
+
+# Police everything else - drop packets coming in faster than DOWNLINK_RATE
+tc filter add dev ${IFACE} \
+       parent ffff: protocol ip prio 2 u32 \
+       match ip src 0.0.0.0/0 \
+       police rate ${DOWNLINK_RATE}Kbit burst 10k drop flowid :2
+