#!/bin/sh
[ -e /etc/functions.sh ] && . /etc/functions.sh || . ./functions.sh
-[ -x /sbin/modprobe ] && insmod="modprobe" || insmod="insmod"
+[ -x /sbin/modprobe ] && {
+ insmod="modprobe"
+ rmmod="$insmod -r"
+} || {
+ insmod="insmod"
+ rmmod="rmmod"
+}
add_insmod() {
eval "export isset=\${insmod_$1}"
case "$isset" in
1) ;;
- *) append INSMOD "$insmod $* >&- 2>&-" "$N"; export insmod_$1=1;;
+ *) {
+ [ "$2" ] && append INSMOD "$rmmod $1 >&- 2>&-" "$N"
+ append INSMOD "$insmod $* >&- 2>&-" "$N"; export insmod_$1=1
+ };;
esac
}
return 1
}
config_get upload "$iface" upload
- config_get halfduplex "$iface" halfduplex
+ config_get_bool halfduplex "$iface" halfduplex
config_get download "$iface" download
config_get classgroup "$iface" classgroup
config_get_bool overhead "$iface" overhead 0
download="${download:-${halfduplex:+$upload}}"
enum_classes "$classgroup"
- for dir in up${halfduplex} ${download:+down}; do
+ for dir in ${halfduplex:-up} ${download:+down}; do
case "$dir" in
up)
[ "$overhead" = 1 ] && upload=$(($upload * 98 / 100 - (15 * 128 / $upload)))
prefix="cls"
;;
down)
- add_insmod imq numdevs="$num_imq"
+ [ "$(ls -d /proc/sys/net/ipv4/conf/imq* 2>&- | wc -l)" -ne "$num_imq" ] && add_insmod imq numdevs="$num_imq"
config_get imqdev "$iface" imqdev
[ "$overhead" = 1 ] && download=$(($download * 98 / 100 - (80 * 1024 / $download)))
dev="imq$imqdev"
append up "iptables -t mangle -A OUTPUT -o $device -j ${cg}" "$N"
append up "iptables -t mangle -A FORWARD -o $device -j ${cg}" "$N"
[ -z "$dl" ] || {
+ append down "iptables -t mangle -A POSTROUTING -o $device -j ${cg}" "$N"
[ -z "$halfduplex" ] || {
append down "iptables -t mangle -A POSTROUTING -o $device -j IMQ --todev $imqdev" "$N"
}
append down "iptables -t mangle -A PREROUTING -i $device -j ${cg}" "$N"
- append down "iptables -t mangle -A POSTROUTING -o $device -j ${cg}" "$N"
append down "iptables -t mangle -A PREROUTING -i $device -j IMQ --todev $imqdev" "$N"
}
done