#!/usr/bin/perl
#
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation.
# 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.
# 
# 5. The copyrighters, the project and the contributors may prohibit
#    the use of this software at any time.
# 
# 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.
#
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation.
# 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.
# 
# 5. The copyrighters, the project and the contributors may prohibit
#    the use of this software at any time.
# 
# 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/icmp/Time_Exc_Link-Local.seq,v 1.5 2004/08/19 09:04:33 akisada Exp $
#----------------------------------------------------------------------

BEGIN { $V6evalTool::TestVersion = '$Name: V6PC_P1_1_3_3 $'; }
use V6evalTool;
use icmp;

$IF = Link0;

#----------------------------------------------------------------------
# Initialization
#----------------------------------------------------------------------

vLogHTML("<FONT SIZE=\"+1\">Initialization</FONT><BR>");

vCapture($IF);

$ret = mkNCE_Link();

if ($ret != 0) {
	vLog("*** NUT can not be initialized !! ***");
	exit($V6evalTool::exitFail);
}
else {
	vLog("TN created the entry of TN's link-local address to Neighbor cache of NUT.");
};

#----------------------------------------------------------------------
# Check fragment reassembly.
#----------------------------------------------------------------------
%pktdesc = (
    echo_request_1st_link_local	=> 'Send 1st Fragmented Echo Request (Link-local address)',
    echo_request_2nd_link_local	=> 'Send 2nd Fragmented Echo Request (Link-local address)',
    echo_reply_link_local_1024	=> 'Receive Echo Reply (Link-local address)',
    echo_request_1st		=> 'Send 1st Fragmented Echo Request (Link-local address)',
    time_exceeded		=> 'Receive Time Exceeded (fragment reassembly)',
    ns_local			=> 'Receive Neighbor Solicitation',
    ns_local_sll		=> 'Receive Neighbor Solicitation',
    na_local			=> 'Send Neighbor Advertisement'
);

vLogHTML('<B>Begin check fragment reassembly</B>');

vSend($IF, echo_request_1st_link_local);
vSend($IF, echo_request_2nd_link_local);

#%ret = vRecv($IF, 5, 0, 0, echo_reply_link_local_1024);
%ret = icmp_vRecv($IF, 5, 0, 0, echo_reply_link_local_1024);
if ($ret{status} == 0 && $ret{recvFrame} eq 'echo_reply_link_local_1024') {
	vLogHTML('OK<BR>');
}
else {
	vLogHTML('Not replied.');
	goto error;
};
vLogHTML('<B>End check</B><P>');

#----------------------------------------------------------------------
# Test
#----------------------------------------------------------------------

vLogHTML("<FONT SIZE=\"+1\">Test</FONT><BR>");

vSend($IF, echo_request_1st);

#%ret = vRecv($IF, 65, 0, 0, time_exceeded, ns_local, ns_local_sll);
%ret = icmp_vRecv($IF, 65, 0, 0, time_exceeded);

if ($ret{status} != 0) {
	vLog("TN can not receive ICMPv6 error message from NUT");
	goto error;
}
elsif ($ret{recvFrame} eq 'time_exceeded') {
	vLog("TN can receive ICMPv6 Time Exceeded message from NUT");
	vLog("OK");
	exit($V6evalTool::exitPass);
}
elsif ($ret{recvFrame} eq 'ns_local' || $ret{recvFrame} eq 'ns_local_sll') {
	vSend($IF, na_local);

	%ret = vRecv($IF, 65, 0, 0, time_exceeded);
	if ($ret{recvFrame} eq 'time_exceeded') {
		vLog("TN can receive ICMPv6 Time Exceeded message from NUT");
		vLog("OK");
		exit($V6evalTool::exitPass);
	}
	else {
		vLog("TN can not receive ICMPv6 error message from NUT");
		goto error;
	}
}
else {
	vLog("TN receive unexpected packets from NUT");
	goto error;
};

error:

vLog("FAIL");
exit($V6evalTool::exitFail);


#----------------------------------------------------------------------

__END__

=head1 NAME

	Time_Exc_Link-Local.seq - check Time Exceeded 1 (link local address)

=head1 TARGET

	Host/Router

=head1 SYNOPSIS

	Time_Exc_Link-Local.seq [-tooloption ...] -p Time_Exc_Link-Local.def

=head1 INITIALIZATION

	Before starting test, check NUT's fragment reassembly function.
	When test starts, states of Neighbor Cache Entry for TN's 
	addresses are reachable.

=head1 TEST PROCEDURE

	This test verifies that NUT sends valid ICMPv6 Time Exceeded (code 1)
	in response to a packet which can not be reassemble.
	And this test verifies that the message processing rule ,
	
    (a) If the message is a response to a message sent to one of the
        node's unicast addresses, the Source Address of the reply must
        be that same address.


	TN			NUT

	---------------------------

	1.
	 === fragmented (1st) packet  ===>
		src address : TN link local address
		dst address : NUT link local address
             
	2.
	<< JUDGEMENT >>

	 <=== ICMPv6  Time Exceeded ===
		src address : NUT link local address
		dst address : TN link local address
			Code is 1

=head1 JUDGEMENT

	<< PASS >>
		NUT send ICMPv6 Time Exceeded.
		

	<< FAIL >>	
		NUT do not send ICMPv6 Time Exceeded.

=head1 REFERENCE

RFC2463
3.3 Time Exceeded Message

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |     Type      |     Code      |          Checksum             |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                             Unused                            |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                    As much of invoking packet                 |
      +               as will fit without the ICMPv6 packet           +
      |               exceeding the minimum IPv6 MTU [IPv6]           |

   IPv6 Fields:

=begin html
<pre>
   <b>Destination Address</b>
                  <b>Copied from the Source Address field of the invoking
                  packet.</b>
</pre>

=end html

   ICMPv6 Fields:

=begin html
<pre>
   <b>Type           3</b>
</pre>

=end html

=begin html
<pre>
   <b>Code</b>           0 - hop limit exceeded in transit<br>
                  <b>1 - fragment reassembly time exceeded</b>
</pre>

=end html

   Unused         This field is unused for all code values.
                  It must be initialized to zero by the sender
                  and ignored by the receiver.

   Description

   If a router receives a packet with a Hop Limit of zero, or a router
   decrements a packet's Hop Limit to zero, it MUST discard the packet
   and send an ICMPv6 Time Exceeded message with Code 0 to the source of
   the packet.  This indicates either a routing loop or too small an
   initial Hop Limit value.

   The rules for selecting the Source Address of this message are
   defined in section 2.2.


=head1 SEE ALSO

	  perldoc V6evalTool

=cut
