2 [ -e /etc
/functions.sh
] && .
/etc
/functions.sh || . .
/functions.sh
3 [ -x /sbin
/modprobe
] && insmod
="modprobe" || insmod
="insmod"
6 eval "export isset=\${insmod_$1}"
9 *) append INSMOD
"$insmod $* >&- 2>&-" "$N"; export insmod_
$1=1;;
13 [ -e /etc
/config
/network
] && {
14 # only try to parse network config on openwrt
19 config_get
"$1" ifname
23 echo "Interface not found."
28 parse_matching_rule
() {
38 append
"$var" "$prefix" "$N"
39 for option
in $options; do
41 proto
) config_get value
"$section" proto
; proto
="${proto:-$value}";;
44 config_get
type "$section" TYPE
46 classify
) unset pkt
; append
"$var" "-m mark --mark 0";;
47 default
) pkt
=1; append
"$var" "-m mark --mark 0";;
50 append
"$var" "${proto:+-p $proto}"
51 for option
in $options; do
52 config_get value
"$section" "$option"
54 case "$pkt:$option" in
56 append
"$var" "-s $value"
59 append
"$var" "-d $value"
63 append
"$var" "-m ipp2p"
65 all
) append
"$var" "--edk --dc --kazaa --gnu --bit";;
66 *) append
"$var" "--$value";;
71 append
"$var" "-m layer7 --l7proto $value${pkt:+ --l7pkt}"
73 *:ports|
*:srcports|
*:dstports
)
74 value
="$(echo "$value" | sed -e 's,-,:,g')"
77 ""|tcp|udp
) append
"$var" "-m ${proto:-tcp -p tcp} -m multiport";;
78 *) unset "$var"; return 0;;
82 config_set
"$section" srcports
""
83 config_set
"$section" dstports
""
84 config_set
"$section" portrange
""
85 append
"$var" "--ports $value"
88 config_set
"$section" ports
""
89 config_set
"$section" dstports
""
90 config_set
"$section" portrange
""
91 append
"$var" "--sports $value"
94 config_set
"$section" ports
""
95 config_set
"$section" srcports
""
96 config_set
"$section" portrange
""
97 append
"$var" "--dports $value"
103 config_set
"$section" ports
""
104 config_set
"$section" srcports
""
105 config_set
"$section" dstports
""
106 value
="$(echo "$value" | sed -e 's,-,:,g')"
108 ""|tcp|udp
) append
"$var" "-m ${proto:-tcp -p tcp} --sport $value --dport $value";;
109 *) unset "$var"; return 0;;
114 value
="$(echo "$value" | sed -e 's,-,:,g')"
115 add_insmod ipt_length
116 append
"$var" "-m length --length $value"
120 append
"$var" "-m limit --limit $value"
124 tcp
) append
"$var" "-m tcp --tcp-flags ALL $value";;
125 *) unset $var; return 0;;
129 config_get class
"${value##!}" classnr
130 [ -z "$class" ] && continue;
132 !*) append
"$var" "-m mark ! --mark $class";;
133 *) append
"$var" "-m mark --mark $class";;
137 append
"$var" "$suffix"
138 case "$ports:$proto" in
139 1:) parse_matching_rule
"$var" "$section" "$options" "$prefix" "$suffix" "udp";;
151 config_set
"$1" "classgroup" "Default"
152 config_set
"$1" "upload" "128"
154 classify|default|reclassify
)
162 config_get TYPE
"$CONFIG_SECTION" TYPE
165 config_get enabled
"$CONFIG_SECTION" enabled
166 config_get download
"$CONFIG_SECTION" download
167 config_get classgroup
"$CONFIG_SECTION" classgroup
168 config_set
"$CONFIG_SECTION" imqdev
"$C"
169 [ -z "$enabled" -o "$(($enabled))" -eq 0 ] ||
{
171 INTERFACES
="$INTERFACES $CONFIG_SECTION"
172 config_set
"$classgroup" enabled
1
174 config_get device
"$CONFIG_SECTION" device
175 [ -z "$device" ] && device
="$(find_ifname ${CONFIG_SECTION})"
176 config_set
"$CONFIG_SECTION" device
"${device:-eth0}"
178 classgroup
) append CG
"$CONFIG_SECTION";;
179 classify|default|reclassify
)
181 classify
) var
="ctrules";;
184 config_get target
"$CONFIG_SECTION" target
185 config_set
"$CONFIG_SECTION" options
"$options"
186 append
"$var" "$CONFIG_SECTION"
195 config_get classes
"$1" classes
196 config_get default
"$1" default
197 for class
in $classes; do
199 config_set
"${class}" classnr
$c
201 $default) class_default
=$c;;
204 class_default
="${class_default:-$c}"
214 config_get tmp1
"$class" "$name"
215 config_get tmp2
"${class}_${type}" "$name"
218 export ${varname}="${tmp:-$default}"
223 [ -e $dir/tcrules.
awk ] || dir
=.
226 -v linespeed
="$rate" \
233 config_get device
"$iface" device
234 config_get enabled
"$iface" enabled
235 [ -z "$device" -o -z "$enabled" ] && exit
236 config_get upload
"$iface" upload
237 config_get halfduplex
"$iface" halfduplex
238 config_get download
"$iface" download
239 config_get classgroup
"$iface" classgroup
241 download
="${download:-${halfduplex:+$upload}}"
242 enum_classes
"$classgroup"
243 for dir
in up
${halfduplex} ${download:+down}; do
246 upload
=$
(($upload * 98 / 100 - (32 * 128 / $upload)))
253 add_insmod imq numdevs
="$num_imq"
254 config_get imqdev
"$iface" imqdev
255 download
=$
(($download * 98 / 100 - (100 * 1024 / $download)))
264 for class
in $classes; do
265 cls_var pktsize
"$class" packetsize
$dir 1500
266 cls_var pktdelay
"$class" packetdelay
$dir 0
267 cls_var maxrate
"$class" limitrate
$dir 100
268 cls_var prio
"$class" priority
$dir 1
269 cls_var avgrate
"$class" avgrate
$dir 0
270 config_get classnr
"$class" classnr
271 append cstr
"$classnr:$prio:$avgrate:$pktsize:$pktdelay:$maxrate" "$N"
273 append
${prefix}q
"$(tcrules)" "$N"
274 export dev_
${dir}="ifconfig $dev up txqueuelen 5 >&- 2>&-
275 tc qdisc del dev $dev root >&- 2>&-
276 tc qdisc add dev $dev root handle 1: hfsc default ${class_default}0
277 tc class add dev $dev parent 1: classid 1:1 hfsc sc rate ${rate}kbit ul rate ${rate}kbit"
285 ${INSMOD:+$INSMOD$N}${dev_up:+$dev_up
293 unset INSMOD clsq clsf clsl d_clsq d_clsl d_clsf dev_up dev_down
298 for iface
in $INTERFACES; do
299 start_interface
"$iface" "$C"
308 for rule
in $rules; do
310 config_get target
"$rule" target
311 config_get target
"$target" classnr
312 config_get options
"$rule" options
313 parse_matching_rule iptrule
"$rule" "$options" "$prefix" "-j MARK --set-mark $target"
314 append
"$var" "$iptrule" "$N"
325 add_rules iptrules
"$ctrules" "iptables -t mangle -A ${cg}_ct"
326 config_get classes
"$cg" classes
327 for class
in $classes; do
328 config_get mark
"$class" classnr
329 config_get maxsize
"$class" maxsize
330 [ -z "$maxsize" -o -z "$mark" ] ||
{
331 add_insmod ipt_length
332 append pktrules
"iptables -t mangle -A ${cg} -m mark --mark $mark -m length --length $maxsize: -j MARK --set-mark 0" "$N"
335 add_rules pktrules
"$rules" "iptables -t mangle -A ${cg}"
336 for iface
in $INTERFACES; do
337 config_get classgroup
"$iface" classgroup
338 config_get device
"$iface" device
339 config_get imqdev
"$iface" imqdev
340 config_get dl
"$iface" download
341 config_get halfduplex
"$iface" halfduplex
343 append up
"iptables -t mangle -A OUTPUT -o $device -j ${cg}" "$N"
344 append up
"iptables -t mangle -A FORWARD -o $device -j ${cg}" "$N"
346 [ -z "$halfduplex" ] ||
{
347 append down
"iptables -t mangle -A POSTROUTING -o $device -j IMQ --todev $imqdev" "$N"
349 append down
"iptables -t mangle -A PREROUTING -i $device -j ${cg}" "$N"
350 append down
"iptables -t mangle -A PREROUTING -i $device -j IMQ --todev $imqdev" "$N"
355 iptables -t mangle -N ${cg} >&- 2>&-
356 iptables -t mangle -N ${cg}_ct >&- 2>&-
357 ${iptrules:+${iptrules}${N}iptables -t mangle -A ${cg}_ct -j CONNMARK --save-mark}
358 iptables -t mangle -A ${cg} -j CONNMARK --restore-mark
359 iptables -t mangle -A ${cg} -m mark --mark 0 -j ${cg}_ct
361 $up$N${down:+${down}$N}
367 add_insmod ipt_multiport
368 add_insmod ipt_CONNMARK
370 iptables -t mangle -F
371 iptables -t mangle -X
380 [ -e .
/qos.conf
] && {
386 for iface
in $INTERFACES; do
387 export C
="$(($C + 1))"
392 start_interfaces
"$C"
396 start_interface
"$2" "$C"