#!/usr/bin/perl
#
# Copyright (C) 1999, 2000, 2001, 2002, 2003 Yokogawa Electric Corporation,
# IPA (Information-technology Promotion Agency, Japan).
# All rights reserved.
#
# Redistribution and use of this software in source and binary forms, with
# or without modification, are permitted provided that the following
# conditions and disclaimer are agreed and accepted by the user:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the names of the copyrighters, the name of the project which
# is related to this software (hereinafter referred to as "project") nor
# the names of the contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# 4. No merchantable use may be permitted without prior written
# notification to the copyrighters. However, using this software for the
# purpose of testing or evaluating any products including merchantable
# products may be permitted without any notification to the copyrighters.
#
#
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND
# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING
# BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHTERS, THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT,STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
# THE POSSIBILITY OF SUCH DAMAGE.
#
# $TAHI: ct/spec/RH_FromSourceNode.seq,v 1.19 2003/06/09 06:29:28 ozoe Exp $
#
######################################################################
BEGIN {
$V6evalTool::TestVersion = '$Name: REL_2_1_1 $';
}
use V6evalTool;
if ($V6evalTool::NutDef{Type} ne 'router') {
vLogHTML("This test is for the router only
");
exit $V6evalTool::exitRouterOnly;
}
%pktdesc = (
packet_to_link0 => 'Send Packet to Link0 (Host1 to Router1)',
packet_from_link1 => 'Recv Packet from Link1 (Router1 to Router2)',
packet_to_link1 => 'Send Packet to Link1 (Router2 to Router1)',
packet_from_link0 => 'Recv Packet from Link0 (Router1 to Host1)',
na_to_link0 => 'Send Neighbor Advertisement to Link0 (Global Address)',
na_to_link0_ll => 'Send Neighbor Advertisement to Link0 (Link Local Address)',
na_to_link1 => 'Send Neighbor Advertisement to Link1 (Global Address)',
na_to_link1_ll => 'Send Neighbor Advertisement to Link1 (Link Local Address)',
ns_from_link0 => 'Recv Neighbor Solicitation from Link0 (Global Address)',
ns_from_link0_ll => 'Recv Neighbor Solicitation from Link0 (Link Local Address)',
ns_from_link1 => 'Recv Neighbor Solicitation from Link1 (Global Address)',
ns_from_link1_ll => 'Recv Neighbor Solicitation from Link1 (Link Local Address)',
);
$IF0 = Link0;
$IF1 = Link1;
#----- start capturing
vCapture($IF0);
vCapture($IF1);
#======================================================================
vSend($IF0, packet_to_link0);
%ret = vRecv($IF1, 5, 0, 0, ns_from_link1, ns_from_link1_ll, packet_from_link1);
if ($ret{status} != 0) {
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
if ($ret{recvFrame} eq 'ns_from_link1') {
vSend($IF1, na_to_link1);
%ret = vRecv($IF1, 5, 0, 0, packet_from_link1);
if ($ret{status} != 0) {
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
}
if ($ret{recvFrame} eq 'ns_from_link1_ll') {
vSend($IF1, na_to_link1_ll);
%ret = vRecv($IF1, 5, 0, 0, packet_from_link1);
if ($ret{status} != 0) {
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
}
if ($ret{recvFrame} ne 'packet_from_link1') {
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
vSend($IF1, packet_to_link1);
%ret = vRecv($IF0, 5, 0, 0, ns_from_link0, ns_from_link0_ll, packet_from_link0);
if ($ret{status} != 0) {
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
if ($ret{recvFrame} eq 'ns_from_link0') {
vSend($IF0, na_to_link0);
%ret = vRecv($IF0, 5, 0, 0, packet_from_link0);
if ($ret{status} != 0) {
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
}
if ($ret{recvFrame} eq 'ns_from_link0_ll') {
vSend($IF0, na_to_link0_ll);
%ret = vRecv($IF0, 5, 0, 0, packet_from_link0);
if ($ret{status} != 0) {
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
}
if ($ret{recvFrame} ne 'packet_from_link0') {
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
vLogHTML('OK');
exit $V6evalTool::exitPass;
######################################################################
__END__
=head1 NAME
RH_FromSourceNode - check Routing Header Processing (from Source Node)
=head1 TARGET
Router
=head1 SYNOPSIS
=begin html
RH_FromSourceNode.seq [-tooloption ...] -pkt RH_FromSourceNode.def -tooloption : v6eval tool option See also RH.def=end html =head1 INITIALIZATION None =head1 TEST PROCEDURE Tester Target Tester (Link0) (Link1) | | | |-------------------------->| | | Packet to Link0 | | | | | | |-------------------------->| | | Neighbor Solicitation | | | | | |<--------------------------| | | Neighbor Advertisement | | | | | |-------------------------->| | | Packet from Link1 | | | | | | | | |<--------------------------| | | Packet to Link1 | | | | |<--------------------------| | | Neighbor Solicitation | | | | | |-------------------------->| | | Neighbor Advertisement | | | | | |<--------------------------| | | Packet from Link0 | | | | | v v v 1. Send Packet to Link0 2. Wait Packet from Link1 or NS from Link1 3. If NS received then send NA to Link1, and wait Packet form Link1 again 4. Receive Packet from Link1 5. Send Packet to Link1 6. Wait Packet from Link0 or NS from Link0 7. If NS received then send NA to Link0, and wait Packet form Link0 again 8. Receive Packet from Link0 Network topology (Link0) (Link1) Tester Target Tester Host1 ------ Router1 ------ Router2 ------ Router3 ------ Host2 Global 0 Global 1 Global 3 Global 5 Packet to Link0 is: IPv6 Header Version = 6 Traffic Class = 0 FlowLabel = 0 PayloadLength = 56 NextHeader = 43 (Routing Header) SourceAddress = Global 0 Address (Host1) DestinationAddress = Global 0 Address (Router1) Routing Header NextHeader = 59 (No Next Header) HeaderExtLength = 6 RoutingType = 0 SegmentsLeft = 3 Address[1] = Global 1 Address (Router2) Address[2] = Global 3 Address (Router3) Address[3] = Global 5 Address (Host2) Packet to Link1 is: IPv6 Header Version = 6 Traffic Class = 0 FlowLabel = 0 PayloadLength = 56 NextHeader = 43 (Routing Header) SourceAddress = Global 5 Address (Host2) DestinationAddress = Global 1 Address (Router1) Routing Header NextHeader = 59 (No Next Header) HeaderExtLength = 6 RoutingType = 0 SegmentsLeft = 1 Address[1] = Global 5 Address (Router3) Address[2] = Global 3 Address (Router2) Address[3] = Global 0 Address (Host1) Neighbor Solicitation packet's IP source Address selection may be: - Link Local Address - Global Address This test IS NOT the Neighbor Discovery test, so admit both implementation. =head1 JUDGMENT PASS: Packet from Link1 and Packet from Link0 Received Packet from Link1 is: IPv6 Header Version = 6 Traffic Class = 0 FlowLabel = 0 PayloadLength = 56 NextHeader = 43 (Routing Header) SourceAddress = Global 0 Address (Host1) DestinationAddress = Global 1 Address (Router2) <-+ | Routing Header | NextHeader = 59 (No Next Header) | (swapped) HeaderExtLength = 6 | RoutingType = 0 | SegmentsLeft = 2 (decremented) | Address[1] = Global 0 Address (Router1) <----+ Address[2] = Global 3 Address (Router3) Address[3] = Global 5 Address (Host2) Packet from Link0 is: IPv6 Header Version = 6 Traffic Class = 0 FlowLabel = 0 PayloadLength = 56 NextHeader = 43 (Routing Header) SourceAddress = Global 5 Address (Host2) DestinationAddress = Global 0 Address (Host1) <---+ | Routing Header | NextHeader = 59 (No Next Header) | (swapped) HeaderExtLength = 6 | RoutingType = 0 | SegmentsLeft = 0 (decremented) | Address[1] = Global 5 Address (Router3) | Address[2] = Global 3 Address (Router2) | Address[3] = Global 1 Address (Router1) <----+ =head1 REFERENCE RFC2460 4.4 Routing Header =begin html
The Routing header is used by an IPv6 source to list one or more intermediate nodes to be "visited" on the way to a packet's destination. This function is very similar to IPv4's Loose Source and Record Route option. The Routing header is identified by a Next Header value of 43 in the immediately preceding header, and has the following format:=end html +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Next Header | Hdr Ext Len | Routing Type | Segments Left | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | . . . type-specific data . . . | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Next Header 8-bit selector. Identifies the type of header immediately following the Routing header. Uses the same values as the IPv4 Protocol field [RFC-1700 et seq.]. Hdr Ext Len 8-bit unsigned integer. Length of the Routing header in 8-octet units, not including the first 8 octets. Routing Type 8-bit identifier of a particular Routing header variant. Segments Left 8-bit unsigned integer. Number of route segments remaining, i.e., number of explicitly listed intermediate nodes still to be visited before reaching the final destination. type-specific data Variable-length field, of format determined by the Routing Type, and of length such that the complete Routing header is an integer multiple of 8 octets long. If, while processing a received packet, a node encounters a Routing header with an unrecognized Routing Type value, the required behavior of the node depends on the value of the Segments Left field, as follows: If Segments Left is zero, the node must ignore the Routing header and proceed to process the next header in the packet, whose type is identified by the Next Header field in the Routing header. If Segments Left is non-zero, the node must discard the packet and send an ICMP Parameter Problem, Code 0, message to the packet's Source Address, pointing to the unrecognized Routing Type. If, after processing a Routing header of a received packet, an intermediate node determines that the packet is to be forwarded onto a link whose link MTU is less than the size of the packet, the node must discard the packet and send an ICMP Packet Too Big message to the packet's Source Address. =begin html
The Type 0 Routing header has the following format:=end html +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Next Header | Hdr Ext Len | Routing Type=0| Segments Left | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + Address[1] + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + Address[2] + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ . . . . . . . . . +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + Address[n] + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Next Header 8-bit selector. Identifies the type of header immediately following the Routing header. Uses the same values as the IPv4 Protocol field [RFC-1700 et seq.]. Hdr Ext Len 8-bit unsigned integer. Length of the Routing header in 8-octet units, not including the first 8 octets. For the Type 0 Routing header, Hdr Ext Len is equal to two times the number of addresses in the header. Routing Type 0. Segments Left 8-bit unsigned integer. Number of route segments remaining, i.e., number of explicitly listed intermediate nodes still to be visited before reaching the final destination. Reserved 32-bit reserved field. Initialized to zero for transmission; ignored on reception. Address[1..n] Vector of 128-bit addresses, numbered 1 to n. Multicast addresses must not appear in a Routing header of Type 0, or in the IPv6 Destination Address field of a packet carrying a Routing header of Type 0. =begin html
A Routing header is not examined or processed until it reaches the node identified in the Destination Address field of the IPv6 header. In that node, dispatching on the Next Header field of the immediately preceding header causes the Routing header module to be invoked, which, in the case of Routing Type 0, performs the following algorithm:=end html if Segments Left = 0 { proceed to process the next header in the packet, whose type is identified by the Next Header field in the Routing header } else if Hdr Ext Len is odd { send an ICMP Parameter Problem, Code 0, message to the Source Address, pointing to the Hdr Ext Len field, and discard the packet } else { compute n, the number of addresses in the Routing header, by dividing Hdr Ext Len by 2 if Segments Left is greater than n { send an ICMP Parameter Problem, Code 0, message to the Source Address, pointing to the Segments Left field, and discard the packet } else { decrement Segments Left by 1; compute i, the index of the next address to be visited in the address vector, by subtracting Segments Left from n if Address [i] or the IPv6 Destination Address is multicast { discard the packet } else { swap the IPv6 Destination Address and Address[i] if the IPv6 Hop Limit is less than or equal to 1 { send an ICMP Time Exceeded -- Hop Limit Exceeded in Transit message to the Source Address and discard the packet } else { decrement the Hop Limit by 1 resubmit the packet to the IPv6 module for transmission to the new destination } } } } =head1 SEE ALSO perldoc V6evalTool =cut