#!/usr/bin/perl # # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 # 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.p2/Time_Exc_1.seq,v 1.7 2006/02/02 02:32:18 akisada Exp $ #---------------------------------------------------------------------- BEGIN { $V6evalTool::TestVersion = '$Name: V6LC_P2_1_4_6 $'; } use V6evalTool; use icmp; use lib '../'; use AdvancedFunctionality; sub cleanup_tunnel(); $IF = Link0; checkNUT(router); %pktdesc = ( echo_request_hop1 => 'Send Echo Request (HopLimit = 1)', time_exceeded1 => 'Receive Time Exceeded (hop limit exceeded)', ); #---------------------------------------------------------------------- # Initialization #---------------------------------------------------------------------- vLogHTML("Initialization
"); vCapture($IF); $ret = setup(); if ($ret == $icmp::subFail){ goto error; } unless($AdvancedFunctionality::HAS_MULTIPLE_INTERFACES) { my $srcaddr = vMAC2LLAddr($V6evalTool::NutDef{'Link0_addr'}); $srcaddr =~ s/fe80::/3ffe:501:ffff:100:/; my $dstaddr = vMAC2LLAddr($V6evalTool::TnDef{'Link0_addr'}); $dstaddr =~ s/fe80::/3ffe:501:ffff:110:/; my $insrcaddr = vMAC2LLAddr($V6evalTool::TnDef{'Link0_addr'}); $insrcaddr =~ s/fe80::/3ffe:501:ffff:100:/; my $indstaddr = vMAC2LLAddr($V6evalTool::TnDef{'Link0_addr'}); $indstaddr =~ s/fe80::/3ffe:501:ffff:101:/; my $gateway = vMAC2LLAddr($V6evalTool::TnDef{'Link0_addr'}); my $Link0_device = $V6evalTool::NutDef{'Link0_device'}; # if(vRemote('route.rmt', 'cmd=add', # "prefix=3ffe:501:ffff:110::", 'prefixlen=64', # "gateway=$gateway", "if=$Link0_device")) { # # vLogHTML('route.rmt: '. # 'Can\'t configure the route.
'); # # exit($V6evalTool::exitFatal); # } if(vRemote('tunnel.rmt', 'if=0 '. 'prefixlen=64 '. 'routeprefixlen=64 '. 'addrfamily=inet6 '. "prefix=3ffe:501:ffff:101:: ". "srcaddr=$srcaddr ". "dstaddr=$dstaddr ". "insrcaddr=$insrcaddr ". "indstaddr=$indstaddr ")) { vLogHTML('tunnel.rmt: '. 'Can\'t configure the tunnel.
'); exit($V6evalTool::exitFatal); } } #---------------------------------------------------------------------- # Check. #---------------------------------------------------------------------- #---------------------------------------------------------------------- # Test #---------------------------------------------------------------------- vLogHTML("Test
"); #--- # verify handling packets with hoplimit = 1 #--- vSend($IF, echo_request_hop1); #%ret = vRecv($IF, $icmp::wait_reply, 0, 0, time_exceeded1, ns_global, ns_global_sll); %ret = icmp_vRecv($IF, $icmp::wait_reply, 0, 0, time_exceeded1); if ($ret{status} != 0) { vLogHTML('TN can not receive ICMPv6 error message from NUT
'); goto error; } elsif ($ret{recvFrame} eq 'time_exceeded1') { vLog("TN can receive ICMPv6 Time Exceeded message from NUT"); vLog("OK"); cleanup(); unless($AdvancedFunctionality::HAS_MULTIPLE_INTERFACES) { cleanup_tunnel(); } vStop($IF); exit($V6evalTool::exitPass); } else { vLogHTML('TN receive unexpected packets from NUT
'); goto error; } error: vLogHTML('FAIL
'); cleanup(); unless($AdvancedFunctionality::HAS_MULTIPLE_INTERFACES) { cleanup_tunnel(); } vStop($IF); exit($V6evalTool::exitFail); #----------------------------------------------------------------------# sub cleanup_tunnel() { my $srcaddr = vMAC2LLAddr($V6evalTool::NutDef{'Link0_addr'}); $srcaddr =~ s/fe80::/3ffe:501:ffff:100:/; my $dstaddr = vMAC2LLAddr($V6evalTool::NutDef{'Link0_addr'}); $dstaddr =~ s/fe80::/3ffe:501:ffff:110:/; my $insrcaddr = vMAC2LLAddr($V6evalTool::TnDef{'Link0_addr'}); $insrcaddr =~ s/fe80::/3ffe:501:ffff:100:/; my $indstaddr = vMAC2LLAddr($V6evalTool::TnDef{'Link0_addr'}); $indstaddr =~ s/fe80::/3ffe:501:ffff:101:/; my $gateway = vMAC2LLAddr($V6evalTool::TnDef{'Link0_addr'}); my $Link0_device = $V6evalTool::NutDef{'Link0_device'}; # if(vRemote('route.rmt', 'cmd=delete', # "prefix=3ffe:501:ffff:110::", 'prefixlen=64', # "gateway=$gateway", "if=$Link0_device")) { # # vLogHTML('route.rmt: '. # 'Can\'t configure the route.
'); # # exit($V6evalTool::exitFatal); # } if(vRemote('tunnel.rmt', 'if=0 '. 'deletetunnel '. 'prefixlen=64 '. 'routeprefixlen=64 '. 'addrfamily=inet6 '. "prefix=3ffe:501:ffff:101:: ". "srcaddr=$srcaddr ". "dstaddr=$dstaddr ". "insrcaddr=$insrcaddr ". "indstaddr=$indstaddr ")) { vLogHTML('tunnel.rmt: '. 'Can\'t configure the tunnel.
'); exit($V6evalTool::exitFatal); } return($ret); } #---------------------------------------------------------------------- __END__ =head1 NAME Time_Exc_1.seq - check Time Exceeded 1 =head1 TARGET Router =head1 SYNOPSIS Time_Exc_1.seq [-tooloption ...] -p Time_Exc.def =head1 INITIALIZATION When test starts, configure a default route with TN as the next hop. And states of Neighbor Cache Entry for TN's addresses are reachable. =head1 TEST PROCEDURE This test verifies that NUT sends valid ICMPv6 Time Exceeded (code 0) in response to a packet which can not be forwarded. And this test verifies that the message processing rule, - If the message is a response to a message sent to one of the node's unicast addresses, the Source Address of the reply must be that same address. - If the message is a response to a message sent to an address that does not belong to the node, the Source Address should be that unicast address belonging to the node that will be most helpful in diagnosing the error. For example, if the message is a response to a packet forwarding action that cannot complete successfully, the Source Address should be a unicast address belonging to the interface on which the packet forwarding failed. TN NUT --------------------------- 1. === echo request packet ===> src address : TN global address dst address : Off link host global address hop limit : 1 2. << JUDGEMENT >> <=== ICMPv6 Time Exceeded === src address : NUT global address dst address : TN global address Code is 0 =head1 JUDGEMENT << PASS >> NUT send ICMPv6 Time Exceeded. << FAIL >> NUT do not send ICMPv6 Time Exceeded. =cut # =head1 REFERENCE # # RFC2463 # 3.3 Time Exceeded Message # # 0 1 2 3 # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ # | Type | Code | Checksum | # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ # | Unused | # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ # | As much of invoking packet | # + as will fit without the ICMPv6 packet + # | exceeding the minimum IPv6 MTU [IPv6] | # # IPv6 Fields: # # =begin html #
#    Destination Address
#                   Copied from the Source Address field of the invoking
#                   packet.
# 
# # =end html # # ICMPv6 Fields: # # =begin html #
#    Type           3
# 
# # =end html # # =begin html #
#    Code           0 - hop limit exceeded in transit
# 1 - fragment reassembly time exceeded #
# # =end html # # Unused This field is unused for all code values. # It must be initialized to zero by the sender # and ignored by the receiver. # # Description # # =begin html #
#    If a router receives a packet with a Hop Limit of zero, or a router
#    decrements a packet's Hop Limit to zero, it MUST discard the packet
#    and send an ICMPv6 Time Exceeded message with Code 0 to the source of
#    the packet.  This indicates either a routing loop or too small an
#    initial Hop Limit value.
# 
# # =end html # # The rules for selecting the Source Address of this message are # defined in section 2.2. # # =pod =head1 REFERENCE =begin html
RFC 2463 - ICMPv6 (ICMP for IPv6)
=end html =head1 SEE ALSO perldoc V6evalTool =cut