summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@vyatta.com>2009-04-09 17:36:55 -0700
committerStephen Hemminger <shemminger@vyatta.com>2009-04-09 17:36:55 -0700
commit5f19707fc625e279427f74ce7e852ede5ad8ead8 (patch)
tree7816f6e34adb77b10aead5dc9438ca94f501cec3
parent92e3ddb45529cb180f65a64f2ddc48d97ce4a2bc (diff)
downloadvyatta-cfg-qos-5f19707fc625e279427f74ce7e852ede5ad8ead8.tar.gz
vyatta-cfg-qos-5f19707fc625e279427f74ce7e852ede5ad8ead8.zip
Add IPV6 support to QoS
Bug 4230 Allow matching based on IPV6 addresses and ports Generalize existing matching code.
-rw-r--r--lib/Vyatta/Qos/Match.pm102
-rw-r--r--templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/destination/address/node.def2
-rw-r--r--templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/destination/node.def1
-rw-r--r--templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/destination/port/node.def3
-rw-r--r--templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/dscp/node.def18
-rw-r--r--templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/protocol/node.def17
-rw-r--r--templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/source/address/node.def2
-rw-r--r--templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/source/node.def1
-rw-r--r--templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/source/port/node.def3
-rw-r--r--templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/destination/address/node.def2
-rw-r--r--templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/destination/node.def1
-rw-r--r--templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/destination/port/node.def3
-rw-r--r--templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/dscp/node.def18
-rw-r--r--templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/protocol/node.def17
-rw-r--r--templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/source/address/node.def2
-rw-r--r--templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/source/node.def1
-rw-r--r--templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/source/port/node.def3
17 files changed, 143 insertions, 53 deletions
diff --git a/lib/Vyatta/Qos/Match.pm b/lib/Vyatta/Qos/Match.pm
index 587704f..0c45958 100644
--- a/lib/Vyatta/Qos/Match.pm
+++ b/lib/Vyatta/Qos/Match.pm
@@ -20,83 +20,79 @@ use Vyatta::Qos::Util qw(getIfIndex getDsfield getProtocol);
use strict;
use warnings;
-my %fields = (
- _dev => undef,
- _vif => undef,
- _ip => undef,
-);
-
sub new {
my ( $that, $config ) = @_;
- my $self = {%fields};
+ my $self = { };
my $class = ref($that) || $that;
bless $self, $class;
- $self->_define($config);
-
- return $self;
-}
-
-sub _define {
- my ( $self, $config ) = @_;
- my $level = $config->setLevel();
$self->{_vif} = $config->returnValue("vif");
$self->{_dev} = getIfIndex($config->returnValue("interface"));
- if ($config->exists("ip")) {
- my %ip;
+ foreach my $ip (qw(ip ipv6)) {
+ next unless $config->exists($ip);
- $ip{dsfield} = getDsfield( $config->returnValue("ip dscp"));
- $ip{protocol} = getProtocol($config->returnValue("ip protocol"));
- $ip{src} = $config->returnValue("ip source address");
- $ip{dst} = $config->returnValue("ip destination address");
- $ip{sport} = $config->returnValue("ip source port");
- $ip{dport} = $config->returnValue("ip destination port");
- $self->{_ip} = \%ip;
+ # TODO make this data driven?
+ my %fields;
+ $fields{dsfield} = getDsfield( $config->returnValue("$ip dscp"));
+ $fields{protocol} = getProtocol($config->returnValue("$ip protocol"));
+ $fields{src} = $config->returnValue("$ip source address");
+ $fields{dst} = $config->returnValue("$ip destination address");
+ $fields{sport} = $config->returnValue("$ip source port");
+ $fields{dport} = $config->returnValue("$ip destination port");
+ $self->{$ip} = \%fields;
}
+
+ return $self;
}
sub filter {
my ( $self, $dev, $parent, $prio, $dsmark ) = @_;
- my $ip = $self->{_ip};
- my $indev = $self->{_dev};
- my $vif = $self->{_vif};
-
- # Catch empty match
- if (! (defined $ip || defined $indev || defined $vif)) {
- return;
- }
+
+ # empty match
+ return unless %{ $self };
# Special case for when dsmarking is used with ds matching
# original dscp is saved in tc_index
- if (defined $dsmark && defined $ip && defined $$ip{dsfield}) {
- printf "filter add dev %s parent %x: protocol ip prio 1",
- $dev, $parent;
- printf " handle %d tcindex", $$ip{dsfield};
+ if ($dsmark) {
+ foreach my $ipver (qw(ip ipv6)) {
+ my $ip = $self->{$ipver};
+ next unless $ip && $$ip{dsfield};
+
+ printf "filter add dev %s parent %x: protocol $ipver prio 1",
+ $dev, $parent;
+ printf " handle %d tcindex", $$ip{dsfield};
+ }
return;
}
- printf "filter add dev %s parent %x: prio %d", $dev, $parent, $prio;
- if (defined $ip) {
- print " protocol ip u32";
- print " match ip dsfield $$ip{dsfield} 0xff"
+ foreach my $ipver (qw(ip ipv6)) {
+ my $ip = $self->{$ipver};
+ next unless $ip;
+
+ printf "filter add dev %s parent %x: prio %d", $dev, $parent, $prio;
+ print " protocol $ipver u32";
+ print " match $ipver dsfield $$ip{dsfield} 0xff"
if defined $$ip{dsfield};
- print " match ip protocol $$ip{protocol} 0xff"
- if defined $$ip{protocol};
- print " match ip src $$ip{src}"
+ print " match $ipver protocol $$ip{protocol} 0xff"
+ if defined $$ip{protocol};
+ print " match $ipver src $$ip{src}"
if defined $$ip{src};
- print " match ip sport $$ip{sport} 0xffff"
+ print " match $ipver sport $$ip{sport} 0xffff"
if defined $$ip{sport};
- print " match ip dst $$ip{dst}"
- if defined $$ip{dst};
- print " match ip dport $$ip{dport} 0xffff"
- if defined $$ip{dport};
- } else {
+ print " match $ipver dst $$ip{dst}"
+ if defined $$ip{dst};
+ print " match $ipver dport $$ip{dport} 0xffff"
+ if defined $$ip{dport};
+ }
+
+ my $indev = $self->{indev};
+ my $vif = $self->{vif};
+ if ($vif || $indev) {
+ printf "filter add dev %s parent %x: prio %d", $dev, $parent, $prio;
print " protocol all basic";
- print " match meta\(rt_iif eq $indev\)"
- if (defined $indev);
- print " match meta\(vlan mask 0xfff eq $vif\)"
- if (defined $vif);
+ print " match meta\(rt_iif eq $indev\)" if $indev;
+ print " match meta\(vlan mask 0xfff eq $vif\)" if $vif;
}
}
diff --git a/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/destination/address/node.def b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/destination/address/node.def
new file mode 100644
index 0000000..2f608f8
--- /dev/null
+++ b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/destination/address/node.def
@@ -0,0 +1,2 @@
+type: ipv6net
+help: Set IP destination address for this match
diff --git a/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/destination/node.def b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/destination/node.def
new file mode 100644
index 0000000..54eef5b
--- /dev/null
+++ b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/destination/node.def
@@ -0,0 +1 @@
+help: Match on destination port or address
diff --git a/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/destination/port/node.def b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/destination/port/node.def
new file mode 100644
index 0000000..561899c
--- /dev/null
+++ b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/destination/port/node.def
@@ -0,0 +1,3 @@
+type: u32
+help: Set IP destination port for this match
+syntax:expression: ($VAR(@) > 0 && $VAR(@) < 65536) ; "port must be between 1 and 65535"
diff --git a/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/dscp/node.def b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/dscp/node.def
new file mode 100644
index 0000000..4f3f18e
--- /dev/null
+++ b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/dscp/node.def
@@ -0,0 +1,18 @@
+type: txt
+help: Match on Differentiated Services Codepoint (DSCP)
+syntax:expression: exec "/opt/vyatta/sbin/vyatta-qos-util.pl --dscp \"$VAR(@)\""
+allowed: awk '
+ /^#/ { next }
+ { printf "%s ", $2 }' </etc/iproute2/rt_dsfield
+comp_help: <0-63> Differentiated Services Codepoint (DSCP) value
+ default match DSCP (000000)
+ reliability match DSCP (000001)
+ throughput match DSCP (000010)
+ lowdelay match DSCP (000100)
+ priority match DSCP (001000)
+ immediate match DSCP (010000)
+ flash match DSCP (011000)
+ flash-override match DSCP (100000)
+ critical match DSCP (101000)
+ internet match DSCP (110000)
+ network match DSCP (111000)
diff --git a/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/protocol/node.def b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/protocol/node.def
new file mode 100644
index 0000000..1938d04
--- /dev/null
+++ b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/protocol/node.def
@@ -0,0 +1,17 @@
+type: txt
+help: Match IP protocol name or number
+syntax:expression: exec "/opt/vyatta/sbin/vyatta-qos-util.pl --protocol \"$VAR(@)\""
+allowed: awk '
+ /^#/ { next }
+ { printf "%s ", $1 }' </etc/protocols
+comp_help: <0-255> IP protocol value or name
+Common names:
+ icmp Internet Control Message Protocol
+ igmp Internet Group Management Protocol
+ ggp Gateway-Gateway protocol
+ tcp Transmission Control Protocol
+ egp Exterior Gateway Protocol
+ udp User Datagram Protocol
+ gre General Routing Encapsulation
+ ospf Open Shortest Path First IGP
+ sctp Stream Control Transmission Protocol
diff --git a/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/source/address/node.def b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/source/address/node.def
new file mode 100644
index 0000000..23c96c2
--- /dev/null
+++ b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/source/address/node.def
@@ -0,0 +1,2 @@
+type: ipv6net
+help: Set IP source address for this match
diff --git a/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/source/node.def b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/source/node.def
new file mode 100644
index 0000000..4271b94
--- /dev/null
+++ b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/source/node.def
@@ -0,0 +1 @@
+help: Match on source port or address
diff --git a/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/source/port/node.def b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/source/port/node.def
new file mode 100644
index 0000000..ecd96ab
--- /dev/null
+++ b/templates/qos-policy/traffic-limiter/node.tag/class/node.tag/match/node.tag/ipv6/source/port/node.def
@@ -0,0 +1,3 @@
+type: u32
+help: Set IP source port for this match
+syntax:expression: ($VAR(@) > 0 && $VAR(@) < 65536) ; "port must be between 1 and 65535"
diff --git a/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/destination/address/node.def b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/destination/address/node.def
new file mode 100644
index 0000000..2f608f8
--- /dev/null
+++ b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/destination/address/node.def
@@ -0,0 +1,2 @@
+type: ipv6net
+help: Set IP destination address for this match
diff --git a/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/destination/node.def b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/destination/node.def
new file mode 100644
index 0000000..54eef5b
--- /dev/null
+++ b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/destination/node.def
@@ -0,0 +1 @@
+help: Match on destination port or address
diff --git a/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/destination/port/node.def b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/destination/port/node.def
new file mode 100644
index 0000000..561899c
--- /dev/null
+++ b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/destination/port/node.def
@@ -0,0 +1,3 @@
+type: u32
+help: Set IP destination port for this match
+syntax:expression: ($VAR(@) > 0 && $VAR(@) < 65536) ; "port must be between 1 and 65535"
diff --git a/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/dscp/node.def b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/dscp/node.def
new file mode 100644
index 0000000..4f3f18e
--- /dev/null
+++ b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/dscp/node.def
@@ -0,0 +1,18 @@
+type: txt
+help: Match on Differentiated Services Codepoint (DSCP)
+syntax:expression: exec "/opt/vyatta/sbin/vyatta-qos-util.pl --dscp \"$VAR(@)\""
+allowed: awk '
+ /^#/ { next }
+ { printf "%s ", $2 }' </etc/iproute2/rt_dsfield
+comp_help: <0-63> Differentiated Services Codepoint (DSCP) value
+ default match DSCP (000000)
+ reliability match DSCP (000001)
+ throughput match DSCP (000010)
+ lowdelay match DSCP (000100)
+ priority match DSCP (001000)
+ immediate match DSCP (010000)
+ flash match DSCP (011000)
+ flash-override match DSCP (100000)
+ critical match DSCP (101000)
+ internet match DSCP (110000)
+ network match DSCP (111000)
diff --git a/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/protocol/node.def b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/protocol/node.def
new file mode 100644
index 0000000..1938d04
--- /dev/null
+++ b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/protocol/node.def
@@ -0,0 +1,17 @@
+type: txt
+help: Match IP protocol name or number
+syntax:expression: exec "/opt/vyatta/sbin/vyatta-qos-util.pl --protocol \"$VAR(@)\""
+allowed: awk '
+ /^#/ { next }
+ { printf "%s ", $1 }' </etc/protocols
+comp_help: <0-255> IP protocol value or name
+Common names:
+ icmp Internet Control Message Protocol
+ igmp Internet Group Management Protocol
+ ggp Gateway-Gateway protocol
+ tcp Transmission Control Protocol
+ egp Exterior Gateway Protocol
+ udp User Datagram Protocol
+ gre General Routing Encapsulation
+ ospf Open Shortest Path First IGP
+ sctp Stream Control Transmission Protocol
diff --git a/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/source/address/node.def b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/source/address/node.def
new file mode 100644
index 0000000..23c96c2
--- /dev/null
+++ b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/source/address/node.def
@@ -0,0 +1,2 @@
+type: ipv6net
+help: Set IP source address for this match
diff --git a/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/source/node.def b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/source/node.def
new file mode 100644
index 0000000..4271b94
--- /dev/null
+++ b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/source/node.def
@@ -0,0 +1 @@
+help: Match on source port or address
diff --git a/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/source/port/node.def b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/source/port/node.def
new file mode 100644
index 0000000..ecd96ab
--- /dev/null
+++ b/templates/qos-policy/traffic-shaper/node.tag/class/node.tag/match/node.tag/ipv6/source/port/node.def
@@ -0,0 +1,3 @@
+type: u32
+help: Set IP source port for this match
+syntax:expression: ($VAR(@) > 0 && $VAR(@) < 65536) ; "port must be between 1 and 65535"