#!/usr/bin/perl # # $Copyright$ # # $TAHI: ct/natpt/rfc2765_3.2_udp.seq,v 1.3 2001/10/11 01:41:47 akisada Exp $ # BEGIN { $V6evalTool::TestVersion = '$Name: $'; } use V6evalTool; use natpt; checkNUT(router); # Interface $IF="Link0"; $IF1="Link1"; vCapture($IF); vCapture($IF1); %pktdesc = ( ipv4_udp => 'Send IPv4 UDP packet (Checksum OK) on link1', ipv4_udp_zero => 'Send IPv4 UDP packet (Checksum Zero) on link1', ipv4_udp_frag => 'Send IPv4 UDP fragment (Checksum OK) on link1', ipv4_udp_frag_zero => 'Send IPv4 UDP fragment (Checksum Zero) on link1', ipv6_udp => 'Recv IPv6 UDP packet on Link0', ipv6_udp_frag => 'Recv IPv6 UDP fragment 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($IF1, 'ipv4_udp', $IF, 'ipv6_udp'); $result += send_recv($IF1, 'ipv4_udp_zero', $IF, 'ipv6_udp'); $result += send_recv($IF1, 'ipv4_udp_frag', $IF, 'ipv6_udp_frag'); $result += send_recv($IF1, 'ipv4_udp_frag_zero', $IF, ''); if($result == $V6evalTool::exitPass) { vLogHTML("

OK

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

NG

"); exit $V6evalTool::exitFail; ######################################################################## __END__ =head1 NAME rfc2765_3.2_udp.seq - Verify IPv6 <-> IPv4 header translation in accordance with RFC2765 [SIIT] =head1 TARGET Router =head1 SYNOPSIS rfc2765_3.2_udp.seq [-tooloption ...] -p rfc2765_3.2_udp.def =head1 INITIALIZATION =begin html
	Before this test starts, run initialize.seq.
=end html =head1 TEST PROCEDURE This test verifies that NUT adjusts header checksum for UDP packets. Network Topology Link0 -------------------------- | | TN NUT | | -------------------------- Link1 TN -- (Link0) -- NUT NUT -- (Link1) -- TN --------------------- ------------------------ =begin html
1.1. <=================== IPv4 UDP packet IPv4 Header src address : TN LINK1 IPv4 address dst address : TN LINK0 IPv4 address Don't Fragment = 1 UDP packet Checksum including IPv4 pseudo header data = repeat(0xff,64) 1.2. <> <=================== IPv6 UDP packet IPv6 Header src address : TN LINK1 IPv4 embedded IPv6 address dst address : TN LINK0 IPv4 embedded IPv6 address UDP packet Checksum including IPv6 pseudo header data = repeat(0xff,64) =begin html
2.1. <=================== IPv4 UDP packet IPv4 Header src address : TN LINK1 IPv4 address dst address : TN LINK0 IPv4 address Don't Fragment = 1 UDP packet Checksum = 0xffff (zero checksum) data = repeat(0xff,64) 2.2. <> <=================== IPv6 UDP packet IPv6 Header src address : TN LINK1 IPv4 embedded IPv6 address dst address : TN LINK0 IPv4 embedded IPv6 address UDP packet Checksum including IPv6 pseudo header data = repeat(0xff,64) =begin html
3.1. <=================== IPv4 UDP packet IPv4 Header src address : TN LINK1 IPv4 address dst address : TN LINK0 IPv4 address MF = 1 UDP packet Checksum including IPv4 pseudo header data = repeat(0xff,64) 3.2. <> <=================== IPv6 UDP packet IPv6 Header src address : TN LINK1 IPv4 embedded IPv6 address dst address : TN LINK0 IPv4 embedded IPv6 address Fragment Header More fragments = 1 UDP packet Checksum including IPv6 pseudo header data = repeat(0xff,64) =begin html
4.1. <=================== IPv4 UDP packet IPv4 Header src address : TN LINK1 IPv4 address dst address : TN LINK0 IPv4 address MF = 1 UDP packet Checksum = 0xffff (zero checksum) data = repeat(0xff,64) 4.2. <> Packet is silently dropped =head1 JUDGMENT << PASS >> NUT adjusts header checksum for UDP packets with checksum and recalculates it for UDP packets with zero checksum. Fragmented UDP packets with zero checksum are silently dropped. << FAIL >> NUT send UDP packets with wrong checksum, or doesn't drop fragmented UDP with zero checksum. =head1 NOTE =head1 REFERENCE B 3.2. Translating UDP over IPv4 If a UDP packet has a zero UDP checksum then a valid checksum must be calculated in order to translate the packet. A stateless translator can not do this for fragmented packets but [MILLER] indicates that fragmented UDP packets with a zero checksum appear to only be used for malicious purposes. Thus this is not believed to be a noticeable limitation. When a translator receives the first fragment of a fragmented UDP IPv4 packet and the checksum field is zero the translator SHOULD drop the packet and generate a system management event specifying at least the IP addresses and port numbers in the packet. When it receives fragments other than the first it SHOULD silently drop the packet, since there is no port information to log. When a translator receives an unfragmented UDP IPv4 packet and the checksum field is zero the translator MUST compute the missing UDP checksum as part of translating the packet. Also, the translator SHOULD maintain a counter of how many UDP checksums are generated in this manner. =head1 SEE ALSO perldoc V6evalTool =cut