#!/usr/bin/perl # # $Name: V6LC_4_0_5 $ # # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # 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. # # $Id: F_Stub.seq,v 1.7 2008/07/31 02:40:32 hide Exp $ # ###################################################################### BEGIN { $V6evalTool::TestVersion = '$Name: V6LC_4_0_5 $'; } use V6evalTool; use CommonSPEC; $discard_te = $CommonSPEC::exceed_max; $pktdesc{'echo_request_all'} = 'Send Echo Request (Offset 0, MFlag 0)'; $pktdesc{'echo_reply'} = 'Recv Echo Reply'; $endStatus = $V6evalTool::exitPass; #----- create Fragment ID $id = time & 0x00000fff; $fid = sprintf("0x0%07x", $id); $rid = sprintf("0x0%03x", $id); $sno = 0; vCPP("-DFRAG_ID=$fid -DREQ_ID=$rid -DSEQ_NO=$sno"); ################################################################ $IF = 'Link0'; vCapture($IF); #----- test vSend($IF, 'echo_request_all'); %ret = nd_vRecv_EN($IF, $CommonSPEC::wait_reply, 0, 0, 'echo_reply'); if ($ret{'status'} == 0) { vLogHTML('OK
'); } else { vLogHTML('Cannot receive Echo Reply
'); vLogHTML('NG
'); vSleep($discard_te, "Discard Unexpected 'ICMP Time Exceeded' message ($discard_te sec)"); $endStatus = $V6evalTool::exitFail; } #----- end test $ret = cleanup($IF); vStop($IF); if ($ret == $CommonSPEC::Success) { exit($endStatus); } else { exit($V6evalTool::exitFatal); } ###################################################################### __END__ =head1 NAME F_Stub - Stub Fragment Header =head1 TARGET Host and Router =head1 SYNOPSIS =begin html
  F_Stub.seq [-tooloption ...] -pkt F_Stub.def
    -tooloption : v6eval tool option
=end html =head1 INITIALIZATION None =head1 TEST PROCEDURE Verify that a node accepts the offset zero fragment with the More Fragments flag clear. TN NUT | | |-------------------------->| | Echo Request | | | | | |<--------------------------| | Echo Reply | | | | | v v 1. TN transmits an Echo Request that hs a Fragment header with a Fragment Offset of 0 and the More Fragments flag clear. 2. Observe the packets transmitted by the NUT. Echo Request Data (original) is: IPv6 Header Version = 6 Traffic Class = 0 FlowLabel = 0 PayloadLength = 15 NextHeader = 58 (ICMPv6) SourceAddress = TN Link Local Address DestinationAddress = NUT Link Local Address ICMP Echo Request Type = 128 (Echo Request) Code = 0 Checksum = (auto) Identifier = (auto) SequenceNumber = 0 PayloadData = {0, 1, 2, 3, 4, 5, 6, 7} Echo Request Data (Offset 0, MFlag 0) is: IPv6 Header Version = 6 Traffic Class = 0 FlowLabel = 0 PayloadLength = 24 NextHeader = 44 (Fragment Header) SourceAddress = TN Link Local Address DestinationAddress = NUT Link Local Address Fragment Header NextHeader = 58 (ICMPv6) FragmentOffset = 0 MFlag = 0 Identification = 32bit (Automatic generation) Payload data = 16 octets from the head of ICMP Echo request =head1 JUDGEMENT PASS: The NUT must transmit an Echo Reply to TN1. The Echo Reply must not include a Fragment header. IPv6 Header Version = 6 Traffic Class = 0 FlowLabel = 0 PayloadLength = 16 NextHeader = 58 (ICMPv6) SourceAddress = NUT Link Local Address Destination Address = TN Link Local Address ICMP Echo Reply Type = 129 (Echo Reply) Code = 0 Checksum = (auto) Identifier = (same as Echo Request) SequenceNumber = (same as Echo Request) PayloadData = (same as Echo Request) =head1 CLEANUP Common Test Cleanup =cut # =head1 REFERENCE # # RFC2460 # # 4.5 Fragment Header # # Each fragment packet is composed of: # # (1) The Unfragmentable Part of the original packet, with the # Payload Length of the original IPv6 header changed to contain # the length of this fragment packet only (excluding the length # of the IPv6 header itself), and the Next Header field of the # last header of the Unfragmentable Part changed to 44. # # =begin html #
#       (2) A Fragment header containing:
# 
# The Next Header value that identifies the first header of # the Fragmentable Part of the original packet. #
# A Fragment Offset containing the offset of the fragment, # in 8-octet units, relative to the start of the # Fragmentable Part of the original packet. The Fragment # Offset of the first ("leftmost") fragment is 0. #
# An M flag value of 0 if the fragment is the last # ("rightmost") one, else an M flag value of 1. #
# The Identification value generated for the original # packet.
#
# # =end html # # (3) The fragment itself. # # The lengths of the fragments must be chosen such that the resulting # fragment packets fit within the MTU of the path to the packets' # destination(s). # # At the destination, fragment packets are reassembled into their # original, unfragmented form, as illustrated: # # reassembled original packet: # # +------------------+----------------------//------------------------+ # | Unfragmentable | 2-bit reserved fFragmentablealized to zero for | # | Part | transmission; ignorePart | # +------------------+----------------------//------------------------+ # # The following rules govern reassembly: # # An original packet is reassembled only from fragment packets that # have the same Source Address, Destination Address, and Fragment # Identification. # # The Unfragmentable Part of the reassembled packet consists of all # headers up to, but not including, the Fragment header of the first # fragment packet (that is, the packet whose Fragment Offset is # zero), with the following two changes: # # The Next Header field of the last header of the Unfragmentable # Part is obtained from the Next Header field of the first # fragment's Fragment header. # # The Payload Length of the reassembled packet is computed from # the length of the Unfragmentable Part and the length and offset # of the last fragment. For example, a formula for computing the # Payload Length of the reassembled original packet is: # # PL.orig = PL.first - FL.first - 8 + (8 * FO.last) + FL.last # # where # PL.orig = Payload Length field of reassembled packet. # PL.first = Payload Length field of first fragment packet. # FL.first = length of fragment following Fragment header of # first fragment packet. # FO.last = Fragment Offset field of Fragment header of # last fragment packet. # FL.last = length of fragment following Fragment header of # last fragment packet. # # The Fragmentable Part of the reassembled packet is constructed # from the fragments following the Fragment headers in each of the # fragment packets. The length of each fragment is computed by # subtracting from the packet's Payload Length the length of the # headers between the IPv6 header and fragment itself; its relative # position in Fragmentable Part is computed from its Fragment Offset # value. # # The Fragment header is not present in the final, reassembled # packet. # =pod =head1 REFERENCE =begin html
RFC 2460 - IPv6 Specification
=end html =head1 SEE ALSO perldoc V6evalTool =cut