#!/usr/bin/perl
#
# $Copyright$
#
# $TAHI: ct/icmp/Err_Msg_Size_Time_Exc.seq,v 1.3 2003/10/15 08:06:31 masaxmasa Exp $
#----------------------------------------------------------------------

BEGIN { $V6evalTool::TestVersion = '$Name:  $'; }
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 (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

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

=head1 TARGET

	Host/Router

=head1 SYNOPSIS

	Err_Msg_Size_Time_Exc.seq [-tooloption ...] -p Err_Msg_Size_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 ,
	
	Every ICMPv6 error message (type < 128) includes as much of the
	IPv6 offending (invoking) packet (the packet that caused the
	error) as will fit without making the error message packet
	exceed the minimum IPv6 MTU [IPv6].


	TN			NUT

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

	1.
	 === fragmented (1st) packet  ===>
			packet size is 1280 octets
             
	2.
	<< JUDGMENT >>

	 <=== ICMPv6  Time Exceeded ===
		Code is 1
			packet size is 1280 octets

=head1 JUDGMENT

	<< PASS >>
		NUT send ICMPv6 Time Exceeded.
		

	<< FAIL >>	
		NUT do not 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>(c) Every ICMPv6 error message (type < 128) includes as much of the
        IPv6 offending (invoking) packet (the packet that caused the
        error) as will fit without making the error message packet
        exceed the minimum IPv6 MTU [IPv6].</b>
</pre>

=end html

=head1 SEE ALSO

	  perldoc V6evalTool

=cut
