#!/usr/bin/perl # # $Copyright$ # # $Id: ncStateByNa4Incomplete.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; $exit_rtn=$V6evalTool::exitPass; # # 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=(); # @reply_unicast_na_tn2nut_rso=(nd_echo_reply); @def_unicast_na_tn2nut_rso= ( unicast_na_tn2nut_rso, same, INCOMPLETE, unchanged, 'unicast rso NA w/o TLL', \@null, \@null, \@reply_unicast_na_tn2nut_rso, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_unicast_na_tn2nut_rsO=(nd_echo_reply); @def_unicast_na_tn2nut_rsO= ( unicast_na_tn2nut_rsO, same, INCOMPLETE, unchanged, 'unicast rsO NA w/o TLL', \@null, \@null, \@reply_unicast_na_tn2nut_rsO, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_unicast_na_tn2nut_rSo=(nd_echo_reply); @def_unicast_na_tn2nut_rSo= ( unicast_na_tn2nut_rSo, same, INCOMPLETE, unchanged, 'unicast rSo NA w/o TLL', \@null, \@null, \@reply_unicast_na_tn2nut_rSo, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_unicast_na_tn2nut_rSO=(nd_echo_reply); @def_unicast_na_tn2nut_rSO= ( unicast_na_tn2nut_rSO, same, INCOMPLETE, unchanged, 'unicast rSO NA w/o TLL', \@null, \@null, \@reply_unicast_na_tn2nut_rSO, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_unicast_na_tn2nut_rso_tll=(nd_echo_reply); @def_unicast_na_tn2nut_rso_tll= ( unicast_na_tn2nut_rso_tll, same, STALE, unchanged, 'unicast rso NA w/ TLL', \@null, \@null, \@reply_unicast_na_tn2nut_rso_tll, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_unicast_na_tn2nut_rsO_tll=(nd_echo_reply); @def_unicast_na_tn2nut_rsO_tll= ( unicast_na_tn2nut_rsO_tll, same, STALE, unchanged, 'unicast rsO NA w/ TLL', \@null, \@null, \@reply_unicast_na_tn2nut_rsO_tll, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_unicast_na_tn2nut_rSo_tll=(nd_echo_reply); @def_unicast_na_tn2nut_rSo_tll= ( unicast_na_tn2nut_rSo_tll, same, REACHABLE, unchanged, 'unicast rSo NA w/ TLL', \@null, \@null, \@reply_unicast_na_tn2nut_rSo_tll, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_unicast_na_tn2nut_rSO_tll=(nd_echo_reply); @def_unicast_na_tn2nut_rSO_tll= ( unicast_na_tn2nut_rSO_tll, same, REACHABLE, unchanged, 'unicast rSO NA w/ TLL', \@null, \@null, \@reply_unicast_na_tn2nut_rSO_tll, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_ef_multicast_na_tn2allnode_rso=(nd_echo_reply); @def_multicast_na_tn2allnode_rso= ( multicast_na_tn2allnode_rso, same, INCOMPLETE, unchanged, 'multicast rso NA w/o TLL (INVALID)', \@null, \@null, \@reply_ef_multicast_na_tn2allnode_rso, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_multicast_na_tn2allnode_rsO=(nd_echo_reply); @def_multicast_na_tn2allnode_rsO= ( multicast_na_tn2allnode_rsO, same, INCOMPLETE, unchanged, 'multicast rsO NA w/o TLL (INVALID)', \@null, \@null, \@reply_multicast_na_tn2allnode_rsO, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_multicast_na_tn2allnode_rSo=(nd_echo_reply); @def_multicast_na_tn2allnode_rSo= ( multicast_na_tn2allnode_rSo, same, INCOMPLETE, unchanged, 'multicast rSo NA w/o TLL (INVALID)', \@null, \@null, \@reply_multicast_na_tn2allnode_rSo, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_multicast_na_tn2allnode_rSO=(nd_echo_reply); @def_multicast_na_tn2allnode_rSO= ( multicast_na_tn2allnode_rSO, same, INCOMPLETE, unchanged, 'multicast rSO NA w/o TLL (INVALID)', \@null, \@null, \@reply_multicast_na_tn2allnode_rSO, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_multicast_na_tn2allnode_rso_tll=(nd_echo_reply); @def_multicast_na_tn2allnode_rso_tll= ( multicast_na_tn2allnode_rso_tll, same, STALE, unchanged, 'multicast rso NA w/ TLL', \@null, \@null, \@reply_multicast_na_tn2allnode_rso_tll, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_multicast_na_tn2allnode_rsO_tll=(nd_echo_reply); @def_multicast_na_tn2allnode_rsO_tll= ( multicast_na_tn2allnode_rsO_tll, same, STALE, unchanged, 'multicast rsO NA w/ TLL', \@null, \@null, \@reply_multicast_na_tn2allnode_rsO_tll, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_multicast_na_tn2allnode_rSo_tll=(nd_echo_reply); @def_multicast_na_tn2allnode_rSo_tll= ( multicast_na_tn2allnode_rSo_tll, same, INCOMPLETE, unchanged, 'multicast rSo NA w/ TLL (INVALID)', \@null, \@null, \@reply_multicast_na_tn2allnode_rSo_tll, \@null, \@null, \@null, \@null, \@null, \@null ); # @reply_multicast_na_tn2allnode_rSO_tll=(nd_echo_reply); @def_multicast_na_tn2allnode_rSO_tll= ( multicast_na_tn2allnode_rSO_tll, same, INCOMPLETE, unchanged, 'multicast rSO NA w/ TLL (INVALID)', \@null, \@null, \@reply_multicast_na_tn2allnode_rSO_tll, \@null, \@null, \@null, \@null, \@null, \@null ); # @defs= ( \@def_unicast_na_tn2nut_rso, \@def_unicast_na_tn2nut_rsO, \@def_unicast_na_tn2nut_rSo, \@def_unicast_na_tn2nut_rSO, \@def_unicast_na_tn2nut_rso_tll, \@def_unicast_na_tn2nut_rsO_tll, \@def_unicast_na_tn2nut_rSo_tll, \@def_unicast_na_tn2nut_rSO_tll, \@def_multicast_na_tn2allnode_rso, \@def_multicast_na_tn2allnode_rsO, \@def_multicast_na_tn2allnode_rSo, \@def_multicast_na_tn2allnode_rSO, \@def_multicast_na_tn2allnode_rso_tll, \@def_multicast_na_tn2allnode_rsO_tll, \@def_multicast_na_tn2allnode_rSo_tll, \@def_multicast_na_tn2allnode_rSO_tll, ); # # # vCapture($IF); # # # $idx=0; foreach(@defs) { $exp=@$_[$idx_exp]; $explla=@$_[$idx_explla]; $msg=@$_[$idx_msg]; vLogHTML("
"); vLogHTML("*** INCOMPLETE 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: INCOMPLETE vs. NA ***", @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
"); goto error if nd2Incomplete($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 ncStateByNa4Incomplete - Verifying State Machine: NA vs. INCOMPLETE =head1 TARGET Host and Router =head1 SYNOPSIS ncStateByNa4Incomplete.seq [-tooloption ...] -p ncStateByNa4Incomplete.def =head1 INITIALIZATION Set the state of neighbor cache entry to INCOMPLETE. TN NUT ---------------------- State: NONCE (for TN) ==== echo-request ===> src=TN's link-local dst=NUT's link-local State: INCOMPLETE (for TN) =head1 TEST PROCEDURE B verifies that state transition for a NUT in INCOMPLETE state when receiving a NA. =begin html
  TN               NUT
  ----------------------

