#!/usr/bin/perl # # Copyright (C) 1999,2000 Yokogawa Electric Corporation and # YDC Corporation. # 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. # # 5. The copyrighters, the project and the contributors may prohibit # the use of this software at any time. # # 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. # # $Id: hostRecvRedirect4OnlinkNUD.seq,v 1.1.1.1 2000/10/31 22:39:34 sekiya Exp $ ######################################################################## BEGIN { $V6evalTool::TestVersion = '$Name: $ '; } use V6evalTool; use nd; ndOptions(@ARGV); # The following generate debugging messages. $nd::debug=$ndOpt_v|$ndOpt_vv; # You can specifies debug optons to a remote control program. # If you want to know more detail, please see the following: # - V6evalTool.pm: perldoc V6evalTool # - V6evalRemote.pm: perldoc V6evalRemote $nd::remote_debug="-o1" if $ndOpt_vv; $IF=Link0; $wait_dad=3; $wait_echo=2; $wait_stale=$nd::REACHABLE_TIME * $nd::MAX_RANDOM_FACTOR; $wait_nonce=$nd::DELAY_FIRST_PROBE_TIME + ($nd::RETRANS_TIMER * $nd::MAX_UNICAST_SOLICIT) + 1; # # # $type=$V6evalTool::NutDef{Type}; if($type eq router) { vLogHTML("This test is for the host only
"); exit $V6evalTool::exitHostOnly; } $type=$V6evalTool::NutDef{Type}; if($type ne host) { vLogHTML(ndErrmsg("ERROR: $V6evalTool::NutDef{Type}: ". "Unknown target type
")); exit $V6evalTool::exitFail; } # # # # vLogHTML("
Initialization
"); vCapture($IF); # # #goto error if ndClearPrefix() != 0; #goto error if ndClearDefr() != 0; clear(); vSleep(1); goto error if ndClearRoutes() != 0; goto error if nd2NoNce($IF) != 0; # # # vLogHTML("Set R1 as the default router, then set TN as the second router
"); $pktdesc{ra_rone2allnode_sll}= 'Router R1 sends RA w/ SLL, then STALE'; $pktdesc{unicast_na_rone2nut_RSO_tll}= 'Router R1 sends NA w/ TLL, then REACHABLE'; vSend($IF, ra_rone2allnode_sll, unicast_na_rone2nut_RSO_tll, ); # # # vLogHTML("Wait for DAD
"); vRecv($IF, $wait_dad, 0, 0); # # # vLogHTML("
Test
"); # # # vLogHTML("*** Verify that the default router work ***
"); $pktdesc{echo_request_a}= "Send echo-request that is forwarded from the default router (R1)"; %ret=vSend($IF, echo_request_a); $pktdesc{echo_reply_a}= 'Got echo-reply that was thrown to the default router (R1)'; %ret=vRecv($IF, $wait_echo, $ret{sentTime1}, 0, echo_reply_a); goto error if $ret{status} != 0; # # # vLogHTML("*** Verify that redirect work ***
"); $pktdesc{redirect_rone2nut_tll}= "Send redirect to the second router (TN), then STALE"; vSend($IF, redirect_rone2nut_tll); # # # if(isRedirected($IF) ne REDIRECTED) { vLogHTML(ndErrmsg("ERROR: Redirect did not work
")); goto error; } vLogHTML("Then DELAY->PROBE
"); # # # vLogHTML("*** Wait for NONCE ***
"); $t=$wait_nonce; $t*=2 if $V6evalTool::NutDef{System} =~ /solaris/ ; # patch for solaris vRecv($IF, $t, 0, 0); vLogHTML("Then NONCE
"); # # # vLogHTML("*** Verify that NUD removes Destination Cache entry ***
"); if(isRedirected($IF) ne IGNORED) { vLogHTML("The echo-reply was thrown to the second router". "whose NC entry has been removed
"); vLogHTML(ndErrmsg("ERROR: NUD does not work at redirected entry
")); goto error; } # # # vLogHTML("
Termination
"); clear(); vLogHTML("*** OK ***
"); exit $V6evalTool::exitPass; error: vLogHTML("
Termination
"); clear(); vLogHTML(ndErrmsg("*** NG ***
")); vLogHTML(vErrmsg(%ret)."
"); exit $V6evalTool::exitFail; ######################################################################## sub isRedirected($) { my($if)=@_; my(%ret, $s); # # # $pktdesc{echo_request_b}= "Send echo-request that is forwarded from the default router (R1)"; %ret=vSend($if, echo_request_b); $pktdesc{echo_reply_b}= 'Got echo-reply that was thrown to the default router (R1)'; $pktdesc{echo_reply_b_onlink}= 'Got echo-reply whose destination is on-link'; %ret=vRecv($if, $wait_echo, $ret{sentTime1}, 0, echo_reply_b, echo_reply_b_onlink, ); goto error if $ret{status} != 0; # # # if($ret{recvFrame} eq echo_reply_b) { vLogHTML("Redirect is ignored
"); $s="IGNORED"; } elsif($ret{recvFrame} eq echo_reply_b_onlink) { vLogHTML("Redirect is accepted
"); $s="REDIRECTED"; } else { vLogHTML(ndErrmsg("ERROR: Got unexpected packet
")); goto error; } return $s; error: vLogHTML(vErrmsg(%ret)."
"); return ERROR; } sub clear() { $pktdesc{ra_rone2allnode_clrrtr}="Clear the Default Router List"; vSend($IF, ra_rone2allnode_clrrtr); } ######################################################################## __END__ =head1 NAME hostRecvRedirect4OnlinkNUD - Verifying Redirect (to a better router) vs. Neighbor Unreachability Detection =head1 TARGET Host only =head1 SYNOPSIS hostRecvRedirect4OnlinkNUD.seq [-tooloption ...] -p hostRecvRedirect4OnlinkNUD.def =head1 INITIALIZATION =begin html
  1. Clear IPv6 routes.
  2. Send RA with RouterLifetime=0 to clear the Default Router List.
  3. Set R1 as the default router by sending RA and NA.

  TN                 NUT
  ----------------------

