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>
--- qos.orig/generate.sh
+++ qos/generate.sh
@@ -315,10 +315,10 @@
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>&-
--- qos.orig/tcrules.awk
+++ qos/tcrules.awk
@@ -13,7 +13,8 @@
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 @@
# 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 @@
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 @@
# 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
+ }
}
}
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel