#!/usr/bin/perl # # $Copyright$ # # $Id: sendNsBasicLocal.seq,v 1.1.1.1 2000/09/28 00:14:48 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; $wait_ns=$nd::RETRANS_TIMER * $nd::MAX_MULTICAST_SOLICIT; $wait_echo=2; $wait_stale=$nd::REACHABLE_TIME * $nd::MAX_RANDOM_FACTOR + 1; $wait_probe=$nd::DELAY_FIRST_PROBE_TIME + 1; # # Start capture buffer # vLogHTML("Test
"); vCapture($IF); # # Set NC to REACHABLE # $pktdesc{echo_request}= "Send echo-request (link-local ==> link-local)"; vSend($IF, echo_request); vLogHTML("Want NS if any
"); vSleep(1); $pktdesc{na}= "Send solicited NA (link-local ==> link-local)"; vSend($IF, na); $pktdesc{echo_reply}= "Got echo-reply (link-local <== link-local)"; $pktdesc{unicast_ns}= 'Got unicast NS (link-local <== link-local)'; $pktdesc{unicast_ns_sll}= 'Got unicast NS (link-local <== link-local)'; $pktdesc{multicast_ns}= 'Got multicast NS (multicast <== link-local)'; while(1) { $s=check($wait_echo, 0, 1); if($s eq ECHO_REPLY) { last; } elsif($s eq TIMEOUT) { vLogHTML(ndErrmsg("ERROR: Never got echo-reply
")); goto error; } } vLogHTML("Then REACHABLE
"); # # Wait for beeing STALE state. # vLogHTML("Wait for being STALE ($wait_stale sec.)
"); vSleep($wait_stale); vLogHTML("Then STALE
"); # # # $pktdesc{echo_request}= "Send echo-request (link-local ==> link-local)"; %ret=vSend($IF, echo_request); $pktdesc{echo_reply}= "Got echo-reply (link-local <== link-local), then DELAY"; $pktdesc{unicast_ns}= ndErrmsg('ERROR: Got unicast NS (link-local <== link-local)'); $pktdesc{unicast_ns_sll}= ndErrmsg('ERROR Got unicast NS (link-local <== link-local)'); $pktdesc{multicast_ns}= ndErrmsg('ERROR: Got multicast NS (multicast <== link-local)'); $s=check($wait_echo, $ret{sentTime1}, 1); if($s ne ECHO_REPLY) { vLogHTML(ndErrmsg("ERROR: Never got echo-reply
")); goto error; } # # # vLogHTML("Wait for being PROBE ($wait_probe sec.), then unicast NS
"); $pktdesc{echo_reply}= ndErrmsg("ERROR: Got echo-reply (link-local <== link-local)"); $pktdesc{unicast_ns}= 'Got unicast NS (link-local <== link-local), then PROBE'; $pktdesc{unicast_ns_sll}= 'Got unicast NS (link-local <== link-local), then PROBE'; $pktdesc{multicast_ns}= ndErrmsg('ERROR: Got multicast NS (multicast <== link-local)'); $count=0; while(1) { $s = check($wait_probe, 0, 1); if($s eq UNICAST_NS) { $count++; if($count > $nd::MAX_MULTICAST_SOLICIT) { vLogHTML("Too many unicast NS (> $nd::MAX_UNICAST_SOLICIT)"); $exit_rtn=$V6evalTool::exitFail; last; } } elsif($s eq TIMEOUT) { last; } else { $exit_rtn=$V6evalTool::exitFail; } } if($count==0) { vLogHTML(ndErrmsg("ERROR: Never got unicast NS
")); goto error; } vLogHTML("Then NONCE
"); # # # $pktdesc{echo_request}= "Send echo-request"; %ret=vSend($IF, echo_request); # # # vLogHTML("Wait for a multicast NS
"); $pktdesc{echo_reply}= ndErrmsg("ERROR: Got echo-reply (link-local <== link-local)"); $pktdesc{unicast_ns}= ndErrmsg('ERROR: Got unicast NS (link-local <== link-local)'); $pktdesc{unicast_ns_sll}= ndErrmsg('ERROR: Got unicast NS (link-local <== link-local)'); $pktdesc{multicast_ns}= 'Got multicast NS (multicast <== link-local), then INCOMPLETE'; $count=0; while(1) { $s = check($wait_ns, $ret{sentTime1}, 1); if($s eq TIMEOUT) { last; } elsif($s eq MULTICAST_NS) { $count++; if($count > $nd::MAX_MULTICAST_SOLICIT) { vLogHTML("Too many unicast NS (> $nd::MAX_MULTICAST_SOLICIT)"); $exit_rtn=$V6evalTool::exitFail; last; } } else { $exit_rtn=$V6evalTool::exitFail; } } if($count==0) { vLogHTML(ndErrmsg("ERROR: Never got multicast NS
")); goto error; } vLogHTML("Then NONCE
"); # # # if($exit_rtn == $V6evalTool::exitPass) { vLogHTML("OK
"); } else { vLogHTML("NG
"); } exit $exit_rtn; error: vLogHTML(vErrmsg(%ret)."
"); vLogHTML(ndErrmsg("NG
")); exit $V6evalTool::exitFail; # # # sub check($$$) { my($timeout, $recvtime, $count)=@_; my(%ret)=vRecv($IF, $timeout, $recvtime, $count, unicast_ns, unicast_ns_sll, multicast_ns, echo_reply, ); if($ret{status} == 1) { return TIMEOUT; } elsif($ret{status} == 0) { if($ret{recvFrame} eq unicast_ns || $ret{recvFrame} eq unicast_ns_sll) { return UNICAST_NS; } elsif($ret{recvFrame} eq multicast_ns) { return MULTICAST_NS; } else { return ECHO_REPLY; } } else { vLogHTML(vErrmsg(%ret)."
"); return ERROR; } } ######################################################################## __END__ =head1 NAME sendNsBasicLocal - Verify that NUT send NSs (link ==> link) =head1 TARGET Host and Router =head1 SYNOPSIS sendNsBasicLocal.seq [-tooloption ...] -pkt sendNsBasicLocal.def =head1 INITIALIZATION =begin html
  1. Set NC state for TN to REACHABLE
