From 9646ca6c6e51a7a3656e2517b606fc5ebfca34b7 Mon Sep 17 00:00:00 2001
From: Jo-Philipp Wich <jow@openwrt.org>
Date: Tue, 12 Apr 2011 20:33:11 +0000
Subject: 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>

SVN-Revision: 26622
---
 package/qos-scripts/files/usr/lib/qos/tcrules.awk | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

(limited to 'package/qos-scripts/files/usr/lib/qos/tcrules.awk')

diff --git a/package/qos-scripts/files/usr/lib/qos/tcrules.awk b/package/qos-scripts/files/usr/lib/qos/tcrules.awk
index ebda506..90b4212 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
+		}
 	}
 }
 
-- 
cgit v1.1