X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/814b429c34611fb919be9b7801574277d59f6395..7f398df47f7c891e2e0a7fb0f514672503047248:/package/qos-scripts/files/usr/lib/qos/generate.sh?ds=inline diff --git a/package/qos-scripts/files/usr/lib/qos/generate.sh b/package/qos-scripts/files/usr/lib/qos/generate.sh index a3c9f175c..6b5db3d7d 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 } @@ -59,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) @@ -111,6 +113,35 @@ parse_matching_rule() { esac ports=1 ;; + *:connbytes) + value="$(echo "$value" | sed -e 's,-,:,g')" + add_insmod ipt_connbytes + append "$var" "-m connbytes --connbytes $value --connbytes-dir both --connbytes-mode bytes" + ;; + *:tos) + add_insmod ipt_tos + case "$value" in + !*) append "$var" "-m tos ! --tos $value";; + *) append "$var" "-m tos --tos $value" + esac + ;; + *:dscp) + add_insmod ipt_dscp + dscp_option="--dscp" + [ -z "${value%%[EBCA]*}" ] && dscp_option="--dscp-class" + case "$value" in + !*) append "$var" "-m dscp ! $dscp_option $value";; + *) append "$var" "-m dscp $dscp_option $value" + esac + ;; + *:direction) + value="$(echo "$value" | sed -e 's,-,:,g')" + if [ "$value" = "out" ]; then + append "$var" "-o $device" + elif [ "$value" = "in" ]; then + append "$var" "-i $device" + fi + ;; 1:pktsize) value="$(echo "$value" | sed -e 's,-,:,g')" add_insmod ipt_length @@ -133,6 +164,19 @@ parse_matching_rule() { !*) append "$var" "-m mark ! --mark $class";; *) append "$var" "-m mark --mark $class";; esac + ;; + 1:TOS) + add_insmod ipt_TOS + config_get TOS "$rule" 'TOS' + suffix="-j TOS --set-tos "${TOS:-"Normal-Service"} + ;; + 1:DSCP) + add_insmod ipt_DSCP + config_get DSCP "$rule" 'DSCP' + [ -z "${DSCP%%[EBCA]*}" ] && set_value="--set-dscp-class $DSCP" \ + || set_value="--set-dscp $DSCP" + suffix="-j DSCP $set_value" + ;; esac done append "$var" "$suffix" @@ -234,28 +278,27 @@ start_interface() { config_get device "$iface" device config_get_bool enabled "$iface" enabled 1 [ -z "$device" -o 1 -ne "$enabled" ] && { - echo "Interface '$iface' not found or disabled." 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 - (32 * 128 / $upload))) + [ "$overhead" = 1 ] && upload=$(($upload * 98 / 100 - (15 * 128 / $upload))) dev="$device" rate="$upload" dl_mode="" 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" @@ -272,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>&- @@ -315,6 +360,16 @@ add_rules() { config_get target "$rule" target config_get target "$target" classnr config_get options "$rule" options + + ## If we want to override the TOS field, let's clear the DSCP field first. + [ ! -z "$(echo $options | grep 'TOS')" ] && { + s_options=${options%%TOS} + add_insmod ipt_DSCP + parse_matching_rule iptrule "$rule" "$s_options" "$prefix" "-j DSCP --set-dscp 0" + append "$var" "$iptrule" "$N" + unset iptrule + } + parse_matching_rule iptrule "$rule" "$options" "$prefix" "-j MARK --set-mark $target" append "$var" "$iptrule" "$N" done @@ -325,7 +380,6 @@ start_cg() { local iptrules local pktrules local sizerules - local download enum_classes "$cg" add_rules iptrules "$ctrules" "iptables -t mangle -A ${cg}_ct" config_get classes "$cg" classes @@ -342,12 +396,15 @@ start_cg() { 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" ] || { + [ -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" }