#!/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_0.seq,v 1.7 2006/02/02 02:32:18 akisada Exp $
#----------------------------------------------------------------------
BEGIN { $V6evalTool::TestVersion = '$Name: V6LC_P2_1_4_3 $'; }
use V6evalTool;
use icmp;
use lib '../';
use AdvancedFunctionality;
sub cleanup_tunnel();
$IF = Link0;
checkNUT(router);
%pktdesc = (
echo_request_hop0 => 'Send Echo Request (HopLimit = 0)',
time_exceeded0 => '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);
}
}
#----------------------------------------------------------------------
# Test
#----------------------------------------------------------------------
vLogHTML("Test
");
#---
# verify handling packets with hoplimit = 0
#---
vSend($IF, echo_request_hop0);
#%ret = vRecv($IF, $icmp::wait_reply, 0, 0, time_exceeded0, ns_global, ns_global_sll);
%ret = icmp_vRecv($IF, $icmp::wait_reply, 0, 0, time_exceeded0);
if ($ret{status} != 0) {
vLogHTML('TN can not receive ICMPv6 error message from NUT
');
goto error;
}
elsif ($ret{recvFrame} eq 'time_exceeded0') {
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_0.seq - check Time Exceeded 0
=head1 TARGET
Router
=head1 SYNOPSIS
Time_Exc_0.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 : 0
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# # =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 #
# 1 - fragment reassembly time exceeded #
# 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
=end html =head1 SEE ALSO perldoc V6evalTool =cutRFC 2463 - ICMPv6 (ICMP for IPv6)