X-Git-Url: http://git.rohieb.name/openwrt.git/blobdiff_plain/3ebcfb0dbfb3bd40ed48a0d33afd8102c4db34b7..1b0c13b756ee8e412f33f98a89a19ddcf2df7f60:/package/qos-scripts/files/usr/lib/qos/generate.sh diff --git a/package/qos-scripts/files/usr/lib/qos/generate.sh b/package/qos-scripts/files/usr/lib/qos/generate.sh index 9181d0b6f..9fc146b81 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) @@ -116,6 +118,30 @@ parse_matching_rule() { 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 @@ -138,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" @@ -239,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." >&2 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" @@ -320,6 +358,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 @@ -353,6 +401,7 @@ start_cg() { 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" }