#!/usr/bin/perl # # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation, # 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. # # $TAHI: ct/natpt/rfc2766_5.3.2_checksum_tcp_udp.seq,v 1.3 2001/10/11 01:41:48 akisada Exp $ # BEGIN { $V6evalTool::TestVersion = '$Name: REL_2_1_2 $'; } use V6evalTool; use natpt; checkNUT(router); # Interface $IF="Link0"; $IF1="Link1"; vCapture($IF); vCapture($IF1); %pktdesc = ( ipv6_udp => 'Send IPv6 UDP packet on Link0', ipv6_udp_frag1 => 'Send IPv6 UDP fragment 1 on Link0', ipv6_udp_frag2 => 'Send IPv6 UDP fragment 2 on Link0', ipv4_udp => 'Recv IPv4 UDP packet (Checksum OK) on Link1', ipv4_udp_frag1 => 'Recv IPv4 UDP fragment 1 (Checksum OK) on Link1', ipv4_udp_frag2 => 'Recv IPv4 UDP fragment 2 (Checksum OK) on Link1', ipv4_udp_zero => 'Recv IPv4 UDP packet (Checksum Zero) on Link1', ipv4_udp_zero_frag1=> 'Recv IPv4 UDP fragment 1 (Checksum Zero) on Link1', ipv4_udp_zero_frag2=> 'Recv IPv4 UDP fragment 2 (Checksum Zero) on Link1', ipv6_tcp => 'Send IPv6 TCP packet on Link0', ipv6_tcp_frag1 => 'Send IPv6 TCP fragment 1 on Link0', ipv6_tcp_frag2 => 'Send IPv6 TCP fragment 2 on Link0', ipv4_tcp => 'Recv IPv4 TCP packet on Link1', ipv4_tcp_frag1 => 'Recv IPv4 TCP fragment 1 on Link1', ipv4_tcp_frag2 => 'Recv IPv4 TCP fragment 2 on Link1', arp_nut2tn_request => 'Recv ARP request on Link1 (TN IPv4addr)', arp_tn2nut_reply => 'Send ARP reply on Link1 (TN IPv4addr)', ns_nut2tn_natpt0 => 'Recv Neighbor Solicitation on Link0 (NATPT V6addr)', na_tn2nut_natpt0 => 'Send Neighbor Advertisement on Link0 (NATPT V6addr)', ); $result = $V6evalTool::exitPass; $result += send_recv($IF, 'ipv6_udp', $IF1, 'ipv4_udp', 'ipv4_udp_zero'); $result += send_recv($IF, 'ipv6_udp_frag1', $IF1, 'ipv4_udp_frag1', 'ipv4_udp_zero_frag1'); $result += send_recv($IF, 'ipv6_udp_frag2', $IF1, 'ipv4_udp_frag2', 'ipv4_udp_zero_frag2'); $result += send_recv($IF, 'ipv6_tcp', $IF1, 'ipv4_tcp'); $result += send_recv($IF, 'ipv6_tcp_frag1', $IF1, 'ipv4_tcp_frag1'); $result += send_recv($IF, 'ipv6_tcp_frag2', $IF1, 'ipv4_tcp_frag2'); if($result == $V6evalTool::exitPass) { vLogHTML("

OK

"); exit $V6evalTool::exitPass; } error: vLogHTML("

NG

"); exit $V6evalTool::exitFail; ######################################################################## __END__ =head1 NAME rfc2766_5.3.2_checksum_tcp_udp.seq - Verify IPv6 <-> IPv4 header translation in accordance with RFC2766 [NATPT] =head1 TARGET Router =head1 SYNOPSIS rfc2766_5.3.2_checksum_tcp_udp.seq [-tooloption ...] -p rfc2766_5.3.2_checksum_tcp_udp.def =head1 INITIALIZATION =begin html
	Before this test starts, run initialize_natpt.seq.
