blob: b267adaec8c1f596acf281452088ac0e7c9b30c0 [file] [log] [blame]
#!/bin/bash
# tc uses the following units when passed as a parameter.
# kbps: Kilobytes per second
# mbps: Megabytes per second
# kbit: Kilobits per second
# mbit: Megabits per second
# bps: Bytes per second
# Amounts of data can be specified in:
# kb or k: Kilobytes
# mb or m: Megabytes
# mbit: Megabits
# kbit: Kilobits
# To get the byte figure from bits, divide the number by 8 bit
#
TC=/sbin/tc
WAN=eth0 # External (WAN side) interface
LAN=eth1 # Customer (LAN side) interface
MAXRATE=10gbit # Maximum upload/download rate
DNLD={{ downlink_speed }} # DOWNLOAD Limit
UPLD={{ uplink_speed }} # UPLOAD Limit
[ "$DNLD" == "None" ] && DNLD=$MAXRATE
[ "$UPLD" == "None" ] && UPLD=$MAXRATE
start() {
# We'll use Hierarchical Token Bucket (HTB) to shape bandwidth.
# For detailed configuration options, please consult Linux man
# page.
#
# WAN side (upload limiting)
#
$TC qdisc add dev $WAN root handle 1: htb default 30
$TC class add dev $WAN parent 1: classid 1:1 htb rate $MAXRATE burst 15k
# The default class
$TC class add dev $WAN parent 1:1 classid 1:30 htb rate 1kbit ceil $UPLD burst 15k
$TC qdisc add dev $WAN parent 1:30 handle 30: sfq perturb 10
# This class is exempt from the upload limit
$TC class add dev $WAN parent 1:1 classid 1:50 htb rate 1kbit ceil $MAXRATE burst 15k
$TC qdisc add dev $WAN parent 1:50 handle 50: sfq perturb 10
#
# LAN side (download limiting)
#
$TC qdisc add dev $LAN root handle 1: htb default 30
$TC class add dev $LAN parent 1: classid 1:1 htb rate $MAXRATE burst 15k
# The default class
$TC class add dev $LAN parent 1:1 classid 1:30 htb rate 1kbit ceil $DNLD burst 15k
$TC qdisc add dev $LAN parent 1:30 handle 30: sfq perturb 10
# This class is exempt from the download limit
$TC class add dev $LAN parent 1:1 classid 1:50 htb rate 1kbit ceil $MAXRATE burst 15k
$TC qdisc add dev $LAN parent 1:50 handle 50: sfq perturb 10
}
stop() {
# Stop the bandwidth shaping.
$TC qdisc del dev $WAN root
$TC qdisc del dev $LAN root
}
restart() {
# Self-explanatory.
stop
sleep 1
start
}
show() {
# Display status of traffic control status.
echo "Download ($LAN):"
$TC -s class show dev $LAN
echo ""
echo "Upload ($WAN):"
$TC -s class show dev $WAN
}
case "$1" in
start)
echo -n "Starting bandwidth shaping: "
start
echo "done"
;;
stop)
echo -n "Stopping bandwidth shaping: "
stop
echo "done"
;;
restart)
echo -n "Restarting bandwidth shaping: "
restart
echo "done"
;;
show)
echo "Bandwidth shaping status:"
show
echo ""
;;
*)
pwd=$(pwd)
echo "Usage: tc.bash {start|stop|restart|show}"
;;
esac
exit 0