#!/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/To_Multi_Time_Exc.seq,v 1.6 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 !! ***");
	goto error;
}
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 (Multicast 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. Skip this test.');
	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);
%ret = icmp_vRecv($IF, 65, 0, 0, time_exceeded);

if ($ret{status} != 0) {
	vLog("TN do not receive ICMPv6 error message from NUT");
	vLog("OK");
	exit($V6evalTool::exitPass);
}
elsif ($ret{recvFrame} eq 'time_exceeded') {
	vLog("TN receive ICMPv6 error message from NUT");
	goto error;
}
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

	To_Multi_Time_Exc.seq - check Message Processing Rules (ICMPv6
	Time Exceeded, link local address)

=head1 TARGET

	Host/Router

=head1 SYNOPSIS

	To_Multi_Time_Exc.seq [-tooloption ...] -p To_Multi_Time_Exc.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 the message processing rule,
	
	An ICMPv6 error message MUST NOT be sent as a result of
	receiving:

	a packet destined to an IPv6 multicast address (there are
	two exceptions to this rule: (1) the Packet Too Big
	Message - Section 3.2 - to allow Path MTU discovery to
	work for IPv6 multicast, and (2) the Parameter Problem
	Message, Code 2 - Section 3.4 - reporting an unrecognized
	IPv6 option that has the Option Type highest-order two
	bits set to 10).


	TN			NUT

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

	1.
	 === fragmented (1st) packet  ===>
		src address : TN link local address
		dst address : all node multi cast address
             
	2.
	<< JUDGEMENT >>

	 <=== No packet  ===
			or
	 <=== ICMPv6  Time Exceeded ===
             Code is 1

=head1 JUDGEMENT

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

	<< FAIL >>	
		NUT send ICMPv6 Time Exceeded.

=head1  REFERENCE

RFC2463
2.4 Message Processing Rules

   Implementations MUST observe the following rules when processing
   ICMPv6 messages (from [RFC-1122]):

=begin html
<pre>
    <b>(e) An ICMPv6 error message MUST NOT be sent as a result of
        receiving:</b><br>
         (e.1) an ICMPv6 error message, or<br>
         <b>(e.2) a packet destined to an IPv6 multicast address (there are
               two exceptions to this rule: (1) the Packet Too Big
               Message - Section 3.2 - to allow Path MTU discovery to
               work for IPv6 multicast, and (2) the Parameter Problem
               Message, Code 2 - Section 3.4 - reporting an unrecognized
               IPv6 option that has the Option Type highest-order two
               bits set to 10)</b>, or<br>
         (e.3) a packet sent as a link-layer multicast, (the exception
               from e.2 applies to this case too), or<br>
         (e.4) a packet sent as a link-layer broadcast, (the exception
               from e.2 applies to this case too), or<br>
         (e.5) a packet whose source address does not uniquely identify
               a single node -- e.g., the IPv6 Unspecified Address, an
               IPv6 multicast address, or an address known by the ICMP
               message sender to be an IPv6 anycast address.
</pre>

=end html

=head1 SEE ALSO

	  perldoc V6evalTool

=cut
