#!/usr/bin/perl # # $Copyright$ # # $Id: ncStateByRs4Probe.seq,v 1.1.1.1 2000/10/31 22:39:03 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; $exit_rtn=$V6evalTool::exitPass; $idx=0; # # # $type=$V6evalTool::NutDef{Type}; if($type eq host) { vLogHTML("This test is for the router only
"); exit $V6evalTool::exitRouterOnly; } $type=$V6evalTool::NutDef{Type}; if($type ne router) { vLogHTML(ndErrmsg("ERROR: $V6evalTool::NutDef{Type}: ". "Unknown target type
")); exit $V6evalTool::exitFail; } # # sub test definition: # - sending pattern, # - SLLA vs cached LLA # - expected state # - message # $idx_ptn=0; $idx_lla=1; $idx_exp=2; $idx_explla=3; $idx_msg=4; $idx_inc_ip=5; $idx_prb_ip=6; $idx_rpy_ip=7; $idx_ign_ip=8; $idx_non_n=9; $idx_rpy_n=10; $idx_ign_n=11; $idx_stl_sr=12; $idx_ign_sr=13; # @null=(); $pktdesc{RAra_nut2allnode_any}="Got RA, but ignored"; @ignore=(RAra_nut2allnode_any); # @def_rs_tn2allrouter= ( rs_tn2allrouter, same, PROBE, unchanged, 'RS w/o SLL', \@null, \@null, \@null, \@ignore, \@null, \@null, \@null, \@null, \@null, ); # @def_rs_tn2allrouter_sll= ( rs_tn2allrouter_sll, same, PROBE, unchanged, 'RS w/ SLL', \@null, \@null, \@null, \@ignore, \@null, \@null, \@null, \@null, \@null, ); @def_rs_tn2allrouter_sll_diff= ( rs_tn2allrouter_sll, diff, STALE, updated, 'RS w/ SLL, diff. LLA', \@null, \@null, \@null, \@ignore, \@null, \@null, \@null, \@null, \@null ); # # # @defs= ( \@def_rs_tn2allrouter, \@def_rs_tn2allrouter_sll, \@def_rs_tn2allrouter_sll_diff, ); # # # vCapture($IF); # # # $idx=0; foreach(@defs) { $exp=@$_[$idx_exp]; $explla=@$_[$idx_explla]; $msg=@$_[$idx_msg]; vLogHTML("
"); vLogHTML("*** PROBE vs. $msg ***
"); $s=checkState($_); $c=ndCachedLLA($explla); if($s eq $exp && $c eq $explla) { $result{$idx}=$V6evalTool::exitPass; vLogHTML("OK: The target was $s/$c
"); } else { $exit_rtn=$V6evalTool::exitFail; $result{$idx}=$exit_rtn; vLogHTML("". ndErrmsg("NG: The target was $s/$c")."
"); } $title{$idx}="$msgexp:$exp/$expllaresult:$s/$c"; $idx++; } $idx--; # # # @col=('PTN', 'EXP(State/Cached LLA)', 'RESULT(State/Cached LLA)'); ndPrintSummaryHTML("*** Test Summary: PROBE vs. NS ***", @col, %title, %result, $idx); # # # vLogHTML("*** EOT ***
"); exit $exit_rtn; # # # sub checkState(\@) { my($def)=@_; my($ptn)=@$def[$idx_ptn]; my($lla)=@$def[$idx_lla]; my($exp)=@$def[$idx_exp]; my($msg)=@$def[$idx_msg]; my($inc_ip)=@$def[$idx_inc_ip]; my($prb_ip)=@$def[$idx_prb_ip]; my($rpy_ip)=@$def[$idx_rpy_ip]; my($ign_ip)=@$def[$idx_ign_ip]; my($non_n)=@$def[$idx_non_n]; my($rpy_n)=@$def[$idx_rpy_n]; my($ign_n)=@$def[$idx_ign_n]; my($stl_sr)=@$def[$idx_stl_sr]; my($ign_sr)=@$def[$idx_ign_sr]; vLogHTML("Initialization
"); if($lla eq same) { goto error if nd2Probe($IF) != 0; } else { goto error if nd2ProbeZ($IF) != 0; } vClear($IF); vLogHTML("Test
"); $pktdesc{$ptn}="Send $msg"; vSend($IF, $ptn); my($s)=ndStatusNum2Str(ndStatus( $IF, @$inc_ip, @$prb_ip, @$rpy_ip, @$ign_ip, @$non_n, @$rpy_n, @$ign_n, @$stl_sr, @$ign_sr, ) ); return $s; error: return("ERROR"); } ######################################################################## __END__ =head1 NAME ncStateByRs4Probe - Verifying State Machine: RS vs. PROBE =head1 TARGET Router Only =head1 SYNOPSIS ncStateByRs4Probe.seq [-tooloption ...] -p ncStateByRs4Probe.def =head1 INITIALIZATION =begin html
  1. Set the state of neighbor cache entry to REACHABLE.
  2. Cache either TN's LLA, or a bogus LLA
