X-Git-Url: http://git.ozo.com/?p=openwrt-10.03%2F.git;a=blobdiff_plain;f=package%2Fqos-scripts%2Ffiles%2Fusr%2Flib%2Fqos%2Fgenerate.sh;h=390395141906ce8f481a68f8ce28c0d4a5a6200e;hp=55ddf3c7fc986b5483c39930c1b6af09e98b274f;hb=05ce5537d1764151ee8508d75a647351bb9ed0da;hpb=7bf3db327ef29557c86d3c8f1c8d31768b2d25a1 diff --git a/package/qos-scripts/files/usr/lib/qos/generate.sh b/package/qos-scripts/files/usr/lib/qos/generate.sh index 55ddf3c7f..390395141 100755 --- a/package/qos-scripts/files/usr/lib/qos/generate.sh +++ b/package/qos-scripts/files/usr/lib/qos/generate.sh @@ -1,12 +1,21 @@ #!/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 } @@ -17,7 +26,6 @@ add_insmod() { reset_cb include /lib/network scan_interfaces - config_load /var/state/network config_get "$1" ifname )} } || { @@ -60,16 +68,9 @@ parse_matching_rule() { *:dsthost) append "$var" "-d $value" ;; - *:ipp2p) - add_insmod ipt_ipp2p - append "$var" "-m ipp2p" - case "$value" in - all) append "$var" "--edk --dc --kazaa --gnu --bit";; - *) append "$var" "--$value";; - esac - ;; *:layer7) add_insmod ipt_layer7 + add_insmod xt_layer7 append "$var" "-m layer7 --l7proto $value${pkt:+ --l7pkt}" ;; *:ports|*:srcports|*:dstports) @@ -280,14 +281,14 @@ start_interface() { 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))) @@ -297,7 +298,7 @@ start_interface() { 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" @@ -314,8 +315,10 @@ start_interface() { cls_var maxrate "$class" limitrate $dir 100 cls_var prio "$class" priority $dir 1 cls_var avgrate "$class" avgrate $dir 0 + cls_var qdisc_esfq "$class" qdisc_esfq $dir "" + [ "$qdisc_esfq" != "" ] && add_insmod sch_esfq config_get classnr "$class" classnr - append cstr "$classnr:$prio:$avgrate:$pktsize:$pktdelay:$maxrate" "$N" + append cstr "$classnr:$prio:$avgrate:$pktsize:$pktdelay:$maxrate:$qdisc_esfq" "$N" done append ${prefix}q "$(tcrules)" "$N" export dev_${dir}="ifconfig $dev up txqueuelen 5 >&- 2>&- @@ -377,44 +380,45 @@ start_cg() { local iptrules local pktrules local sizerules - local download enum_classes "$cg" - add_rules iptrules "$ctrules" "iptables -t mangle -A ${cg}_ct" + add_rules iptrules "$ctrules" "iptables -t mangle -A qos_${cg}_ct" config_get classes "$cg" classes for class in $classes; do config_get mark "$class" classnr config_get maxsize "$class" maxsize [ -z "$maxsize" -o -z "$mark" ] || { add_insmod ipt_length - append pktrules "iptables -t mangle -A ${cg} -m mark --mark $mark -m length --length $maxsize: -j MARK --set-mark 0" "$N" + append pktrules "iptables -t mangle -A qos_${cg} -m mark --mark $mark -m length --length $maxsize: -j MARK --set-mark 0" "$N" } done - add_rules pktrules "$rules" "iptables -t mangle -A ${cg}" + add_rules pktrules "$rules" "iptables -t mangle -A qos_${cg}" for iface in $INTERFACES; do config_get classgroup "$iface" classgroup config_get device "$iface" device config_get imqdev "$iface" imqdev - config_get dl "$iface" download + config_get upload "$iface" upload + config_get download "$iface" download config_get halfduplex "$iface" halfduplex + download="${download:-${halfduplex:+$upload}}" add_insmod ipt_IMQ - 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 up "iptables -t mangle -A OUTPUT -o $device -j qos_${cg}" "$N" + append up "iptables -t mangle -A FORWARD -o $device -j qos_${cg}" "$N" + [ -z "$download" ] || { + 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 cat <&- 2>&- -iptables -t mangle -N ${cg}_ct >&- 2>&- -${iptrules:+${iptrules}${N}iptables -t mangle -A ${cg}_ct -j CONNMARK --save-mark} -iptables -t mangle -A ${cg} -j CONNMARK --restore-mark -iptables -t mangle -A ${cg} -m mark --mark 0 -j ${cg}_ct +iptables -t mangle -N qos_${cg} >&- 2>&- +iptables -t mangle -N qos_${cg}_ct >&- 2>&- +${iptrules:+${iptrules}${N}iptables -t mangle -A qos_${cg}_ct -j CONNMARK --save-mark} +iptables -t mangle -A qos_${cg} -j CONNMARK --restore-mark +iptables -t mangle -A qos_${cg} -m mark --mark 0 -j qos_${cg}_ct $pktrules $up$N${down:+${down}$N} EOF @@ -424,15 +428,33 @@ EOF start_firewall() { add_insmod ipt_multiport add_insmod ipt_CONNMARK - cat <