summaryrefslogtreecommitdiff
path: root/lib/Vyatta/Qos/ShaperClass.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Vyatta/Qos/ShaperClass.pm')
-rw-r--r--lib/Vyatta/Qos/ShaperClass.pm32
1 files changed, 23 insertions, 9 deletions
diff --git a/lib/Vyatta/Qos/ShaperClass.pm b/lib/Vyatta/Qos/ShaperClass.pm
index d89dfb9..4e0ada1 100644
--- a/lib/Vyatta/Qos/ShaperClass.pm
+++ b/lib/Vyatta/Qos/ShaperClass.pm
@@ -21,7 +21,7 @@ use warnings;
require Vyatta::Config;
use Vyatta::Qos::Match;
-use Vyatta::Qos::Util qw/getDsfield getRate RedParam/;
+use Vyatta::Qos::Util qw/getDsfield getRate/;
sub new {
@@ -151,16 +151,29 @@ sub fifoQdisc {
# Red is has way to many configuration options
# make some assumptions to make this sane (based on LARTC)
-# average size := 1000 bytes
-# limit := queue-limit * average
-# max := limit / 8
-# min := max / 3
-# burst := (2 * min + max) / (3 * average)
+# average size = 1000 bytes
+# latency = 100ms
+#
+# Bandwidth (bits/sec) * Latency (ms)
+# Maximum Threshold = --------------------------------------
+# (bytes) 8 bits/byte * 1000000 us/sec
+#
+# Minimum Threshold = Maximum Threshold / 3
+# Avpkt = Average Packet Length
+# Burst = ( 2 * MinThreshold + MaxThreshold) / ( 3 * Avpkt )
+# Limit = 4 * MaxThreshold
+#
+# These are based on Sally Floyd's recommendations:
+# http://www.icir.org/floyd/REDparameters.txt
+#
sub redQdisc {
my ( $self, $dev, $rate ) = @_;
my $avg = 1000;
- my $latency = 100000; # 100 ms
- my ($qmin, $qmax, $burst) = RedParam($rate, $latency, $avg);
+ my $latency = 100000;
+ my $qmax = ( $rate * $latency ) / 8000000;
+ my $qmin = $qmax / 3;
+ my $burst = ( 2 * $qmin + $qmax ) / ( 3 * $avg );
+ my $maxp = 0.1;
my $limit = $self->{_limit};
my $qlimit;
@@ -171,7 +184,8 @@ sub redQdisc {
}
printf "red limit %d min %d max %d avpkt %d", $qlimit, $qmin, $qmax, $avg;
- printf " burst %d probability 0.02 bandwidth %d ecn\n", $burst, $rate / 1000;
+ printf " burst %d probability %f bandwidth %d ecn\n",
+ $burst, $maxp, $rate / 1000;
}
my %qdiscOptions = (