=head2 Cache a LLA of TN =begin html
  TN                 NUT
  ----------------------
  State: NONCE (for TN)

==== echo-request ===> src=TN's link-local dst=NUT's link-local
State: INCOMPLETE (for TN)
<=== multicast NS ==== src=NUT's link-local dst=solicited-node[TN's link-local] target=TN's link-local w/ SLLA timeout: RETRANS_TIMER * MAX_MULTICAST_SOLICIT
==== solicited NA ===> src=TN's link-local dst=NUT's link-local target=TN's link-local TLLA=TN's LLA
State: REACHABLE (for TN)
<=== echo-reply ==== src=NUT's link-local dst=TN's link-local timeout: 2 sec
Wait (REACHABLE_TIME * MAX_RANDOM_FACTOR)
State: STALE (for TN)
==== echo-request ===> src=TN's link-local dst=NUT's link-local
<=== echo-reply ==== src=NUT's link-local dst=TN's link-local timeout: 2 sec
State: DELAY (for TN)
Wait (DELAY_FIRST_PROBE_TIME)
State: PROBE (for TN)
=end html =head2 Cache a bogus LLA =begin html
  TN                 NUT
  ----------------------
  State: NONCE (for TN)

==== echo-request ===> src=TN's link-local dst=NUT's link-local
State: INCOMPLETE (for TN)
<=== multicast NS ==== src=NUT's link-local dst=solicited-node[TN's link-local] target=TN's link-local w/ SLLA timeout: RETRANS_TIMER * MAX_MULTICAST_SOLICIT
==== solicited NA ===> src=TN's link-local dst=NUT's link-local target=TN's link-local TLLA=a bogus LLA
State: REACHABLE (for TN)
<=== echo-reply ==== src=NUT's link-local dst=TN's link-local timeout: 2 sec
Wait (REACHABLE_TIME * MAX_RANDOM_FACTOR)
State: STALE (for TN)
==== echo-request ===> src=TN's link-local dst=NUT's link-local
<=== echo-reply ==== src=NUT's link-local dst=TN's link-local timeout: 2 sec
State: DELAY (for TN)
Wait (DELAY_FIRST_PROBE_TIME)
State: PROBE (for TN)
=end html =head1 TEST PROCEDURE B verifies that state transition for a NUT in PROBE state when receiving an RS. =begin html
  TN                 NUT
  ----------------------

State: PROBE (for TN)
==== RS ===>
Judgment: Examining NUT's neighbor cache state
=end html =head1 JUDGMENT =begin html
  ===============================+==========+=========+=================
  RS                             |New State |LLA       Comments
  ---------+-----------+---------+          |
  Source IP|Destination|SLLA     |          |
           |IP         |         |          |
  =========+===========+=========+==========+=========*=================
  TN's link all-router  none      PROBE      unchanged Not mentioned
                                                       in RFC2461
  ---------+-----------+---------+----------+---------+-----------------
  TN's link all-router  same      PROBE      unchanged
  ---------+-----------+---------+----------+---------+-----------------
  TN's link all-router  different STALE      updated
  =========+===========+=========+==========+=========+=================
=end html =head1 TERMINATION N/A =head1 NOTE TBD =head1 REFERENCE =begin html
6.2.6.  Processing Router Solicitations

Router Solicitations in which the Source Address is the unspecified address MUST NOT update the router's Neighbor Cache; solicitations with a proper source address update the Neighbor Cache as follows. If the router already has a Neighbor Cache entry for the solicitation's sender, the solicitation contains a Source Link-Layer Address option, and the received link-layer address differs from that already in the cache, the link-layer address SHOULD be updated in the appropriate Neighbor Cache entry, and its reachability state MUST also be set to STALE. If there is no existing Neighbor Cache entry for the solicitation's sender, the router creates one, installs the link- layer address and sets its reachability state to STALE as specified in Section 7.3.3. Whether or not a Source Link-Layer Address option is provided, if a Neighbor Cache entry for the solicitation's sender exists (or is created) the entry's IsRouter flag MUST be set to FALSE.
=end html =head1 SEE ALSO perldoc V6evalTool perldoc V6evalRemote =cut