State: NONCE (for all)
==== unsolicited RA ===> src=R1's link-local dst=all-node M=0, O=0 RouterLifetime=0 ReachableTime=0 RetransTimer=0
==== unsolicited RA ===> src=R1's link-local dst=all-node M=0, O=0 RouterLifetime=600 ReachableTime=0 RetransTimer=0 w/ SLLA Prefix Option: L=1, A=1 ValidLifetime=2592000 PreferredLifetime=604800 Prefix=3ffe:501:ffff:100::/64
State: STALE (for R1)
==== solicited NA ===> src=R1's link-local dst=NUT's link-local R=1, S=1, O=1 target=R1's link-local TLLA=R1's LLA
State: REACHABLE (for R1)
Wait (3 sec) for DAD NS
=end html =head1 TEST PROCEDURE B verifies that an entry of Destination Cache updated by a redirect message is removed by Neighbor Unreachability Detection. =begin html

  1. Send echo-request (src:H1, dst:NUT)
  2. Verify that NUT send echo-reply to the default router, R1
  3. Send redirect message to NUT.
  4. Send echo-request (src:H1, dst:NUT) again.
  5. Verify that NUT throw echo-reply to on-link.
  6. Wait for NC state to NONCE.
  7. Send echo-request (src:H1, dst:NUT) again.
  8. Verify that NUT send echo-reply to the default router, R1
  TN               NUT
  ----------------------

State: REACHABLE (for R1), NONCE (for H1)
==== echo-request ===> src=H1(off-link global), prefix=3ffe:501:ffff:109::/64, but LLA is R1's one dst=NUT's global, prefix=3ffe:501:ffff:100::/64
<=== Judgment #1: echo-reply ==== src=NUT's global, prefix=3ffe:501:ffff:100::/64 dst=H1(off-link global), prefix=3ffe:501:ffff:109::/64, but LLA is R1's one
==== redirect ===> src=R1's link-local dst=NUT's link-local icmp target=H1's global icmp destination=H1's global TLLA=H1's LLA w/o Redirected header
State: REACHABLE (for R1), STALE (for H1)
==== echo-request ===> src=H1(off-link global), prefix=3ffe:501:ffff:109::/64, but LLA is R1's one dst=NUT's global, prefix=3ffe:501:ffff:100::/64
<=== Judgment #2: echo-reply ==== src=NUT's global, prefix=3ffe:501:ffff:100::/64 dst=H1(off-link global), prefix=3ffe:501:ffff:109::/64, LLA is as same as TLLA option of the redirect message has.
State: REACHABLE (for R1), DELAY (for H1)
Wait (5 sec)
State: REACHABLE (for R1), PROBE (for H1)
Wait (3 sec)
State: REACHABLE (for R1), NONCE (for H1)
==== echo-request ===> src=H1(off-link global), prefix=3ffe:501:ffff:109::/64, but LLA is R1's one dst=NUT's global, prefix=3ffe:501:ffff:100::/64
<=== Judgment #1: echo-reply ==== src=NUT's global, prefix=3ffe:501:ffff:100::/64 dst=H1(off-link global), prefix=3ffe:501:ffff:109::/64, but LLA is R1's one
=end html =head1 JUDGMENT =for html 1. NUT must throw echo-reply whose destination is off-link global to the default router (i.e. R1). =for html 2. NUT must throw echo-reply to on-link. =head1 TERMINATION - Send RA with RouterLifetime=0 to clear the Default Router List. - Clear IPv6 routes with remote command. XXX =head1 NOTE The test invokes the following command: - Clear IPv6 routes =head1 SEE ALSO perldoc V6evalTool perldoc V6evalRemote =cut