#!/usr/bin/perl
#
# $Copyright$
#
# $TAHI: ct/icmp/Echo_Checksum.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);

#----------------------------------------------------------------------
# This part is just for comparison 
#----------------------------------------------------------------------

vLogHTML("<B>This is very tricky, but send echo-reply (src = NUT/dst = TN) ".
	 "to get valid checksum value.</B><BR>");

%ret1 = vSend($IF,echo_reply_link_local);

$Valid_Checksum = $ret1{"Frame_Ether.Packet_IPv6.ICMPv6_EchoReply.Checksum"};

vClear($IF);

#----------------------------------------------------------------------
# Test
#----------------------------------------------------------------------
%pktdesc = (
	ns_local	=> 'Receive Neighbor Solicitation',
	ns_local_sll	=> 'Receive Neighbor Solicitation',
	na_local	=> 'Send Neighbor Advertisement',
	echo_request	=> 'Send Echo Request (Link-local address)',
	echo_reply	=> 'Receive Echo Reply (Link-local address)'
);

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

vSend($IF, echo_request);

#%ret = vRecv($IF, 5, 0, 0, echo_reply, ns_local, ns_local_sll);
%ret = icmp_vRecv($IF, 5, 0, 0, echo_reply);

if ($ret{status} != 0) {
	vLog("TN can not receive Echo Reply from NUT.");
	goto error;
}
elsif ($ret{recvFrame} eq 'echo_reply') {
	if ($ret{"Frame_Ether.Packet_IPv6.ICMPv6_EchoReply.Checksum"} eq
	    $Valid_Checksum) {
		vLog("Checksum value included in NUT's sending packet is valid");
		vLog("OK");
		exit($V6evalTool::exitPass);
	}
	else {
		vLog("Checksum value included in NUT's sending packet is invalid");
		goto error;
	};
}
elsif ($ret{recvFrame} eq 'ns_local' || $ret{recvFrame} eq 'ns_local_sll') {
	vSend($IF, na_local);
	%ret = vRecv($IF, 5, 0, 0, echo_reply);

	if ($ret{status} != 0) {
		vLog("TN can not receive Echo Reply from NUT");
	}
	elsif ($ret{recvFrame} eq 'echo_reply') {
		if ($ret{"Frame_Ether.Packet_IPv6.ICMPv6_EchoReply.Checksum"} eq
		    $Valid_Checksum) {
			vLog("Checksum value included in NUT's sending packet is valid");
			vLog("OK");
			exit($V6evalTool::exitPass);
		}
		else {
			vLog("Checksum value included in NUT's sending packet is invalid");
			goto error;
		};
	}
	else {
		vLog("TN received an expected packet from NUT");
	};

	goto error;
}
else {
	vLog("TN receive unexpected packets from NUT.");
	goto error;
};
	
error:

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


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

__END__

=head1 NAME

	Echo_Checksum.seq - check that sending and receiving Echo Request 
			    and Echo Reply (checksum)

=head1 TARGET

	Host/Router

=head1 SYNOPSIS

	Echo_Checksum.seq [-tooloption ...] -p Echo_Checksum.def

=head1 INITIALIZATION

	None

=head1 TEST PROCEDURE

	This test verifies that NUT receives valid ICMPv6 Echo Request 
	and sent ICMPv6 Echo Reply. 
	

	TN			NUT

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

	1.
	 === ICMPv6 Echo Request ===>
			src address : TN link local address
			dst address : NUT link local address        
	2.
	<< JUDGMENT >>

	 <=== ICMPv6 Echo Reply ===
			src address : NUT link local address
			dst address : TN link local address        
          

=head1 JUDGMENT

	<< PASS >>
		Check Sum which is in a received packet is valid
		

	<< FAIL >>	
		Check Sum which is in a received packet is invalid

=head1 REFERENCE

RFC2463
2.3 Message Checksum Calculation

   The checksum is the 16-bit one's complement of the one's complement
   sum of the entire ICMPv6 message starting with the ICMPv6 message
   type field, prepended with a "pseudo-header" of IPv6 header fields,
   as specified in [IPv6, section 8.1].  The Next Header value used in
   the pseudo-header is 58.  (NOTE: the inclusion of a pseudo-header in
   the ICMPv6 checksum is a change from IPv4; see [IPv6] for the
   rationale for this change.)

   For computing the checksum, the checksum field is set to zero.

=head1 SEE ALSO

	  perldoc V6evalTool

=cut
