forked from magnific0/wondershaper
/
wondershaper
executable file
·205 lines (160 loc) · 4.7 KB
/
wondershaper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#!/bin/bash
# Wonder Shaper
#
# Set the following values to somewhat less than your actual download
# and uplink speed. In kilobits. Also set the device that is to be shaped.
#
# Orginal: bert hubert <ahu@ds9a.nl>, Copyright 2002, Licensed under the GPL
# Fixes: magnific0 (http://www.github.com/magnific0/wondershaper)
# systemd .service and .conf file by kfgz and cmsigler at aur.archlinux.org
QUANTUM=6000
BURST=15k
COMMONOPTIONS="$COMMONOPTIONS"
usage()
{
cat << EOF
USAGE: $0 [-hcs] [-a <adapter>] [-d <rate>] [-u <rate>]
Limit the bandwidth of an adapter
OPTIONS:
-h Show this message
-a <adapter> Set the adpter
-d <rate> Set maximum download rate (in Kbps)
-u <rate> Set maximum upload rate (in Kbps)
-p Use presets in /etc/conf.d/wondershaper.conf
-c Clear the limits from adapter
-s Show the current status of adapter
MODES:
wondershaper -a <adapter> -d <rate> -u <rate>
wondershaper -c -a <adapter>
wondershaper -s -a <adapter>
EXAMPLES:
wondershaper -a eth0 -d 1024 -u 512
wondershaper -c -a eth0
EOF
}
DSPEED=
USPEED=
IFACE=
MODE=
while getopts hd:u:a:pcs o
do case "$o" in
h) usage
exit 1;;
d) DSPEED=$OPTARG;;
u) USPEED=$OPTARG;;
a) IFACE=$OPTARG;;
p) MODE="presets";;
c) MODE="clear";;
s) MODE="status";;
[?]) usage
exit 1;;
esac
done
if [ "$MODE" = "presets" ]
then
if [ -f /etc/conf.d/wondershaper.conf ]
then
source /etc/conf.d/wondershaper.conf
else
echo "/etc/conf.d/wondershaper.conf not found"
exit 1
fi
fi
if [[ ! -z $MODE ]] && [[ -z $IFACE ]]
then
echo "Please supply the adapter name for the mode."
echo ""
usage
exit 1
fi
if [ "$MODE" = "status" ]
then
tc -s qdisc ls dev $IFACE
tc -s class ls dev $IFACE
exit
fi
if [ "$MODE" = "clear" ]
then
tc qdisc del dev $IFACE root 2> /dev/null > /dev/null
tc qdisc del dev $IFACE ingress 2> /dev/null > /dev/null
exit
fi
if [[ -z $DSPEED ]] || [[ -z $USPEED ]] || [[ -z $IFACE ]]
then
usage
exit 1
fi
# low priority OUTGOING traffic - you can leave this blank if you want
# low priority source netmasks
NOPRIOHOSTSRC=80
# low priority destination netmasks
NOPRIOHOSTDST=
# low priority source ports
NOPRIOPORTSRC=
# low priority destination ports
NOPRIOPORTDST=
###### uplink
# install root HTB
tc qdisc add dev $IFACE root handle 1: htb \
default 20
# shape everything at $USPEED speed - this prevents huge queues in your
# DSL modem which destroy latency:
# main class
tc class add dev $IFACE parent 1: classid 1:1 htb \
rate ${USPEED}kbit \
prio 5 $COMMONOPTIONS
# high prio class 1:10:
tc class add dev $IFACE parent 1:1 classid 1:10 htb \
rate $[40*$USPEED/100]kbit ceil $[95*$USPEED/100]kbit \
prio 1 $COMMONOPTIONS
# bulk and default class 1:20 - gets slightly less traffic,
# and a lower priority:
tc class add dev $IFACE parent 1:1 classid 1:20 htb \
rate $[40*$USPEED/100]kbit ceil $[95*$USPEED/100]kbit \
prio 2 $COMMONOPTIONS
# 'traffic we hate'
tc class add dev $IFACE parent 1:1 classid 1:30 htb \
rate $[20*$USPEED/100]kbit ceil $[90*$USPEED/100]kbit \
prio 3 $COMMONOPTIONS
# all get Stochastic Fairness:
tc qdisc add dev $IFACE parent 1:10 handle 10: sfq perturb 10 quantum $QUANTUM
tc qdisc add dev $IFACE parent 1:20 handle 20: sfq perturb 10 quantum $QUANTUM
tc qdisc add dev $IFACE parent 1:30 handle 30: sfq perturb 10 quantum $QUANTUM
# start filters
# TOS Minimum Delay (ssh, NOT scp) in 1:10:
tc filter add dev $IFACE parent 1: protocol ip prio 10 u32 \
match ip tos 0x10 0xff flowid 1:10
# ICMP (ip protocol 1) in the interactive class 1:10 so we
# can do measurements & impress our friends:
tc filter add dev $IFACE parent 1: protocol ip prio 11 u32 \
match ip protocol 1 0xff flowid 1:10
# prioritize small packets (<64 bytes)
tc filter add dev $IFACE parent 1: protocol ip prio 12 u32 \
match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 \
match u16 0x0000 0xffc0 at 2 \
flowid 1:10
# some traffic however suffers a worse fate
for a in $NOPRIOPORTDST
do
tc filter add dev $IFACE parent 1: protocol ip prio 14 u32 \
match ip dport $a 0xffff flowid 1:30
done
for a in $NOPRIOPORTSRC
do
tc filter add dev $IFACE parent 1: protocol ip prio 15 u32 \
match ip sport $a 0xffff flowid 1:30
done
for a in $NOPRIOHOSTSRC
do
tc filter add dev $IFACE parent 1: protocol ip prio 16 u32 \
match ip src $a flowid 1:30
done
for a in $NOPRIOHOSTDST
do
tc filter add dev $IFACE parent 1: protocol ip prio 17 u32 \
match ip dst $a flowid 1:30
done
# rest is 'non-interactive' ie 'bulk' and ends up in 1:20
tc filter add dev $IFACE parent 1: protocol ip prio 18 u32 \
match ip dst 0.0.0.0/0 flowid 1:20