#!/usr/bin/perl
#
# Copyright (C) 2002, 2003, 2004, 2005 Yokogawa Electric Corporation,
# INTAP(Interoperability Technology Association for Information
# Processing, Japan), IPA (Information-technology Promotion Agency, Japan).
# 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. However, using this software for the
# purpose of testing or evaluating any products including merchantable
# products may be permitted without any notification to the copyrighters.
#
#
#
# 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.
# $TINY: pmtuStore.seq,v 1.8 2002/03/05 02:59:11 masaxmasa Exp $
#
########################################################################
BEGIN { $V6evalTool::TestVersion = '$Name: REL_2_1_2 $ '; }
use V6evalTool;
use PMTU;
$IF=Link0;
$BASEPREFIX="3ffe:501:ffff:";
$INITSUBPREFIX = hex("0xf001");
$MIN_MTU=1280;
$SMALL=10;
$MEDIUM=100;
$WAIT_TO_FIN_DAD=5;
%pktdesc = (
icmp6_EchoRequest_1500_from_many_hosts => 'TN ---ICMP Echo Request (1500)----> NUT',
icmp6_EchoReply_1500_to_many_hosts => 'TN <--ICMP Echo Reply (1500)------ NUT',
frag_echo_reply_1500_1st_VAL_many => 'TN <--ICMP Echo Reply(1/2)--------- NUT',
frag_echo_reply_1500_2nd_VAL_many => 'TN <--ICMP Echo Reply(2/2)--------- NUT',
frag_echo_reply_1500_1st_1280_many => 'TN <--ICMP Echo Reply(1/2)(1280)--- NUT',
frag_echo_reply_1500_2nd_1280_many => 'TN <--ICMP Echo Reply(2/2)(1280)--- NUT',
icmp6_TooBigMesg_VAL_for_1500_many => 'TN ---ICMP PacketTooBig-----------> NUT'
);
vLogHTML("Confirm can NUT can store PMTU to a lot of destinations.");
$srcaddr="::";
$val=1280;
$PayloadLen1=1232;
$PayloadLen2=1232;
$Offset2=0;
$OffsetIn8oct2=0;
vCPP("-DSRCADDR=\\\"$srcaddr\\\" -DVAL=$val -DPAYLOADLEN1=$PayloadLen1 -DOFFSET=$Offset2 -DPAYLOADLEN2=$PayloadLen2 -DOFFSETIN8OCT=$OffsetIn8oct2");
flushtables($V6evalTool::NutDef{System});
vCapture($IF);
vClear($IF);
# Initialize
if ($V6evalTool::NutDef{Type} eq "router"){
initNUT();
}else{
vSend($IF,ra);
vLogHTML("Ignoring DAD packets");
vSleep($WAIT_TO_FIN_DAD);
# vSend($IF,na);
}
# Test start
##
## Register MTU for many(SMALL) hosts
##
for ($i=0; $i < $SMALL; $i++){
$subval=$INITSUBPREFIX+$i;
$sub = sprintf "%lx", $subval;
$srcaddr="$BASEPREFIX"."$sub"."::1";
$val=$MIN_MTU+$i*8;
$PayloadLen1=$val-48;
$Offset2=$val-8;
$PayloadLen2=1508-$val;
$OffsetIn8oct2=int($PayloadLen1/8);
vCPP("-DSRCADDR=\\\"$srcaddr\\\" -DVAL=$val -DPAYLOADLEN1=$PayloadLen1 -DOFFSET=$Offset2 -DPAYLOADLEN2=$PayloadLen2 -DOFFSETIN8OCT=$OffsetIn8oct2");
vClear($IF);
vSend($IF,icmp6_EchoRequest_1500_from_many_hosts);
%ret=vRecv($IF, 5,0,0,
ns,
ns_srcGlobal,
icmp6_EchoReply_1500_to_many_hosts
);
if( $ret{status} !=0) {
vLogHTML("TN COULD NOT receive Echo Reply nor ns from NUT
");
vLogHTML(vErrmsg(%ret));
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
if($ret{recvFrame} eq 'ns' || $ret{recvFrame} eq 'ns_srcGlobal') {
if( $ret{recvFrame} eq 'ns') {
PMTU::sendNA();
}elsif( $ret{recvFrame} eq 'ns_srcGlobal') {
PMTU::sendNA_srcGlobal();
}else{
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
vSleep($WAIT_TO_SET_NA);
vCPP("-DSRCADDR=\\\"$srcaddr\\\" -DVAL=$val -DPAYLOADLEN1=$PayloadLen1 -DOFFSET=$Offset2 -DPAYLOADLEN2=$PayloadLen2 -DOFFSETIN8OCT=$OffsetIn8oct2");
vClear($IF);
vSend($IF,icmp6_EchoRequest_1500_from_many_hosts);
%ret=vRecv($IF, 5,0,0,
icmp6_EchoReply_1500_to_many_hosts
);
if( $ret{status} !=0) {
vLogHTML("TN COULD NOT receive Echo Reply nor ns from NUT
");
vLogHTML(vErrmsg(%ret));
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
if( $ret{recvFrame} eq 'icmp6_EchoReply_1500_to_many_hosts') {
# Correct Case
vLogHTML("TN($srcaddr) received Echo Reply from NUT");
vCPP("-DSRCADDR=\\\"$srcaddr\\\" -DVAL=$val -DPAYLOADLEN1=$PayloadLen1 -DOFFSET=$Offset2 -DPAYLOADLEN2=$PayloadLen2 -DOFFSETIN8OCT=$OffsetIn8oct2");
vSend($IF,icmp6_TooBigMesg_VAL_for_1500_many);
}else{
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
}elsif( $ret{recvFrame} eq 'icmp6_EchoReply_1500_to_many_hosts') {
vLogHTML("TN($srcaddr) received Echo Reply from NUT");
vCPP("-DSRCADDR=\\\"$srcaddr\\\" -DVAL=$val -DPAYLOADLEN1=$PayloadLen1 -DOFFSET=$Offset2 -DPAYLOADLEN2=$PayloadLen2 -DOFFSETIN8OCT=$OffsetIn8oct2");
vSend($IF,icmp6_TooBigMesg_VAL_for_1500_many);
}else{
vLogHTML("TN($srcaddr) COULD NOT received Echo Reply from NUT
");
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}
}
vLogHTML("#####Finish Registering PMTU for many hosts#####");
##
## Check registered MTU for many(SMALL) hosts
##
# Re-Initialize
vSend($IF,ra);
vLogHTML("Ignoring DAD packets");
vSleep($WAIT_TO_FIN_DAD);
vSend($IF,na);
for ($i=0; $i < $SMALL; $i++){
$subval=$INITSUBPREFIX+$i;
$sub = sprintf "%lx", $subval;
$srcaddr="$BASEPREFIX"."$sub"."::1";
$val=$MIN_MTU+$i*8;
$PayloadLen1=$val-48;
$Offset2=$val-8;
$PayloadLen2=1508-$val;
$OffsetIn8oct2=int($PayloadLen1/8);
vCPP("-DSRCADDR=\\\"$srcaddr\\\" -DVAL=$val -DPAYLOADLEN1=$PayloadLen1 -DOFFSET=$Offset2 -DPAYLOADLEN2=$PayloadLen2 -DOFFSETIN8OCT=$OffsetIn8oct2");
vClear($IF);
vSend($IF,icmp6_EchoRequest_1500_from_many_hosts);
%ret=vRecv($IF, 5,0,0,
ns,
ns_srcGlobal,
icmp6_EchoReply_1500_to_many_hosts,
frag_echo_reply_1500_1st_VAL_many,
frag_echo_reply_1500_2nd_VAL_many,
frag_echo_reply_1500_1st_1280_many,
frag_echo_reply_1500_2nd_1280_many
);
if( $ret{status} !=0) {
vLogHTML("TN COULD NOT receive Echo Reply nor ns from NUT
");
vLogHTML(vErrmsg(%ret));
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}
if($ret{recvFrame} eq 'ns' || $ret{recvFrame} eq 'ns_srcGlobal') {
if( $ret{recvFrame} eq 'ns') {
PMTU::sendNA();
}elsif( $ret{recvFrame} eq 'ns_srcGlobal') {
PMTU::sendNA_srcGlobal();
}else{
vClear($IF);
vLogHTML('NG');
exit $V6evalTool::exitFail;
}
vSleep($WAIT_TO_SET_NA);
vCPP("-DSRCADDR=\\\"$srcaddr\\\" -DVAL=$val -DPAYLOADLEN1=$PayloadLen1 -DOFFSET=$Offset2 -DPAYLOADLEN2=$PayloadLen2 -DOFFSETIN8OCT=$OffsetIn8oct2");
vClear($IF);
vSend($IF,icmp6_EchoRequest_1500_from_many_hosts);
%ret=vRecv($IF, 5,0,0,
icmp6_EchoReply_1500_to_many_hosts,
frag_echo_reply_1500_1st_VAL_many,
frag_echo_reply_1500_2nd_VAL_many,
frag_echo_reply_1500_1st_1280_many,
frag_echo_reply_1500_2nd_1280_many
);
if( $ret{status} !=0) {
vLogHTML("TN COULD NOT receive Echo Reply nor ns from NUT
");
vLogHTML(vErrmsg(%ret));
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}
if( $ret{recvFrame} eq 'icmp6_EchoReply_1500_to_many_hosts') {
vLogHTML("TN($srcaddr) received Echo Reply from NUT w/o Fragment
");
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}elsif( $ret{recvFrame} eq 'frag_echo_reply_1500_1st_VAL_many') {
vLogHTML("TN($srcaddr) received Echo Reply from NUT (1/2)($val)");
%ret=vRecv($IF, 5,0,0,frag_echo_reply_1500_2nd_VAL_many);
if( $ret{status} !=0) {
vLogHTML("TN COULD NOT receive Echo Reply nor ns from NUT
");
vLogHTML(vErrmsg(%ret));
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}else{
# Correct Case
vLogHTML("TN received Echo Reply nor ns from NUT (2/2)($val)
");
vLogHTML('OK');
}
}elsif( $ret{recvFrame} eq 'frag_echo_reply_1500_2nd_VAL_many') {
vLogHTML("TN($srcaddr) received Echo Reply from NUT (2/2)($val)
");
vLogHTML("TN($srcaddr) COULD NOT received Echo Reply from NUT (1/2)($val)
");
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}elsif( $ret{recvFrame} eq 'frag_echo_reply_1500_1st_1280_many') {
vLogHTML("TN($srcaddr) received Echo Reply from NUT (1/2)(1280)
");
vLogHTML("NUT may use static value(1280)");
%ret=vRecv($IF, 5,0,0,frag_echo_reply_1500_2nd_1280_many);
if( $ret{status} !=0) {
vLogHTML("TN COULD NOT receive Echo Reply nor ns from NUT
");
vLogHTML(vErrmsg(%ret));
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}else{
# Correct Case
vLogHTML("TN received Echo Reply nor ns from NUT (2/2)(1280)
");
vLogHTML('OK');
}
}elsif( $ret{recvFrame} eq 'frag_echo_reply_1500_2nd_1280_many') {
vLogHTML("TN($srcaddr) received Echo Reply from NUT (2/2)(1280)
");
vLogHTML("TN($srcaddr) COULD NOT received Echo Reply from NUT (1/2)(1280)
");
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}else{
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}
}elsif( $ret{recvFrame} eq 'icmp6_EchoReply_1500_to_many_hosts') {
vLogHTML("TN($srcaddr) received Echo Reply from NUT
");
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}elsif( $ret{recvFrame} eq 'frag_echo_reply_1500_1st_VAL_many') {
vLogHTML("TN($srcaddr) received Echo Reply from NUT (1/2)($val)");
%ret=vRecv($IF, 5,0,0,frag_echo_reply_1500_2nd_VAL_many);
if( $ret{status} !=0) {
vLogHTML("TN COULD NOT receive Echo Reply nor ns from NUT
");
vLogHTML(vErrmsg(%ret));
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}else{
# Correct Case
vLogHTML("TN received Echo Reply nor ns from NUT (2/2)($val)
");
vLogHTML('OK');
}
}elsif( $ret{recvFrame} eq 'frag_echo_reply_1500_2nd_VAL_many') {
vLogHTML("TN($srcaddr) received Echo Reply from NUT (2/2)($val)
");
vLogHTML("TN($srcaddr) COULD NOT received Echo Reply from NUT (1/2)($val)
");
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}elsif( $ret{recvFrame} eq 'frag_echo_reply_1500_1st_1280_many') {
vLogHTML("TN($srcaddr) received Echo Reply from NUT (1/2)(1280)
");
vLogHTML("NUT may use static value(1280)");
%ret=vRecv($IF, 5,0,0,frag_echo_reply_1500_2nd_1280_many);
if( $ret{status} !=0) {
vLogHTML("TN COULD NOT receive Echo Reply nor ns from NUT
");
vLogHTML(vErrmsg(%ret));
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}else{
# Correct Case
vLogHTML("TN received Echo Reply nor ns from NUT (2/2)(1280)
");
vLogHTML('OK');
}
}elsif( $ret{recvFrame} eq 'frag_echo_reply_1500_2nd_1280_many') {
vLogHTML("TN($srcaddr) received Echo Reply from NUT (2/2)(1280)
");
vLogHTML("TN($srcaddr) COULD NOT received Echo Reply from NUT (1/2)(1280)
");
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}else{
vLogHTML("TN($srcaddr) COULD NOT received Echo Reply from NUT
");
vLogHTML('NG');
vClear($IF);
exit $V6evalTool::exitFail;
}
sleep 1;
}
__END__
=head1 NAME
pmtuStore - Verify if NUT can store PMTU for multiple Destinations.
=head1 TARGET
Host
=head1 SYNOPSIS
pmtuStore.seq [-tooloption ...] -p pmtuStore.def
=head1 NETWORK CONFIGURATION
This test evaluate the behavior of NUT when it receive the ICMP
Packet Too Big Message for multiple destinations.
In this test, NUT is a host and TN plays a Roll of Routers and
other hosts.
Phisical Network configuration
--------+---------------+----------
| |
NUT TN
Logical Network Configuration
NUT
|
----------------+-------+--------
|
Router-1
|
--------+-------+-------+--------
| |
Router-2 HOST-1
|
--------+-------+-------+--------
| |
Router-n HOST-2
|
----------------+-------+--------
|
HOST-n
:
:
In this test, NUT receives Packet Too Big Messages for multiple
destinations.
- Register PMTU for multiple HOST
- Verify PMTU for multiple HOST
=head1 INITIALIZATION
The TN send a RA to assign global address prefix.
TN NUT
| |
---+------------+------
===multicast RA===>
src=TN's link-local
dst=LinkLocal-all-node
M=0, O=0,
Lifetime=3600, ReachableTime=60000, RetransTimer=1005
Prefix:
L=1, A=1,
ValidLifetime=3600005, PreferredLifetime=3600005
Prefix=3ffe:501:ffff:100::, PrefixLength=64
Wait (5 sec.)
Ignoring DAD packets for global address.
=head1 TEST PROCEDURE
"pmtuStore" verify NUT's behavior when it receives
ICMP Packet Too Big Mesg for multiple destinations.
TN NUT
| |
---+------------+------
1. Register PMTU for multiple destinations
1.1
TN send Echo Request.
TN(n) === echo request(1500) ===> NUT
1.2
NUT send Echo Reply.
TN(n) <=== echo reply(1500) === NUT
1.3
TN send ICMPv6 Too Big Mesg with MTU (1280+n*8).
TN(n) === ICMPv6 Too Big Mesg(MTU=1280+n*8) ===> NUT
2. Confirm PMTU for multiple destinations
2.1
TN send Echo Request.
TN(n) === echo request(1500) ===> NUT
2.2
NUT send Echo Reply
<< JUDGMENT 1 >>
TN(n) <=== echo reply(1280+n*8 1/2) === NUT
TN(n) <=== echo reply( 276-n*8 2/2) === NUT
=head1 JUDGMENT
<< JUDGMENT 1 -PASS- >>
NUT send Echo Reply
"PASS" means that NUT set valid MTU in received Packet Too Big message for multiple destinations.
And fragmented packets are correct.
=head1 SEE ALSO
perldoc V6evalTool
perldoc V6evalRemote
=cut