From eacbdd4f0b986b9598cf7f5b38dcac01aabbdab3 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Mon, 27 Oct 2008 09:39:12 -0700 Subject: Fix QoS on Vif Handle Vif on serial. Can't have update and create tag. --- scripts/vyatta-qos.pl | 115 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 81 insertions(+), 34 deletions(-) (limited to 'scripts') diff --git a/scripts/vyatta-qos.pl b/scripts/vyatta-qos.pl index 29a86d0..ad20c41 100755 --- a/scripts/vyatta-qos.pl +++ b/scripts/vyatta-qos.pl @@ -158,18 +158,66 @@ sub update_interface { } sub using_policy { - my ($config, $name, $interface) = @_; + my ($config, $name, $path) = @_; my @inuse = (); - foreach my $dir ( $config->listNodes("$interface qos-policy") ) { - my $policy = $config->returnValue("$interface qos-policy $dir"); + foreach my $dir ( $config->listNodes("$path qos-policy") ) { + my $policy = $config->returnValue("$path qos-policy $dir"); if ($policy eq $name) { - push @inuse, "$interface $dir"; + push @inuse, "$path $dir"; } } return @inuse; } +sub ether_vif_using { + my ($config, $name, $type, $interface) = @_; + my @affected = (); + + foreach my $vif ( $config->listNodes("$type $interface vif") ) { + my $path = "$type $interface vif $vif"; + push @affected, using_policy($config, $name, $path); + } + return @affected; +} + +sub adsl_vif_using { + my ($config, $name, $type, $interface) = @_; + my @affected = (); + + foreach my $pvc ( $config->listNodes("$type $interface pvc") ) { + foreach my $pvctype ( $config->listNodes("$type $interface pvc $pvc") ) { + foreach my $vc ( $config->listNodes("$type $interface pvc $pvc $pvctype") ) { + my $path = "$type $interface pvc $pvc $pvctype $vc"; + push @affected, using_policy($config, $name, $path); + } + } + } + return @affected; +} + +sub serial_vif_using { + my ($config, $name, $type, $interface) = @_; + my @affected = (); + + foreach my $encap (qw/cisco-hdlc frame-relay ppp/) { + foreach my $vif ( $config->listNodes("$type $interface vif") ) { + push @affected, + using_policy($config, $name, "$type $interface $encap vif $vif"); + } + } + + return @affected; +} + + +my %interfaceVifUsing = ( + 'ethernet' => \ðer_vif_using, + 'bonding' => \ðer_vif_using, + 'serial' => \&serial_vif_using, + 'adsl' => \&adsl_vif_using, +); + sub interfaces_using { my ($name) = @_; my $config = new VyattaConfig; @@ -179,22 +227,10 @@ sub interfaces_using { foreach my $type ( $config->listNodes() ) { foreach my $interface ( $config->listNodes($type) ) { push @affected, using_policy($config, $name, "$type $interface"); - - if ($type eq 'ethernet') { - foreach my $vif ( $config->listNodes("$type $interface vif") ) { - push @affected, using_policy($config, $name, "$type $interface vif $vif"); - } - } - - if ($type eq 'adsl') { - foreach my $pvc ( $config->listNodes("adsl $interface pvc") ) { - foreach my $pvctype ( $config->listNodes("adsl $interface pvc $pvc") ) { - foreach my $vc ( $config->listNodes("adsl $interface pvc $pvc $pvctype") ) { - push @affected, using_policy($config, $name, - "adsl $interface pvc $pvc $pvctype $vc"); - } - } - } + + my $vif_check = $interfaceVifUsing{$type}; + if ($vif_check) { + push @affected, $vif_check->($config, $name, $type, $interface); } } } @@ -203,34 +239,44 @@ sub interfaces_using { } sub etherName { - my $eth = shift; + my ($eth, $vif, $id) = @_; - if ($_ =~ /vif/) { - shift; - $eth .= $_; + if ($vif eq 'vif') { + return "$eth.$id"; + } else { + return $eth; } - return $eth; } sub serialName { - my $wan = shift; - # XXX add vif - return $wan; + my ($wan, $encap, $type, $id) = @_; + + if ($encap && $type eq 'vif') { + return "$wan.$id"; + } else { + return $wan; + } } sub adslName { # adsl-name pvc pvc-num ppp-type id - my (undef, undef, undef, $type, $id) = @_; - - return $type . $id; + my ($name, undef, undef, $type, $id) = @_; + + if ($id) { + return "$name.$id"; + } else { + return $name; + } } -# Handle mapping of interface types to device names +# Handle mapping of interface types to device names with vif's +# This is because of differences in config layout my %interfaceTypes = ( 'ethernet' => \ðerName, + 'bonding' => \ðerName, 'serial' => \&serialName, 'adsl' => \&adslName, - ); +); sub delete_policy { my ($name) = @_; @@ -277,6 +323,7 @@ sub apply_changes { if ($shaper->isChanged($name)) { foreach my $cfgpath (interfaces_using($name)) { + # ethernet ethX vif 1 out my @elements = split / /, $cfgpath; my $direction = pop @elements; # out, in, ... my $type = shift @elements; # ethernet, serial, ... @@ -328,10 +375,10 @@ if ( $applyChanges ) { print < Date: Mon, 10 Nov 2008 18:12:54 -0800 Subject: Change input rate limiting to use token bucket There are two ways to input rate limit. One uses the generic rate estimator which is supposed to measure average rate, the other is to use a token bucket based packet counter. Well the generic rate estimator doesn't work correctly in current kernels (no effect), so switch to using rate and burst. Bugfix 3881 --- scripts/VyattaQosTrafficLimiter.pm | 13 ++++++------- .../traffic-limiter/node.tag/class/node.tag/burst/node.def | 7 +++++++ 2 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 templates/qos-policy/traffic-limiter/node.tag/class/node.tag/burst/node.def (limited to 'scripts') diff --git a/scripts/VyattaQosTrafficLimiter.pm b/scripts/VyattaQosTrafficLimiter.pm index 2907590..649fb17 100644 --- a/scripts/VyattaQosTrafficLimiter.pm +++ b/scripts/VyattaQosTrafficLimiter.pm @@ -26,6 +26,7 @@ my %fields = ( id => undef, priority => undef, + burst => undef, rate => undef, _match => undef, ); @@ -51,7 +52,8 @@ defined $rate or die "bandwidth must be defined for $level\n"; $self->{rate} = VyattaQosUtil::getRate($rate); - + $self->{burst} = $config->returnValue("burst"); + defined $self->{burst} or die "burst must be defined for $level\n"; $self->{priority} = $config->returnValue("priority"); foreach my $match ( $config->listNodes("match") ) { @@ -134,13 +136,10 @@ sub commands { printf {$out} "qdisc add dev %s handle %x: ingress\n", $dev, $parent; foreach my $class (@$classes) { - my $id = $class->{id}; - my $rate = $class->{rate}; - my $priority = $class->{priority}; - foreach my $match ( $class->matchRules() ) { - $match->filter( $out, $dev, $parent, $priority ); - printf {$out} " police avrate %s drop flowid :%x\n", $rate, $id; + $match->filter( $out, $dev, $parent, $class->{priority} ); + printf {$out} " police rate %s burst %s drop flowid :%x\n", + $class->{rate}, $class->{burst}, $class->{id}; } } } diff --git a/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/burst/node.def b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/burst/node.def new file mode 100644 index 0000000..54ae4f3 --- /dev/null +++ b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/burst/node.def @@ -0,0 +1,7 @@ +type: txt +help: Set the burst size for this class (default: 15kb) +default: "15k" +syntax:expression: exec "/opt/vyatta/sbin/vyatta-qos-util.pl --burst \"$VAR(@)\"" +comp_help: Allowed values: + Burst size in bytes + Size with scaling suffix (kb, mb, gb) -- cgit v1.2.3