=end html TN NUT ---------------------- State: any (for TN) ==== echo-request ===> src=NUT's link-locallink dst=TN's link-local ==== solicited NA ===> src=TN's link-local dst=NUT's link-local w/ TLLA State: REACHABLE (for TN) <=== echo-reply ==== src=NUT's link-local dst=TN's link-local =head1 TEST PROCEDURE B verifies that NUT send valid NSs in both INCOMPLETE state and PROBE state. =begin html
  TN                 NUT
  ----------------------

State: REACHABLE (for TN)
Wait (REACHABLE_TIME * MAX_RANDOM_FACTOR)
State: STALE (for TN)
==== echo-request ===> src=TN's link-local dst=NUT's link-local
<=== Judgment #1: echo-reply ==== src=NUT's link-local dst=TN's link-local timeout: 2 sec
State: DELAY
Wait (DELAY_FIRST_PROBE_TIME)
State: PROBE
<=== Judgment #2: unicast NS ==== src=TN's link-local dst=NUT's link-local w/ or w/o SLLA timeout: RETRANS_TIMER * MAX_UNIICAST_SOLICIT
State: NONCE (for TN)
==== echo-request ===> src=NUT's link-locallink dst=TN's link-local
State: INCOMPLETE
<=== Judgment #3: multicast NS ==== src=NUT's link-local dst=sol-node[TN's link-local] w/ SLLA timeout: RETRANS_TIMER * MAX_MULTICAST_SOLICIT
State: NONCE (for TN)
=end html =head1 JUDGMENT =begin html

  1. NUT must send one echo-reply:
     src: link, dst: link

  2. NUT must send at the most three unicast NSs:
     src: link, dst: link, w/ or w/o SLLA

  3. NUT must send at the most three multicast NSs:
     src: link(SHOULD), dst: link, w/ SLLA
=end html =head1 TERMINATION N/A =head1 NOTE The test does not invoke any remote command. =head1 REFERENCE =begin html
RFC2461

7.2.2. Sending Neighbor Solicitations
When a node has a unicast packet to send to a neighbor, but does not know the neighbor's link-layer address, it performs address resolution. For multicast-capable interfaces this entails creating a Neighbor Cache entry in the INCOMPLETE state and transmitting a Neighbor Solicitation message targeted at the neighbor. The solicitation is sent to the solicited-node multicast address corresponding to the target address.
If the source address of the packet prompting the solicitation is the same as one of the addresses assigned to the outgoing interface, that address SHOULD be placed in the IP Source Address of the outgoing solicitation. Otherwise, any one of the addresses assigned to the interface should be used. Using the prompting packet's source address when possible insures that the recipient of the Neighbor Solicitation installs in its Neighbor Cache the IP address that is highly likely to be used in subsequent return traffic belonging to the prompting packet's "connection".
=end html =head1 SEE ALSO perldoc V6evalTool perldoc V6evalRemote =cut