#!/usr/bin/perl
#
# $Copyright$
#
# $TAHI: ct/natpt/ping_siit_frag.seq,v 1.4 2001/10/11 01:41:46 akisada Exp $
#
BEGIN { $V6evalTool::TestVersion = '$Name: $'; }
use V6evalTool;
use natpt;
checkNUT(router);
# Interface
$IF="Link0";
$IF1="Link1";
vCapture($IF);
vCapture($IF1);
%pktdesc = (
echo_request_nut2tn_siit => 'Send V6 Echo Request on Link0',
echo_request_LINK0_LINK1_v4_tn2tn => 'Recv V4 Echo Request on Link1',
echo_reply_LINK0_LINK1_v4_tn2tn => 'Send V4 Echo Reply on Link1',
echo_reply_LINK0_tn2tn_siit => 'Recv V6 Echo Reply on Link0',
arp_nut2tn_request => 'Recv ARP request on Link1 (TN IPv4addr)',
arp_tn2nut_reply => 'Send ARP reply on Link1 (TN IPv4addr)',
ns_nut2tn_siit0 => 'Recv Neighbor Solicitation on Link0 (SIIT V6addr)',
na_tn2nut_siit0 => 'Send Neighbor Advertisement on Link0 (SIIT V6addr)',
);
$result = $V6evalTool::exitPass;
$result += send_recv($IF, 'echo_request_tn2nut_siit_frag',
$IF1, 'echo_request_v4_nut2tn');
$result += send_recv($IF1, 'echo_reply_v4_tn2nut',
$IF, 'echo_reply_nut2tn_siit_frag');
if($result == $V6evalTool::exitPass) {
vLogHTML("
OK
");
exit $V6evalTool::exitPass;
}
error:
vLogHTML("NG
");
exit $V6evalTool::exitFail;
########################################################################
__END__
=head1 NAME
ping_siit_frag.seq - Verify IPv6 <-> IPv4 header translation in
accordance with RFC2765 [SIIT]
=head1 TARGET
Router
=head1 SYNOPSIS
ping_siit_frag.seq [-tooloption ...] -p ping_siit_frag.def
=head1 INITIALIZATION
=begin html
Before this test starts, run initialize.seq.
=end html
=head1 TEST PROCEDURE
This test verifies that NUT translates between IPv6 (fragment hdr)
and IPv4 (DF=0). It also tests ICMPv6 echo <-> ICMPv4 echo
translation.
Network Topology
Link0
--------------------------
| |
TN NUT
| |
--------------------------
Link1
TN -- (Link0) -- NUT NUT -- (Link1) -- TN
--------------------- ------------------------
=begin html
1.1.1
===================>
ICMPv6 Echo Request
IPv6 Header
src address : TN LINK0 IPv4 embedded IPv6 address
dst address : TN LINK1 IPv4 embedded IPv6 address
Fragment Header
More fragments = 0
ICMPv6 echo request
1.1.2
<>
===================>
ICMPv4 Echo request
IPv4 Header
src address : TN LINK0 IPv4 address
dst address : TN LINK1 IPv4 address
Don't Fragment = 0
More fragments = 0
ICMPv4 echo request
=begin html
1.2.1
<===================
ICMPv4 Echo Reply
IPv4 Header
src address : TN LINK1 IPv4 address
dst address : TN LINK0 IPv4 address
Don't Fragment = 0
More fragments = 0
ICMPv4 echo reply
1.2.2
<>
<===================
ICMPv6 Echo Reply
IPv6 Header
src address : TN LINK1 IPv4 embedded IPv6 address
dst address : TN LINK0 IPv4 embedded IPv6 address
Fragment Header
More fragments = 0
ICMPv6 echo reply
=head1 JUDGMENT
<< PASS >>
TN (Link1) received ICMPv4 echo request,
with DF=0 in IPv4 header.
TN (Link0) received ICMPv6 echo reply,
with a fragment header after IPv6 header.
<< FAIL >>
NUT did not translate between ICMPv6 echo and ICMPv4 echo,
or NUT did not translate between IPv6 fragment header
and IPv4 DF option.
=head1 NOTE
=head1 REFERENCE
B
3.1. Translating IPv4 Headers into IPv6 Headers
[...] IPv4 packets with DF not set will always result in a fragment
header being added to the packet [...]
3.3. Translating ICMPv4 Headers into ICMPv6 Headers
Echo and Echo Reply (Type 8 and Type 0)
Adjust the type to 128 and 129, respectively, and adjust the
ICMP checksum both to take the type change into account and
to include the ICMPv6 pseudo-header.
4.1. Translating IPv6 Headers into IPv4 Headers
If there is no IPv6 Fragment header the IPv4 header fields are set as
follows:
If the IPv6 packet contains a Fragment header the header fields are
set as above with the following exceptions:
Flags:
The More Fragments flag is copied from the M flag in
the Fragment header. The Don't Fragments flag is set
to zero allowing this packet to be fragmented by IPv4
routers.
4.2. Translating ICMPv6 Headers into ICMPv4 Headers
Echo Request and Echo Reply (Type 128 and 129)
Adjust the type to 0 and 8, respectively, and adjust the ICMP
checksum both to take the type change into account and to
exclude the ICMPv6 pseudo-header.
=head1 SEE ALSO
perldoc V6evalTool
=cut