=end html =head1 TEST PROCEDURE This test verifies that NUT adjusts header checksum for TCP/UDP packets. Network Topology Link0 -------------------------- | | TN NUT | | -------------------------- Link1 TN -- (Link0) -- NUT NUT -- (Link1) -- TN --------------------- ------------------------ =begin html
1.1. ===================> IPv6 UDP packet IPv6 Header src address : TN LINK0 IPv4 embedded IPv6 address dst address : TN LINK1 IPv4 embedded IPv6 address UDP packet Checksum including IPv6 pseudo header data = repeat(0xff,128) 1.2. <> ===================> IPv4 UDP packet IPv4 Header src address : TN LINK0 IPv4 address dst address : TN LINK1 IPv4 address DF = 1 UDP packet Checksum including IPv4 pseudo header, or zero data = repeat(0xff,128) =begin html
2.1. ===================> IPv6 UDP packet IPv6 Header src address : TN LINK0 IPv4 embedded IPv6 address dst address : TN LINK1 IPv4 embedded IPv6 address Fragment Header More fragments = 1 UDP packet Checksum including IPv6 pseudo header, or zero data = repeat(0xff,64) 2.2. <> ===================> IPv4 UDP packet IPv4 Header src address : TN LINK0 IPv4 address dst address : TN LINK1 IPv4 address MF = 1 UDP packet Checksum for full UDP packet, including pseudo header data = repeat(0xff,64) =begin html
3.1. ===================> IPv6 UDP packet IPv6 Header src address : TN LINK0 IPv4 embedded IPv6 address dst address : TN LINK1 IPv4 embedded IPv6 address Fragment Header More fragments = 0 NextHeader = 17 Payload data = repeat(0xff,64) 3.2. <> ===================> IPv4 UDP packet IPv4 Header src address : TN LINK0 IPv4 address dst address : TN LINK1 IPv4 address MF = 0 Protocol = 17 Payload data = repeat(0xff,64) =begin html
4.1. ===================> IPv6 TCP packet IPv6 Header src address : TN LINK0 IPv4 embedded IPv6 address dst address : TN LINK1 IPv4 embedded IPv6 address TCP packet Checksum including IPv6 pseudo header data = repeat(0xff,128) 4.2. <> ===================> IPv4 TCP packet IPv4 Header src address : TN LINK0 IPv4 address dst address : TN LINK1 IPv4 address DF = 1 TCP packet Checksum including IPv4 pseudo header data = repeat(0xff,128) =begin html
5.1. ===================> IPv6 TCP packet IPv6 Header src address : TN LINK0 IPv4 embedded IPv6 address dst address : TN LINK1 IPv4 embedded IPv6 address Fragment Header More fragments = 1 TCP packet Checksum including IPv6 pseudo header data = repeat(0xff,64) 5.2. <> ===================> IPv4 TCP packet IPv4 Header src address : TN LINK0 IPv4 address dst address : TN LINK1 IPv4 address MF = 1 TCP packet Checksum including IPv4 pseudo header data = repeat(0xff,64) =begin html
6.1. ===================> IPv6 TCP packet IPv6 Header src address : TN LINK0 IPv4 embedded IPv6 address dst address : TN LINK1 IPv4 embedded IPv6 address Fragment Header More fragments = 0 Payload data = repeat(0xff,64) 6.2. <> ===================> IPv4 TCP packet IPv4 Header src address : TN LINK0 IPv4 address dst address : TN LINK1 IPv4 address MF = 0 Payload data = repeat(0xff,64) =head1 JUDGMENT << PASS >> NUT adjusts header checksum for UDP/TCP packets. Optionally NUT sets checksum to zero on UDP packets. << FAIL >> NUT send TCP/UDP packets with wrong checksum. =head1 NOTE =head1 REFERENCE B 5.3.2 TCP/UDP/ICMP Checksum Update from IPv6 to IPv4 TCP and UDP checksums SHOULD be recalculated to reflect the address change from v6 to v4. The incremental checksum adjustment algorithm may be borrowed from [NAT]. In the case of NAPT-PT, TCP/UDP checksums should be adjusted to account for the address and TCP/UDP port changes, going from V6 to V4 addresses. For UDP packets, optionally, the checksum may simply be changed to zero. =head1 SEE ALSO perldoc V6evalTool =cut