diff options
author | Stephen Hemminger <shemminger@vyatta.com> | 2009-04-09 17:36:55 -0700 |
---|---|---|
committer | Stephen Hemminger <shemminger@vyatta.com> | 2009-04-09 17:36:55 -0700 |
commit | 5f19707fc625e279427f74ce7e852ede5ad8ead8 (patch) | |
tree | 7816f6e34adb77b10aead5dc9438ca94f501cec3 | |
parent | 92e3ddb45529cb180f65a64f2ddc48d97ce4a2bc (diff) | |
download | vyatta-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.
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" |