summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2008-02-05 16:54:48 -0800
committerStephen Hemminger <stephen.hemminger@vyatta.com>2008-02-05 16:54:48 -0800
commit0b8d73903c3a1245c95d3ed92756fe3df649bbed (patch)
tree67e0342479bc718d35c04e657357b3036419e9cb
parent24b46144a00f1346b0c983884e3f11b91b0c4379 (diff)
downloadvyatta-cfg-qos-0b8d73903c3a1245c95d3ed92756fe3df649bbed.tar.gz
vyatta-cfg-qos-0b8d73903c3a1245c95d3ed92756fe3df649bbed.zip
add support for match based on incoming device and vlan
This is preliminary (still needs testing) but get the syntax and basic structure in place.
-rw-r--r--scripts/VyattaQosMatch.pm14
-rw-r--r--scripts/VyattaQosTrafficShaper.pm3
-rw-r--r--scripts/VyattaQosUtil.pm15
3 files changed, 24 insertions, 8 deletions
diff --git a/scripts/VyattaQosMatch.pm b/scripts/VyattaQosMatch.pm
index fc0958a..31ddf36 100644
--- a/scripts/VyattaQosMatch.pm
+++ b/scripts/VyattaQosMatch.pm
@@ -5,7 +5,7 @@ use strict;
my %fields = (
_dev => undef,
- _vlan => undef,
+ _vif => undef,
_ip => {
src => undef,
dst => undef,
@@ -31,7 +31,7 @@ sub _define {
my ( $self, $config ) = @_;
my $level = $config->setLevel();
- $self->{_vlan} = $config->returnValue("vif");
+ $self->{_vif} = VyattaQosUtil::getIfIndex($config->returnValue("vif"));
$self->{_dev} = $config->returnValue("interface");
if ($config->exists("ip")) {
my %ip;
@@ -51,8 +51,6 @@ sub filter {
print {$out} "filter add dev $dev parent 1:0 prio 1";
- # TODO match on vlan, device, ...
-
if (defined $self->{_ip}) {
my $ip = $self->{_ip};
print {$out} " protocol ip u32";
@@ -64,5 +62,13 @@ sub filter {
print {$out} " match ip dport $$ip{dport} 0xffff" if defined $$ip{dport};
}
+ if (defined $self->{_dev}) {
+ print {$out} " basic meta match meta \(rt_iif eq $self->{_dev}\)";
+ }
+
+ if (defined $self->{_vif}) {
+ print {$out} " basic meta match meta \(vlan mask 0xfff eq $self->{_vif}\)";
+ }
+
print {$out} " classid 1:$id\n";
}
diff --git a/scripts/VyattaQosTrafficShaper.pm b/scripts/VyattaQosTrafficShaper.pm
index 2b95a05..16c1fef 100644
--- a/scripts/VyattaQosTrafficShaper.pm
+++ b/scripts/VyattaQosTrafficShaper.pm
@@ -34,10 +34,11 @@
my $level = $config->setLevel();
my @matches = ();
+ $self->{_rate} = $config->returnValue("rate");
+ defined $self->{_rate} or die "Rate not defined for class $id\n";
$self->{_id} = sprintf "%04x", $id;
$self->{_priority} = $config->returnValue("priority");
- $self->{_rate} = $config->returnValue("rate");
$self->{_ceiling} = $config->returnValue("ceiling");
$self->{_burst} = $config->returnValue("burst");
diff --git a/scripts/VyattaQosUtil.pm b/scripts/VyattaQosUtil.pm
index 3a115db..0c9ab83 100644
--- a/scripts/VyattaQosUtil.pm
+++ b/scripts/VyattaQosUtil.pm
@@ -1,7 +1,7 @@
package VyattaQosUtil;
use POSIX;
require Exporter;
-@EXPORT = qw/getRate getSize getProtocol getDsfield interfaceRate/;
+@EXPORT = qw/getRate getSize getProtocol getDsfield getIfIndex interfaceRate/;
use strict;
sub get_num {
@@ -119,12 +119,21 @@ sub getDsfield {
last;
}
}
- close($ds);
+ close($ds) or die "read $dsFileName error\n";
return $match;
}
-# Utility routines
+sub getIfIndex {
+ my ($str) = @_;
+
+ defined $str or return;
+ open my $sysfs, "<", "/sys/class/net/$str/ifindex" || die "Unknown interface $str\n";
+ my $ifindex = <$sysfs>;
+ close($sysfs) or die "read sysfs error\n";
+ return $ifindex;
+}
+
## interfaceRate("eth0")
# return result in bits per second