diff options
Diffstat (limited to 'lib/Vyatta/Qos/ShaperClass.pm')
-rw-r--r-- | lib/Vyatta/Qos/ShaperClass.pm | 32 |
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 = ( |