diff options
author | Jo-Philipp Wich <jow@openwrt.org> | 2011-04-12 20:33:11 +0000 |
---|---|---|
committer | Jo-Philipp Wich <jow@openwrt.org> | 2011-04-12 20:33:11 +0000 |
commit | d136e7f6934bbe1081b68a219aeb04f4a6b7c33b (patch) | |
tree | b7a173752141524767a4014dc7bbd07626526b3c | |
parent | 5cf0e4f471ff68d08118a8854b398725d4a28e74 (diff) | |
download | upstream-d136e7f6934bbe1081b68a219aeb04f4a6b7c33b.tar.gz upstream-d136e7f6934bbe1081b68a219aeb04f4a6b7c33b.tar.bz2 upstream-d136e7f6934bbe1081b68a219aeb04f4a6b7c33b.zip |
This patch updates qos-scripts to support fair traffic sharing using the
SFQ with external classifiers method. It also corrects a bug in the
unsupported ESFQ method already used by qos-scripts. (ESFQ:
http://fatooh.org/esfq-2.6/ only updated to 2.6.24, it was switched to
an SFQ patch after that and not updated since 2008)
A class can be forced to use SFQ, and an external classifier added like
this:
config class "Normal"
option avgrate 10
option priority 30
option packetdelay 100
option limitrate 94
# option qdisc "sfq perturb 2"
config class "Normal_up"
# option filter "protocol all flow hash keys src divisor 1024"
config class "Normal_down"
# option filter "protocol all flow hash keys dst divisor 1024"
Using these options, the user needs to load cls_flow before qos-scripts
starts.
I've got more information here:
http://oneitguy.com/blogs/netprince/fair-traffic-sharing-esfq-broken-switching-sfqexternal-classifiers
This has been tested on r23914.
Signed-off-by: Ben Pfountz <netprince<>vt_edu>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@26622 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r-- | package/qos-scripts/Makefile | 2 | ||||
-rwxr-xr-x | package/qos-scripts/files/usr/lib/qos/generate.sh | 6 | ||||
-rw-r--r-- | package/qos-scripts/files/usr/lib/qos/tcrules.awk | 19 |
3 files changed, 16 insertions, 11 deletions
diff --git a/package/qos-scripts/Makefile b/package/qos-scripts/Makefile index 21607a2d74..d76dbba854 100644 --- a/package/qos-scripts/Makefile +++ b/package/qos-scripts/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=qos-scripts PKG_VERSION:=1.2.1 -PKG_RELEASE:=4 +PKG_RELEASE:=5 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) diff --git a/package/qos-scripts/files/usr/lib/qos/generate.sh b/package/qos-scripts/files/usr/lib/qos/generate.sh index 9bd3b47850..a697e9f4a2 100755 --- a/package/qos-scripts/files/usr/lib/qos/generate.sh +++ b/package/qos-scripts/files/usr/lib/qos/generate.sh @@ -315,10 +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 + cls_var qdisc "$class" qdisc $dir "" + cls_var filter "$class" filter $dir "" config_get classnr "$class" classnr - append cstr "$classnr:$prio:$avgrate:$pktsize:$pktdelay:$maxrate:$qdisc_esfq" "$N" + append cstr "$classnr:$prio:$avgrate:$pktsize:$pktdelay:$maxrate:$qdisc:$filter" "$N" done append ${prefix}q "$(tcrules)" "$N" export dev_${dir}="ifconfig $dev up txqueuelen 5 >&- 2>&- diff --git a/package/qos-scripts/files/usr/lib/qos/tcrules.awk b/package/qos-scripts/files/usr/lib/qos/tcrules.awk index ebda50640b..90b4212e72 100644 --- a/package/qos-scripts/files/usr/lib/qos/tcrules.awk +++ b/package/qos-scripts/files/usr/lib/qos/tcrules.awk @@ -13,7 +13,8 @@ BEGIN { pktsize[n] = $4 delay[n] = $5 maxrate[n] = ($6 * linespeed / 100) - qdisc_esfq[n] = $7 + qdisc[n] = $7 + filter[n] = $8 } END { @@ -68,11 +69,7 @@ END { # main qdisc for (i = 1; i <= n; i++) { printf "tc class add dev "device" parent 1:1 classid 1:"class[i]"0 hfsc" - if (qdisc_esfq[i] != "") { - # user requested esfq - print "esfq " qdisc_esfq[i] " limit " ql - } else if (rtm1[i] > 0) { - # rt class - use sfq + if (rtm1[i] > 0) { printf " rt m1 " int(rtm1[i]) "kbit d " int(d[i] * 1000) "us m2 " int(rtm2[i])"kbit" } printf " ls m1 " int(lsm1[i]) "kbit d " int(d[i] * 1000) "us m2 " int(lsm2[i]) "kbit" @@ -96,7 +93,10 @@ END { max = 3 * min limit = (min + max) * 3 - if (rtm1[i] > 0) { + if (qdisc[i] != "") { + # user specified qdisc + print qdisc[i] " limit " limit + } else if (rtm1[i] > 0) { # rt class - use sfq print "sfq perturb 2 limit " limit } else { @@ -123,6 +123,11 @@ END { # filter rule for (i = 1; i <= n; i++) { print "tc filter add dev "device" parent 1: prio "class[i]" protocol ip handle "class[i]" fw flowid 1:"class[i] "0" + filterc=1 + if (filter[i] != "") { + print " tc filter add dev "device" parent "class[i]"00: handle "filterc"0 "filter[i] + filterc=filterc+1 + } } } |