State: INCOMPLETE (for TN)
==== NA ===> src=TN's link-local dst=NUT's link-local or all-node w/o or w/ TLLA r=0, s=0/1, o=0/1
Judgment: Examining NUT's neighbor cache state
=end html =head1 JUDGMENT =begin html

7.2.5. Receipt of Neighbor Advertisements
If the target's Neighbor Cache entry is in the INCOMPLETE state when the advertisement is received, one of two things happens. IF(no TLLA option) { If the link layer has addresses and no Target Link-Layer address option is included, the receiving node SHOULD silently discard the received advertisement. } ELSE { Otherwise, the receiving node performs the following steps: - It records the link-layer address in the Neighbor Cache entry.
- IF(Solicited flag == 1) { If the advertisement's Solicited flag is set, the state of the entry is set to REACHABLE, } ELSE { otherwise it is set to STALE. }
- It sets the IsRouter flag in the cache entry based on the Router flag in the received advertisement.
- It sends any packets queued for the neighbor awaiting address resolution. }
Note that the Override flag is ignored if the entry is in the INCOMPLETE state.
===============================+===============+============= NA |New State |cached LLA --------------+-+--+-+---------+ | Destination |r| s|o|TLLA | | ==============+=+==+=+=========+===============+============= Unicast 0 0 0 none INCOMPLETE unchanged --------------+-+--+-+---------+---------------+------------- Unicast 0 0 1 none INCOMPLETE unchanged --------------+-+--+-+---------+---------------+------------- Unicast 0 1 0 none INCOMPLETE unchanged --------------+-+--+-+---------+---------------+------------- Unicast 0 1 1 none INCOMPLETE unchanged ==============+=+==+=+=========+===============+============= Unicast 0 0 0 exist STALE *updated --------------+-+--+-+---------+---------------+------------- Unicast 0 0 1 exist STALE *updated --------------+-+--+-+---------+---------------+------------- Unicast 0 1 0 exist REACHABLE *updated --------------+-+--+-+---------+---------------+------------- Unicast 0 1 1 exist REACHABLE *updated ==============+=+==+=+=========+===============+============= *Multicast 0 0 0 *none INCOMPLETE unchanged *invalid --------------+-+--+-+---------+---------------+------------- *Multicast 0 0 1 *none INCOMPLETE unchanged *invalid --------------+-+--+-+---------+---------------+------------- *Multicast 0 *1 0 *none INCOMPLETE unchanged *invalid --------------+-+--+-+---------+---------------+------------- *Multicast 0 *1 1 *none INCOMPLETE unchanged *invalid ==============+=+==+=+=========+===============+============= Multicast 0 0 0 exist STALE *updated --------------+-+--+-+---------+---------------+------------- Multicast 0 0 1 exist STALE *updated --------------+-+--+-+---------+---------------+------------- *Multicast 0 *1 0 exist INCOMPLETE unchanged *invalid --------------+-+--+-+---------+---------------+------------- *Multicast 0 *1 1 exist INCOMPLETE unchanged *invalid ==============+=+==+=+=========+===============+=============
=end html =head1 TERMINATION N/A =head1 NOTE The test does not invoke any remote command. =head1 SEE ALSO perldoc V6evalTool perldoc V6evalRemote =cut