#!/usr/bin/perl
#
# $Copyright$
#
# $TAHI: ct/tunnel/fragment.seq,v 1.11 2001/10/05 06:39:22 masaxmasa Exp $
########################################################################
BEGIN { $V6evalTool::TestVersion = '$Name: $'; }
use V6evalTool;
use tunnel;
checkNUT(router);
$IF=$tunnel::IF_ID_0;
$IF1=$tunnel::IF_ID_1;
$PASS=$tunnel::PASS;
$WARN=$tunnel::WARN;
$FAIL=$tunnel::FAIL;
$FATAL=$tunnel::FATAL;
$ON=$tunnel::ON;
$OFF=$tunnel::OFF;
$result;
%pktdesc = (
echo_request_LINK1_v4_tn2nut_OFFLINK => 'TN(Offlink address) --ICMPv4 Echo Request (size 1450)-->NUT',
echo_reply_LINK1_v4_nut2tn_OFFLINK => 'TN(Offlink address) <--ICMPv4 Echo Reply (size 1450)--NUT',
v6_echo_request_LINK0_tn2nut_OFFLINK_1280 => 'TN --ICMPv4 Echo Request (size 1280)-->NUT(tunnel)',
v6overv4_echo_request_LINK1_nut2tn_1300_DF => 'NUT -->IPv4 packet '
);
vCapture($IF);
vCapture($IF1);
$ret=makeNCE_TN_LLA();
if( $ret !=0) {
vLogHTML("NUT can not be initialized !!
");
goto error;
}else {
vLogHTML("
--- TN can make TN's link local address NCE in TN ---
");
}
$ret=makeNCE_TN_GA();
if( $ret !=0) {
vLogHTML("NUT can not be initialized !!
");
goto error;
}else {
vLogHTML("--- TN can make TN's global address NCE in TN ---
");
}
$ret=makeARPTable_LINK1();
if( $ret !=0) {
vLogHTML("NUT can not convert v4 address to ethernet address !!
");
goto error;
}else {
vLogHTML("--- NUT can convert v4 address to ethernet address ---
");
}
$ret=config_tunnel_mtu("1500");
if($ret != 0) {
vLogHTML("NUT can not set tunnel MTU !!
");
goto error;
}else {
vLogHTML("--- NUT can set tunnel MTU ---
");
}
vLogHTML("--- Test part ---
");
vClear($IF);
vClear($IF1);
vSend($IF, v6_echo_request_LINK0_tn2nut_OFFLINK_1280);
%ret=vRecv($IF1,2,0,0,v6overv4_echo_request_LINK1_nut2tn_1300,v6overv4_echo_request_LINK1_nut2tn_1300_DF);
if( $ret{status} !=0) {
vLogHTML("TN can not receive Echo Reply from NUT
");
%ret=vRecv($IF,1,0,0,v6overv4_echo_request_LINK1_nut2tn_1500);
goto error;
}elsif ($ret{recvFrame} eq "v6overv4_echo_request_LINK1_nut2tn_1300_DF" ) {
vLogHTML("NUT use IPv4 Path MTU algorithm across the tunnel
");
$ipv4_pmtu = $ON;
}elsif ($ret{recvFrame} eq "v6overv4_echo_request_LINK1_nut2tn_1300" ) {
vLogHTML("NUT use the MTU of the link layer (under IPv4)
");
$ipv4_pmtu = $OFF;
}
vClear($IF);
vClear($IF1);
#
# v4PMTU-20 = 1400
vLogHTML("v4PMTU-20 = 1400
");
change_tunnel_mtu(1420);
vSend($IF, v6_echo_request_LINK0_tn2nut_OFFLINK_1401);
%ret=vRecv($IF,2,0,0,icmp6_TooBigMesg_LINK0_nut2tn_1400);
if( $ret{status} !=0) {
vLogHTML("TN can not receive Echo Reply from NUT
");
%ret=vRecv($IF1,1,0,0,v6overv4_echo_request_LINK1_nut2tn_1421);
$result=$FAIL;
}else {
vLogHTML("TN can receive Echo Reply from NUT
");
}
vSend($IF, v6_echo_request_LINK0_tn2nut_OFFLINK_1400);
%ret=vRecv($IF1,2,0,0,v6overv4_echo_request_LINK1_nut2tn_1420_DF,v6overv4_echo_request_LINK1_nut2tn_1420);
if ($ret{recvFrame} eq "v6overv4_echo_request_LINK1_nut2tn_1420_DF" && $ipv4_pmtu == $ON) {
vLogHTML("TN can receive correct Echo Reply from NUT
");
}elsif ($ret{recvFrame} eq "v6overv4_echo_request_LINK1_nut2tn_1420" && $ipv4_pmtu == $OFF) {
vLogHTML("TN can receive correct Echo Reply from NUT
");
}else {
vLogHTML("TN can not receive Echo Reply from NUT
");
%ret=vRecv($IF,1,0,0,icmp6_TooBigMesg_LINK0_nut2tn_1400);
$result=$FAIL;
}
vClear($IF);
vClear($IF1);
#
# v4PMTU-20 = 1280
vLogHTML("v4PMTU-20 = 1280
");
change_tunnel_mtu(1300);
# send ICMPv6 Echo Request (size=1400)
vSend($IF, v6_echo_request_LINK0_tn2nut_OFFLINK_1400);
%ret=vRecv($IF,2,0,0,icmp6_TooBigMesg_LINK0_nut2tn_1280);
if( $ret{status} !=0) {
vLogHTML("TN can not receive Echo Reply from NUT
");
%ret=vRecv($IF1,1,0,0,v6overv4_echo_request_LINK1_nut2tn_1420);
$result=$FAIL;
}else {
vLogHTML("TN can receive ICMPv6 Packet Too Big message from NUT
");
}
# send ICMPv6 Echo Request (size=1281)
vSend($IF, v6_echo_request_LINK0_tn2nut_OFFLINK_1281);
%ret=vRecv($IF,2,0,0,icmp6_TooBigMesg_LINK0_nut2tn_1280);
if( $ret{status} !=0) {
vLogHTML("TN can not receive Echo Reply from NUT
");
%ret=vRecv($IF1,1,0,0,v6overv4_echo_request_LINK1_nut2tn_1301);
$result=$FAIL;
}else {
vLogHTML("TN can receive ICMPv6 Packet Too Big message from NUT
");
}
# send ICMPv6 Echo Request (size=1280)
vSend($IF, v6_echo_request_LINK0_tn2nut_OFFLINK_1280);
%ret=vRecv($IF1,2,0,0,v6overv4_echo_request_LINK1_nut2tn_1300_noset_DF);
if( $ret{status} !=0) {
vLogHTML("TN can not receive Echo Reply from NUT
");
%ret=vRecv($IF,1,0,0,icmp6_TooBigMesg_LINK0_nut2tn_1280);
$result=$FAIL;
}else {
vLogHTML("TN can receive Echo Reply from NUT
");
}
if ($result == $PASS) {
vLogHTML("OK
");
exit $V6evalTool::exitPass;
}else {
goto error;
}
sub change_tunnel_mtu ($) {
my ($v4_mtu) = @_;
my ($packet_too_big, $tunnel_mtu);
if($ipv4_pmtu == $ON) {
vSend($IF1,echo_request_LINK1_v4_tn2nut_OFFLINK);
%ret=vRecv($IF1,2,0,0,echo_reply_LINK1_v4_nut2tn_OFFLINK);
if( $ret{status} !=0) {
vLogHTML("TN can not receive Echo Reply from NUT
");
}
# send ICMPv4 Packet Too Big message
$packet_too_big="icmp4_packet_too_big_LINK1_tn2nut_MTU_".$v4_mtu;
vSend($IF1, $packet_too_big);
return $PASS;
}else {
$tunnel_mtu = $v4_mtu - 20; # 20 : IPv4 Header size
$ret=config_tunnel_mtu($tunnel_mtu);
if( $ret{status} !=0) {
vLogHTML("TN can not change NUT's MTU
");
goto error;
}
}
}
error:
vLogHTML("NG
");
exit $V6evalTool::exitFail;
error_WARN:
vLogHTML("WARN
");
exit $V6evalTool::exitWarn;
########################################################################
__END__
=head1 NAME
fragment.seq - Verify that node perform fragmentation inside
tunnel
=head1 TARGET
Router
=head1 SYNOPSIS
fragment.seq [-tooloption ...] -p fragment.def
=head1 INITIALIZATION
=begin html
Before this test starts, run initialize.seq.
In subroutine "change_tunnel_mtu" use two way of changeing
tunnel's path MTU.
If DF flag of encapsulating IPv4 Header isn't set, the test consider
that node do not execute IPv4 path MTU. and change node's link MTU.
If DF flag of encapsulating IPv4 Header is set, test consider
that node execute IPv4 path MTU. and send ICMPv4 Packet Too Big
message.
=end html
=head1 TEST PROCEDURE
This test verifies that node can employ fragmentation algorithm
to determine when to forward an IPv6 packet that is larger than
the tunnel's path mtu.
Network Topology
Link0
--------------------------
| |
TN NUT
| |
--------------------------
Link1
TN -- (Link0) -- NUT TN -- (Link1) -- NUT
--------------------- ------------------------
0.
set tunnel's mtu is 1500
-- V4PMTU -20 = 1400
1.1.1
===================>
ICMPv6 Echo Request
packet size : 1401
1.1.2
<>
<===================
ICMPv6 Packet Too Big message
MTU : 1400
1.2.1
===================>
ICMPv6 Echo Request
packet size : 1400
1.2.2
<>
<===================
IPv4 packet encapsulating IPv6 packet
-- V4PMTU -20 = 1280
2.1.1
===================>
ICMPv6 Echo Request
packet size : 1400
2.1.2
<>
<===================
ICMPv6 Packet Too Big message
MTU : 1280
2.2.1
===================>
ICMPv6 Echo Request
packet size : 1281
2.2.2
<>
<===================
ICMPv6 Packet Too Big message
MTU : 1280
2.3.1
===================>
ICMPv6 Echo Request
packet size : 1280
2.3.2
<>
<===================
IPv4 packet encapsulating IPv6 packet
-- V4PMTU -20 = 1000
3.1.1
===================>
ICMPv6 Echo Request
packet size : 1281
3.1.2
<>
<===================
ICMPv6 Packet Too Big message
MTU : 1280
3.2.1
===================>
ICMPv6 Echo Request
packet size : 1280
3.2.2
<>
<===================
IPv4 packet encapsulating IPv6 packet
=head1 JUDGMENT
<< PASS >>
TN received the packet which describe above "TEST PROCEDURE"
<< FAIL >>
TN could not receive the packet which describe above
"TEST PROCEDURE"
=head1 SEE ALSO
perldoc V6evalTool
=cut