#!/usr/bin/perl
#
# $Copyright$
# $TINY: pmtuStore.seq,v 1.8 2002/03/05 02:59:11 masaxmasa Exp $
#
########################################################################
BEGIN { $V6evalTool::TestVersion = '$Name: $ '; }
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");
rebootNUT();
vCapture($IF);
# Re-Initialize
vSend($IF,ra);
vLogHTML("Ignoring DAD packets");
vSleep($WAIT_TO_FIN_DAD);
vSend($IF,na);
##
## 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