From 529f2f91a74aca030ad07af120322ec515d6d377 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Thu, 14 Feb 2008 14:01:21 -0800 Subject: get dsmark working This makes dsmark work. Need to round up to power of 2 and also pass parent down to handle nested case properly. --- scripts/VyattaQosMatch.pm | 6 +++--- scripts/VyattaQosTrafficShaper.pm | 22 +++++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) (limited to 'scripts') diff --git a/scripts/VyattaQosMatch.pm b/scripts/VyattaQosMatch.pm index 334b7c1..437dd50 100644 --- a/scripts/VyattaQosMatch.pm +++ b/scripts/VyattaQosMatch.pm @@ -41,7 +41,7 @@ sub _define { } sub filter { - my ( $self, $out, $dev, $id ) = @_; + my ( $self, $out, $dev, $parent, $id ) = @_; my $ip = $self->{_ip}; my $indev = $self->{_dev}; my $vif = $self->{_vif}; @@ -51,7 +51,7 @@ sub filter { return; } - print {$out} "filter add dev $dev parent 1:0 prio 1"; + print {$out} "filter add dev $dev parent $parent:0 prio 1"; if (defined $ip) { print {$out} " protocol ip u32"; print {$out} " match ip dsfield $$ip{dsfield} 0xff" @@ -73,5 +73,5 @@ sub filter { print {$out} " match meta\(vlan mask 0xfff eq $vif\)" if (defined $vif); } - print {$out} " classid 1:$id\n"; + print {$out} " classid $parent:$id\n"; } diff --git a/scripts/VyattaQosTrafficShaper.pm b/scripts/VyattaQosTrafficShaper.pm index 854ee41..1fe92aa 100644 --- a/scripts/VyattaQosTrafficShaper.pm +++ b/scripts/VyattaQosTrafficShaper.pm @@ -93,7 +93,8 @@ my $rate = _getPercentRate($self->{_rate}, $speed); my $ceil = _getPercentRate($self->{_ceiling}, $speed); my $id = sprintf "%04x", $self->{id}; - print ${out} "class add dev $dev parent $parent:1 classid 1:$id htb rate $rate"; + print ${out} "class add dev $dev parent $parent:1 classid $parent:$id" + . " htb rate $rate"; print ${out} " burst $self->{_burst}" if ( defined $self->{_burst} ); print ${out} " prio $self->{_priority}" if ( defined $self->{_priority} ); @@ -104,7 +105,7 @@ my $matches = $self->{_match}; foreach my $match (@$matches) { - $match->filter( $out, $dev, $id ); + $match->filter( $out, $dev, $parent, $id ); } } @@ -226,11 +227,10 @@ sub commands { $default->{id} = ++$maxid; unshift @$classes, $default; - # if any dscp marking, then set up hash + # Check if we need dsmrk my $usedsmark; foreach my $class (@$classes) { if (defined $class->{dsmark}) { - print "Class $class->{id} uses dsmark\n"; $usedsmark = 1; last; } @@ -238,9 +238,17 @@ sub commands { my $parent = "1"; my $root = "root"; + if ($usedsmark) { - print {$out} "qdisc add dev $dev root handle 1: dsmark " - . " indicies $maxid+1 default_index $default->{id}\n"; + # dsmark max index must be power of 2 + my $indices = $maxid + 1; + while (($indices & ($indices - 1)) != 0) { + ++$indices; + } + + print {$out} "qdisc add dev $dev handle 1:0 root dsmark" + . " indices $indices default_index $default->{id}\n"; + foreach my $class (@$classes) { $class->dsmarkClass($out, "1", $dev); } @@ -250,7 +258,7 @@ sub commands { print {$out} "qdisc add dev $dev $root handle $parent: htb"; printf {$out} " default %x\n", $default->{id}; - print {$out} "class add dev $dev parent 1: classid $parent:1 htb rate $rate\n"; + print {$out} "class add dev $dev parent $parent: classid $parent:1 htb rate $rate\n"; foreach my $class (@$classes) { $class->htbClass($out, $parent, $dev, $rate); -- cgit v1.2.3