#!/usr/bin/perl # # $Copyright$ # # $TAHI: ct/natpt/rfc2765_3.1_fragmentation.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 = ( ipv4_echo_1232_df => 'Send IPv4 packet (1232 bytes, don\'t fragment)', ipv4_echo_1232_df_opt => 'Send IPv4 packet (1232 bytes, + ipv4 options)', ipv4_echo_1234_df => 'Send IPv4 packet (1234 bytes, don\'t fragment)', ipv4_echo_1232 => 'Send IPv4 packet (1232 bytes, may fragment)', ipv4_echo_1234 => 'Send IPv4 packet (1234 bytes, may fragment)', ipv4_echo_frag => 'Send IPv4 fragment (1234 bytes, may fragment, offset 512)', ipv6_echo_1232 => 'Recv IPv6 packet (1272 bytes, no fragment hdr)', icmpv4_unreach_mtu1252 => 'Recv ICMPv4 Packet too big, MTU = 1252', icmpv4_unreach_mtu1252_ttl => 'Recv ICMPv4 Packet too big, MTU = 1252', ipv6_echo_1232_frag => 'Recv IPv6 packet (1280 bytes, fragment hdr)', ipv6_echo_1234_frag1 => 'Recv IPv6 packet (1280 bytes, (1\'st fragment))', ipv6_echo_1234_frag2 => 'Recv IPv6 packet (50 bytes, (2nd fragment))', ipv6_echo_frag_frag1 => 'Recv IPv6 fragment (offset 512))', ipv6_echo_frag_frag2 => 'Recv IPv6 packet fragment (offset 1744))', 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_echo_1232_df', $IF, 'ipv6_echo_1232'); $result += send_recv($IF1, 'ipv4_echo_1232_df_opt', $IF, 'ipv6_echo_1232'); $result += send_recv($IF1, 'ipv4_echo_1234_df', $IF1, 'icmpv4_unreach_mtu1252', 'icmpv4_unreach_mtu1252_ttl'); $result += send_recv($IF1, 'ipv4_echo_1232', $IF, 'ipv6_echo_1232_frag'); $result += send_recv($IF1, 'ipv4_echo_1234', $IF, 'ipv6_echo_1234_frag1'); $result += send_recv($IF1, '', $IF, 'ipv6_echo_1234_frag2'); $result += send_recv($IF1, 'ipv4_echo_frag', $IF, 'ipv6_echo_frag_frag1'); $result += send_recv($IF1, '', $IF, 'ipv6_echo_frag_frag2'); if($result == $V6evalTool::exitPass) { vLogHTML("

OK

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

NG

"); exit $V6evalTool::exitFail; ######################################################################## __END__ =head1 NAME rfc2765_3.1_fragmentation.seq - Verify IPv6 <-> IPv4 header translation in accordance with RFC2765 [SIIT] =head1 TARGET Router =head1 SYNOPSIS rfc2765_3.1_fragmentation.seq [-tooloption ...] -p rfc2765_3.1_fragmentation.def =head1 INITIALIZATION =begin html
	Before this test starts, run initialize.seq.
