This patch updates qos-scripts to support fair traffic sharing using the
authorJo-Philipp Wich <jow@openwrt.org>
Tue, 12 Apr 2011 20:33:11 +0000 (20:33 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Tue, 12 Apr 2011 20:33:11 +0000 (20:33 +0000)
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>
SVN-Revision: 26622

package/qos-scripts/Makefile
package/qos-scripts/files/usr/lib/qos/generate.sh
package/qos-scripts/files/usr/lib/qos/tcrules.awk

index 21607a2d74bfc13a7811f79d80a6f3ec84cadc02..d76dbba854dc0dcad148fcb10f0252fdc68087ca 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=qos-scripts
 PKG_VERSION:=1.2.1
 
 PKG_NAME:=qos-scripts
 PKG_VERSION:=1.2.1
-PKG_RELEASE:=4
+PKG_RELEASE:=5
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
index 9bd3b47850c5a2a9f9840c9af815fcfe34f4afbf..a697e9f4a2c1444bc0a7b317527faa13abba6cf0 100755 (executable)
@@ -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 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
                        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>&-
                done
                append ${prefix}q "$(tcrules)" "$N"
                export dev_${dir}="ifconfig $dev up txqueuelen 5 >&- 2>&-
index ebda50640bb9c4cbd9d6acf4bbb4d7d4941eec64..90b4212e72e9f569701389afc21046af39119670 100644 (file)
@@ -13,7 +13,8 @@ BEGIN {
        pktsize[n] = $4
        delay[n] = $5
        maxrate[n] = ($6 * linespeed / 100)
        pktsize[n] = $4
        delay[n] = $5
        maxrate[n] = ($6 * linespeed / 100)
-       qdisc_esfq[n] = $7
+       qdisc[n] = $7
+       filter[n] = $8
 }
 
 END {
 }
 
 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"
        # 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"
                        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
 
                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 {
                        # 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" 
        # 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
+               }
        }
 }
 
        }
 }