Skip to content

Instantly share code, notes, and snippets.

@manickamk
Created December 18, 2017 06:53
Show Gist options
  • Save manickamk/b5ebff8719f3099b31b6e9c78754a99b to your computer and use it in GitHub Desktop.
Save manickamk/b5ebff8719f3099b31b6e9c78754a99b to your computer and use it in GitHub Desktop.
shaper
#!/bin/bash
#
# tc-bandwidth-limit Limits the bandwidth of the configured interface
# chkconfig: 345 95 05
#
# description: Limits the bandwidth of the configured interface
### BEGIN INIT INFO
# Provides: tc-bandwidth-limit
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Required-Start:
### END INIT INFO
##
# original source :http://atmail.com/kb/2009/throttling-bandwidth/
# 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
#######-------------------Modified By Manickam-------------------------##############
##Original Source Below link ###############
# https://forums.fedoraforum.org/showthread.php?281486-tc-and-traffic-shaping-problem
# Name of the traffic control command.
TC=/sbin/tc
# The network interface we're planning on limiting bandwidth.
IF=eth0 # Interface
# Download limit (in mega bits)
DNLD1=2mbps # DOWNLOAD Limit
DNLD2=4mbps # Download Limit
DNLD3=1mbps # Download Limit
# Upload limit (in mega bits)
UPLD1=2mbps # UPLOAD Limit
UPLD2=4mbps # Upload Limit
UPLD3=1Mbps #
# IP address of the machine we are controlling
IP=192.168.50.50 # Host IP
IP1=192.168.51.205 # Host IP
IP2=192.168.51.201 # Host IP
# Filter options for limiting the intended interface.
U32="$TC filter add dev $IF protocol ip parent 1:0 prio 1 u32"
start() {
# We'll use Hierarchical Token Bucket (HTB) to shape bandwidth.
# For detailed configuration options, please consult Linux man
# page.
$TC qdisc add dev $IF root handle 1: htb default 30
$TC class add dev $IF parent 1: classid 1:1 htb rate $DNLD1
$TC class add dev $IF parent 1: classid 1:2 htb rate $UPLD1
$TC class add dev $IF parent 1: classid 1:3 htb rate $DNLD2
$TC class add dev $IF parent 1: classid 1:4 htb rate $UPLD2
$TC class add dev $IF parent 1: classid 1:5 htb rate $DNLD3
$TC class add dev $IF parent 1: classid 1:6 htb rate $UPLD3
$U32 match ip dst $IP flowid 1:1
$U32 match ip src $IP flowid 1:2
$U32 match ip dst $IP1 flowid 1:3
$U32 match ip dst $IP1 flowid 1:4
$U32 match ip dst $IP2 flowid 1:5
$U32 match ip dst $IP2 flowid 1:6
# The first line creates the root qdisc, and the next two lines
# create two child qdisc that are to be used to shape download
# and upload bandwidth.
#
# The 4th and 5th line creates the filter to match the interface.
# The 'dst' IP address is used to limit download speed, and the
# 'src' IP address is used to limit upload speed.
}
stop() {
# Stop the bandwidth shaping.
$TC qdisc del dev $IF root
}
restart() {
# Self-explanatory.
stop
sleep 1
start
}
show() {
# Display status of traffic control status.
$TC -s qdisc ls dev $IF
}
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 for $IF:"
show
echo ""
;;
*)
pwd=$(pwd)
echo "Usage: tc.bash {start|stop|restart|show}"
;;
esac
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment