#!/usr/bin/perl # # $Copyright$ # # $Id: hostRecvRedirect4RouterLifetime02.seq,v 1.1.1.1 2000/10/31 22:39:00 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; $exit_rtn=$V6evalTool::exitPass; # # # $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; goto error if ndClearRoutes() != 0; goto error if nd2NoNce($IF) != 0; # # # vLogHTML("Set R1 as the default 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)"; vSend($IF, redirect_rone2nut_tll); # # # vLogHTML("*** Verify that RouterLifetime=0 removes Destination Cache entry ***
"); $pktdesc{ra_tn2allnode_clrrtr}= "Send RA w/ RouterLifetime=0"; vSend($IF, ra_tn2allnode_clrrtr); # # # $s=isRedirected($IF); if($s eq IGNORED) { vLogHTML("The redirected entry was deleted
"); } elsif($s eq REDIRECTED) { vLogHTML(ndWarnmsg("WARN: The echo-reply was thrown to the second router ". "whose RouterLifetime is 0.
")); vLogHTML("*** The next step is to verify ". "that NUD delete the redirected entry. ***
"); $exit_rtn=$V6evalTool::exitWarn; } else { goto error; } # # # vLogHTML("Wait unicast NS
"); $t=$wait_nonce; $t*=2 if $V6evalTool::NutDef{System} =~ /solaris/ ; # patch for solaris vRecv($IF, $t, 0, 0); # # # $s=isRedirected($IF); if($s ne IGNORED) { vLogHTML("The echo-reply was thrown to the second router ". "whose RouterLifetime is 0
") if $s eq REDIRECTED; vLogHTML(ndErrmsg("ERROR: NUD does not work at redirected entry
")); goto error; } # # # end: vLogHTML("
Termination
"); clear(); vLogHTML("*** OK ***
"); exit $exit_rtn; error: vLogHTML("
Termination
"); clear(); vLogHTML(ndErrmsg("*** NG ***
")); vLogHTML(vErrmsg(%ret)."
"); exit $V6evalTool::exitFail; ######################################################################## sub isRedirected($) { my($if)=@_; my(%ret, $p); # # # $pktdesc{echo_reply_b}= 'Got echo-reply that was thrown to the default router (R1)'; $pktdesc{echo_reply_b2}= 'Got echo-reply that was thrown to the second router (TN)'; $pktdesc{multicast_ns_nut2tnsol_sll}= "Got multicast NS for TN"; $pktdesc{echo_request_b}= "Send echo-request that is forwarded from the default router (R1)"; $p=echo_request_b; while(1) { %ret=vSend($if, $p); %ret=vRecv($if, $wait_echo, $ret{sentTime1}, 0, echo_reply_b, echo_reply_b2, multicast_ns_nut2tnsol_sll, ); goto error if $ret{status} != 0; # # # $p=""; if($ret{recvFrame} eq echo_reply_b) { vLogHTML("Redirect is ignored
"); return("IGNORED"); } elsif($ret{recvFrame} eq echo_reply_b2) { vLogHTML("Redirect is accepted
"); return("REDIRECTED"); } elsif($ret{recvFrame} eq multicast_ns_nut2tnsol_sll) { # do nothing } else { vLogHTML(ndErrmsg("ERROR: Got unexpected packet
")); goto error; } } error: vLogHTML(vErrmsg(%ret)."
"); return ERROR; } sub clear() { $pktdesc{ra_rone2allnode_clrrtr}= 'Clear R1 from the Default Router List'; $pktdesc{ra_tn2allnode_clrrtr}= 'Clear TN from the Default Router List'; vSend($IF, ra_rone2allnode_clrrtr, ra_tn2allnode_clrrtr, ); } ######################################################################## __END__ =head1 NAME hostRecvRedirect4RouterLifetime02 - Verifying Redirect (to a better router) vs. RA w/ RouterLifetime=0 =head1 TARGET Host only =head1 SYNOPSIS hostRecvRedirect4RouterLifetime02.seq [-tooloption ...] -p hostRecvRedirect4RouterLifetime02.def =head1 INITIALIZATION =begin html
  1. Clear IPv6 routes.
  2. Clear NC state for TN.
  3. Set R1 as the default router by sending RA and NA.
  4. Set TN as the second router by sending RA and NA.

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

State: NONCE (for R1, TN)
==== 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), NONCE (for TN)
==== 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), NONCE (for TN)
Wait (3 sec) for DAD NS
=end html =head1 TEST PROCEDURE B verifies that an entry of Destination Cache updated by a redirect message (ICMP Target != ICMP Destination) is removed by RA w/ RouterLifetime=0. =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 RA whose RouterLifetime is 0.
  5. Send echo-request (src:H1, dst:NUT) again.
    1. CASE 1:
      Verify that NUT send echo-reply to the default router, R1.
    2. CASE 2:
      Verify that NUT send echo-reply to the better router, TN,
      but NUD flush the redirected entries.
  TN               NUT
  ----------------------

State: REACHABLE (for R1), NONCE (for TN)
==== 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=TN's link-local icmp destination=H1's global w/ TLLA w/o Redirected header
State: REACHABLE (for R1), STALE (for TN)
==== unsolicited RA ===> src=TN's link-local dst=all-node M=0, O=0 RouterLifetime=0 ReachableTime=0 RetransTimer=0 w/ SLLA
==== 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
CASE 1: Redirected entries are flushed by RA w/ RouterLifetime=0 ********************************************************************
<=== 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
State: REACHABLE (for R1), STALE (for TN)
********************************************************************
CASE 2: Redirected entries are flushed by not RA w/ RouterLifetime=0, but Neighbor Unreachability Detection. ********************************************************************
<=== 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, but LLA is TN's one
State: REACHABLE (for R1), DELAY (for TN)
Wait (5 sec)
State: REACHABLE (for R1), PROBE (for TN)
<=== NS ==== src=NUT's link-local dst=TN's link-local target=TN's link-local
<=== NS ==== src=NUT's link-local dst=TN's link-local target=TN's link-local
<=== NS ==== src=NUT's link-local dst=TN's link-local target=TN's link-local
State: REACHABLE (for R1), NONCE (for TN)
==== 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 whose destination is off-link global to the better router (i.e. TN). =for html =head1 TERMINATION Send RA with RouterLifetime=0 to clear the Default Router List. XXX Clear IPv6 routes by remote command. XXX =head1 NOTE =begin html
  1. It is not fail that NUT does not flush the redirected entries
     with RA w/ RouterLifetime=0. Because RFC2461 does not mention
     the case where a router's address is not present in NUT's
     Default Router List and received Router Lifetime value is zero:

6.3.4. Processing Received Router Advertisements
On receipt of a valid Router Advertisement, a host extracts the source address of the packet and does the following:
- If the address is not already present in the host's Default Router List, and the advertisement's Router Lifetime is non- zero, create a new entry in the list, and initialize its invalidation timer value from the advertisement's Router Lifetime field.
- If the address is already present in the host's Default Router List as a result of a previously-received advertisement, reset its invalidation timer to the Router Lifetime value in the newly-received advertisement.
- If the address is already present in the host's Default Router List and the received Router Lifetime value is zero, immediately time-out the entry as specified in Section 6.3.5.
If NUT is so, the test veirfy if NUT's NUD can flush the redirected entries or not. However, if NUT's Reachable Time is long, the redirected efntries will remain for a while. This is why the test judges NUT WARN in sted of FAIL in the case.
2. The test invokes the following command: - Clear IPv6 routes
=end html =head1 SEE ALSO perldoc V6evalTool perldoc V6evalRemote =cut