summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2008-11-21 08:47:13 -0800
committerStephen Hemminger <stephen.hemminger@vyatta.com>2008-11-21 08:47:13 -0800
commit1962b4d7d72833479789d29622ef5ce2c2f4662f (patch)
tree05f4718142fb328ea9972a50b5371c5a7a5d6b71 /scripts
parent790663c88fb291ddb5b645bdde62d8229d5e115b (diff)
parent375ee54821c5d1f4b29ea11c1b522b0cdabf2e3f (diff)
downloadvyatta-cfg-qos-1962b4d7d72833479789d29622ef5ce2c2f4662f.tar.gz
vyatta-cfg-qos-1962b4d7d72833479789d29622ef5ce2c2f4662f.zip
Merge branch 'jenner' of suva.vyatta.com:/git/vyatta-cfg-qos into jenner
Conflicts: lib/Vyatta/Qos/TrafficLimiter.pm
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/vyatta-qos.pl115
1 files changed, 81 insertions, 34 deletions
diff --git a/scripts/vyatta-qos.pl b/scripts/vyatta-qos.pl
index 3437b1b..9b1253e 100755
--- a/scripts/vyatta-qos.pl
+++ b/scripts/vyatta-qos.pl
@@ -160,18 +160,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' => \&ether_vif_using,
+ 'bonding' => \&ether_vif_using,
+ 'serial' => \&serial_vif_using,
+ 'adsl' => \&adsl_vif_using,
+);
+
sub interfaces_using {
my ($name) = @_;
my $config = new VyattaConfig;
@@ -181,22 +229,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);
}
}
}
@@ -205,34 +241,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' => \&etherName,
+ 'bonding' => \&etherName,
'serial' => \&serialName,
'adsl' => \&adslName,
- );
+);
sub delete_policy {
my ($name) = @_;
@@ -279,6 +325,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, ...
@@ -330,10 +377,10 @@ if ( $applyChanges ) {
print <<EOF;
usage: vyatta-qos.pl --check
vyatta-qos.pl --list-policy
+ vyatta-qos.pl --apply-changes
vyatta-qos.pl --create-policy policy-type policy-name
vyatta-qos.pl --delete-policy policy-name
- vyatta-qos.pl --apply-changes policy-type policy-name
vyatta-qos.pl --update-interface interface direction policy-name
vyatta-qos.pl --delete-interface interface direction