#!/usr/bin/perl
#
# $Copyright_v6PC$
#
# $Copyright$
#
# $TAHI: ct/spec/FH_2ndOnly.seq,v 1.23 2004/04/02 03:47:50 kenta Exp $
#
######################################################################
BEGIN {
	$V6evalTool::TestVersion = '$Name:  $';
}

use V6evalTool;

%pktdesc = (
	echo_request		=> 'Send Echo Request (Preparation)',
	echo_reply		=> 'Recv Echo Reply',
	ns			=> 'Recv Neighbor Solicitation',
	na			=> 'Send Neighbor Advertisement',
	echo_request_2nd	=> 'Send Echo Request (2nd fragment only)',
	unicast_ns		=> 'Recv Unicast Neighbor Solicitation',
	unicast_ns_wsll		=> 'Recv Unicast Neighbor Solicitation (without SLL)',
);

%nd = (
	'ns'            => 'Recv Neighbor Solicitation',
	'unicast_ns'    => 'Recv Unicast Neighbor Solicitation',
	'unicast_ns_wsll'=> 'Recv Unicast Neighbor Solicitation (without SLL)',
);

$loop_count = 65;

$IF = Link0;

vCapture($IF);

#----- preparation

vLogHTML('<B>Begin Preparation</B>');

vSend($IF, echo_request);

%ret = vRecv($IF, 5, 0, 0, ns, echo_reply);
if ($ret{status} != 0) {
	vLogHTML('<FONT COLOR="#FF0000">NG</FONT>');
	exit $V6evalTool::exitFail;
}
if ($ret{recvFrame} eq 'ns') {
	vSend($IF, na);
	%ret = vRecv($IF, 5, 0, 0, echo_reply);
	if ($ret{status} != 0) {
		vLogHTML('<FONT COLOR="#FF0000">NG</FONT>');
		exit $V6evalTool::exitFail;
	}
}
if ($ret{recvFrame} ne 'echo_reply') {
	vLogHTML('<FONT COLOR="#FF0000">NG</FONT>');
	exit $V6evalTool::exitFail;
}

vLogHTML('<B>End Preparation</B>');

#----- main test

vClear($IF);

vSend($IF, echo_request_2nd);

# timeout
for($i=0; $i< $loop_count; $i ++){
	%ret = vRecv($IF, 1, 0, 0, sort(keys(%nd)));
	$count = $ret{'recvCount'};
	while(($recv, $send) = each(%nd)){
		if ($ret{recvFrame} eq $recv) {
			vSend($IF, na);
			$i --;
			$count --;
			last;
		}
	}
	if($count){
		vLogHTML('<FONT COLOR="#FF0000">NG</FONT>');
		exit $V6evalTool::exitFail;
	}
}

if(!$count){
	vLogHTML('OK');
	exit $V6evalTool::exitPass;
}

vLogHTML('<FONT COLOR="#FF0000">NG</FONT>');
exit $V6evalTool::exitFail;

######################################################################
__END__

=head1 NAME

  FH_2ndOnly - check Fragment Reassembly (2nd fragment only)

=head1 TARGET

  Host and Router

=head1 SYNOPSIS

=begin html
<PRE>
  <A HREF="./FH_2ndOnly.seq">FH_2ndOnly.seq</A> [-tooloption ...] -pkt <A HREF="./Fragment.def">Fragment.def</A>
    -tooloption : v6eval tool option
</PRE>

=end html

=head1 INITIALIZATION

  1. Ping to Target (create Neighbor Cache Entries, if not exist)
  2. Override Neighbor Cache Entries

=head1 TEST PROCEDURE

  Tester                      Target
    |                           |
    |-------------------------->|
    |   Echo Request (2nd)      |
    |                           |
    |                           |
    | (<----------------------) |
    |   No Packet               |
    |                           |
    |                           |
    v                           v


  1. Send Echo Request (2nd fragment)
  2. No Packet from Target

  Echo Request Data (original) is:

        IPv6 Header
            Version            = 6
            Traffic Class      = 0
            FlowLabel          = 0
            PayloadLength      = 1032
            NextHeader         = 58 (ICMP)
            SourceAddress      = Tester Link Local Address
            DestinationAddress = Target Link Local Address

        ICMP Echo Request
            Type           = 128 (Echo Request)
            Code           = 0
            Checksum       = (auto)
            Identifier     = (auto)
            SequenceNumber = 0
            PayloadData    = data repeat{0x1, 512}
                             data repeat{0x2, 512}

  Echo Request Data (2nd fragment) is:

        IPv6 Header
            Version            = 6
            Traffic Class      = 0
            FlowLabel          = 0
            PayloadLength      = 520
            NextHeader         = 44 (Fragment Header)
            SourceAddress      = Tester Link Local Address
            DestinationAddress = Target Link Local Address

        Fragment Header
            NextHeader         = 58 (ICMP)
            FragmentOffset     = 65
            MFlag              = 0
            Identification     = 32bit (Automatic generation)

        Payload
            data               = 512 octets from the back of ICMP Echo request

=head1 JUDGMENT

  PASS: No packet from Target
        Sent packet is discarded

=head1 REFERENCE

RFC2460

4.5  Fragment Header

                        :

   The following error conditions may arise when reassembling fragmented
   packets:

=begin html
<PRE>
      <B>If insufficient fragments are received to complete reassembly of a
      packet within 60 seconds of the reception of the first-arriving
      fragment of that packet, reassembly of that packet must be
      abandoned and all the fragments that have been received for that
      packet must be discarded.</B>  If the first fragment (i.e., the one
      with a Fragment Offset of zero) has been received, an ICMP Time
      Exceeded -- Fragment Reassembly Time Exceeded message should be
      sent to the source of that fragment.
</PRE>

=end html

=head1 SEE ALSO

  perldoc V6evalTool

=cut