=end html =head1 TEST PROCEDURE This test verifies that NUT force fragmentation if the resulting IPv6 package is larger than 1232 bytes + IPv6 header and optional fragment header. Network Topology Link0 -------------------------- | | TN NUT | | -------------------------- Link1 TN -- (Link0) -- NUT NUT -- (Link1) -- TN --------------------- ------------------------ =begin html
1.1. <=================== ICMPv4 Echo request IPv4 Header src address : TN LINK1 IPv4 address dst address : TN LINK0 IPv4 address Don't Fragment = 1 ICMPv4 echo request Payload = repeat(0xff, 1224) 1.2. <> <=================== ICMPv6 Echo Request IPv6 Header src address : TN LINK1 IPv4 embedded IPv6 address dst address : TN LINK0 IPv4 embedded IPv6 address ICMPv6 echo request Payload = repeat(0xff, 1224) =begin html
2.1. <=================== ICMPv4 Echo request IPv4 Header src address : TN LINK1 IPv4 address dst address : TN LINK0 IPv4 address Don't Fragment = 1 Timestamp Option ICMPv4 echo request Payload = repeat(0xff, 1224) 2.2. <> <=================== ICMPv6 Echo Request IPv6 Header src address : TN LINK1 IPv4 embedded IPv6 address dst address : TN LINK0 IPv4 embedded IPv6 address ICMPv6 echo request Payload = repeat(0xff, 1224) =begin html
3.1. <=================== ICMPv4 Echo request IPv4 Header src address : TN LINK1 IPv4 address dst address : TN LINK0 IPv4 address Don't Fragment = 1 ICMPv4 echo request Payload = repeat(0xff, 1226) 3.2. <> ===================> ICMPv4 Destination Unreachable IPv4 Header src address : NUT LINK1 IPv4 address dst address : TN LINK1 IPv4 address ICMPv4 Destination Unreachable Type = 3 Code = 2 MTU = 1252 =begin html
4.1. <=================== ICMPv4 Echo request IPv4 Header src address : TN LINK1 IPv4 address dst address : TN LINK0 IPv4 address Don't Fragment = 0 ICMPv4 echo request Payload = repeat(0xff, 1224) 4.2. <> <=================== ICMPv6 Echo Request IPv6 Header src address : TN LINK1 IPv4 embedded IPv6 address dst address : TN LINK0 IPv4 embedded IPv6 address Fragment Header ICMPv6 echo request Payload = repeat(0xff, 1224) =begin html
5.1. <=================== ICMPv4 Echo request IPv4 Header src address : TN LINK1 IPv4 address dst address : TN LINK0 IPv4 address Don't Fragment = 0 ICMPv4 echo request Payload = repeat(0xff, 1226) 5.2. <> <=================== ICMPv6 Echo Request IPv6 Header src address : TN LINK1 IPv4 embedded IPv6 address dst address : TN LINK0 IPv4 embedded IPv6 address Fragment Header Offset = 0 More Fragments = 1 ICMPv6 echo request Payload = repeat(0xff, 1224) 5.3. <> <=================== ICMPv6 Echo Request IPv6 Header src address : TN LINK1 IPv4 embedded IPv6 address dst address : TN LINK0 IPv4 embedded IPv6 address Fragment Header Offset = 1232 More Fragments = 0 Payload = repeat(0xff, 2) =begin html
6.1. <=================== ICMPv4 Echo request IPv4 Header src address : TN LINK1 IPv4 address dst address : TN LINK0 IPv4 address Don't Fragment = 0 FragmentOffset = 500 MF = 1 ICMPv4 echo request Payload = repeat(0xff, 1226) 6.2. <> <=================== ICMPv6 Echo Request IPv6 Header src address : TN LINK1 IPv4 embedded IPv6 address dst address : TN LINK0 IPv4 embedded IPv6 address Fragment Header Offset = 500 More Fragments = 1 ICMPv6 echo request Payload = repeat(0xff, 1224) 6.3. <> <=================== ICMPv6 Echo Request IPv6 Header src address : TN LINK1 IPv4 embedded IPv6 address dst address : TN LINK0 IPv4 embedded IPv6 address Fragment Header Offset = 1732 More Fragments = 1 Payload = repeat(0xff, 2) =head1 JUDGMENT << PASS >> NUT translates IPv4 packages smaller than 1252 bytes. If DF flag is set on IPv4 packages larger than 1254 bytes, an ICMPv4 Destination Unreachable (packet too big) is returned, otherwise the packet is fragmentet prior to translation. << FAIL >> NUT doesn't to forced fragmentation properly. =head1 NOTE =head1 REFERENCE B 3.1. Translating IPv4 Headers into IPv6 Headers If the DF flag is not set and the IPv4 packet will result in an IPv6 packet larger than 1280 bytes the IPv4 packet MUST be fragmented prior to translating it. Since IPv4 packets with DF not set will always result in a fragment header being added to the packet the IPv4 packets must be fragmented so that their length, excluding the IPv4 header, is at most 1232 bytes (1280 minus 40 for the IPv6 header and 8 for the Fragment header). =head1 SEE ALSO perldoc V6evalTool =cut