#!/usr/bin/perl
#
# $Intap$
# $TINY: LLA_DAD_NSPostDAD_SrcDstUni.seq,v 1.5 2002/03/05 03:04:56 masaxmasa Exp $
# 

########################################################################
BEGIN { $V6evalTool::TestVersion = '$Name:  $ '; }
use V6evalTool;
use SAA;

#------------------------------------------------------
#----- get sequence arguments
#------------------------------------------------------
$howto_initNUT="none";
$send = "ok";
foreach (@ARGV) {
# How to configure address of NUT?
# sample: boot, ra, manual+_GLOBAL0A0N_UCAST
    /^addrconf=(\S+)/ && do {$SAA::howto_addrconf=$1; next; };

# How to initialize NUT?
# sample: none, DADSuccess_boot, DADFail_boot
    /^init=(\S+)/     && do {$howto_initNUT=$1; next; };

# "none" if send no pakcet to NUT in state DADPostSendNS
# sample: ok, none
    /^send=(\S+)/     && do {$send=$1; next; };

# sequence debug options
# sample: qR
    /^sd=(\S+)/       && do {$seqdebugopt=$1; next; };
    seqERROR("Unknown sequence option '$_'");
}
#------------------------------------------------------

#----- test condition
$IF=Link0;                 # network interface

$max_retry_count = 10;     # retry if NUT state becomes DADPostSendNS
$max_retry_count = 2 if $SAA::sd =~ /q/;    # quick retry
$send_interval  = 1;
	       # 1[sec] time between DAD NS and DAD NS, send to NUT
               #     (RandomDelay is 0-1sec  e.g. default RetransTimer 1000msec)

##########################################################
#----- Check Target Type

$type=$V6evalTool::NutDef{Type};
if($type eq host) {
    vCPP('-DRFLAG=0');
}
if($type eq router) {
    vCPP('-DRFLAG=1');
}


##########################################################
#----- Preparetion
vCapture($IF);
seqPrepareLLA($IF, $V6evalTool::NutDef{System});


#----- initialize NUT
vLog("*** Target initialization phase ***");
if($V6evalTool::NutDef{System} ne "manual"){ vSleep($SAA::test_interval); }
$rret=vRemote("reboot_async.rmt","","timeout=$SAA::wait_rebootcmd");
vLog("reboot_async.rmt returned status $rret");

#----- start Capturing
vLog("*** Target testing phase ***");
vClear($IF);

#----- Wait DAD NS from NUT or timeout
vLog("TN wait DAD NS(DADNS_from_NUT) from NUT for $SAA::wait_dadns{$SAA::howto_addrconf} [sec],");

%ret=vRecv($IF,$SAA::wait_dadns{$SAA::howto_addrconf},0,$count,DADNS_from_NUT);

if ($ret{status} == 0){
    %retSend=vSend($IF, NS_from_TN_SrcDstUni);

    #----- check if NUT's address is configured
    vSleep($SAA::wait_addrconf);
    if (seqCheckNUTAddrConfigured($IF) eq TRUE) {
	vLog("NUT assigned the address to the interface.");
	if ($SAA::DupAddrDetectTransmits == 0) {
	    vLog("NUT transmit DAD NS though DupAddrDetectTransmits == 0");
	    seqNG();
	}else{
	    seqOK();
	}
    }else{
	vLog("Though source address of NS is unicast,");
	vLog(" NUT seems to detect Address Duplication");
	seqNG();
    }
} else{
    vLog("TN wait DAD NS from NUT for $SAA::wait_dadns{$SAA::howto_addrconf}, but NUT had not transmit DAD NS");
    seqNG();
}
##########################################################


#end
########################################################################
__END__

=head1 NAME

LLA_DAD_NSPostDAD_SrcDstUni - check the process when NUT receives NS for address resolution(Src=Unicast,Dst=Unicast) after transmitting DAD NS

=head1 TARGET

All Node

=head1 SYNOPSIS

LLA_DAD_NSPostDAD_SrcDstUni.seq [-tooloption ...] -pkt <packetdef> [addrconf=<addrconfname>] 

  -tooloption   : v6eval tool option
  <packetdef>   : packet definition file (v6eval tool option)
  <addrconfname>: how to configure address on NUT; boot/reboot

=begin html
<PRE>
 detail of v6eval tool option: see perldoc V6evalTool.pm, perldoc V6evalRemote.pm
</PRE>

=end html


=head1 INITIALIZATION

=begin html
<PRE>
 Reboot NUT or Initialize interface of NUT or Initialize IPv6 stack of NUT.
</PRE>

=end html

=head1 TEST PROCEDURE

=over 1

=item Test for Unicast address configuration

The following tests are prepared in this test package. See INDEX file.

B<Test for all node>

   NUT assignes autoconfigured address, even though NUT receives NS for address
   resolution while DAD process (after transmitting DAD NS).

B<Test sequence>

  TN                            NUT
  ---------------------------------
  Initialize NUT

  Configure address of NUT (reboot or interface initialization etc...)

  TN wait the DAD NS sent from NUT
  <=== Judgement #1: DAD NS =======
        name: DADNS_from_NUT

  ==== Action #1: NS =============>
        name: NS_from_TN_SrcDstUni

  Wait for 5+DupAddrDetectTransmits*(RetransTimer/1000)[sec]

  Check if NUT's address is configured
  ==== Action #2: SOL NS =========>
        name: SOLNS_from_TN_SameTgt

  <=== Judgement #2: SOL NA =======
        name: NA_from_NUT, NA_from_NUT_woTLL


=back 1

=head1 JUDGEMENT

=over 1

=item Test for Link-local Unicast address autoconfiguration

B<Test for all NODE>

B<NUT performs Stateless Address Autoconfiguration(Link-local) on its interface>

   Judgement #1. NUT MUST transmit DAD NS for its autoconfigured Link-local address.
        name: DADNS_from_NUT
	src: ::0
	dst: solnode[NUT's tentative Link-local]
        TargetAddress: NUT's tentative Link-local

   Action #1. TN transmits NS which contains unicast as source address for NUT's
 tentative Link-local address
        name: NS_from_TN_SrcDstUni
	src: TN's Link-local
	dst: NUT's tentative Link-local
        TargetAddress: NUT's tentative Link-local

   Action #2. TN transmits SOL NS to check if NUT's address is configured
        name: SOLNS_from_TN_SameTgt
        src: TN's Link-local
	dst: solnode[NUT's Link-local]
        TargetAddress: NUT's Link-local

   Judgement #2. NUT MUST transmit SOL NA for its autoconfigured  Link-local address.
        name: NA_from_NUT, NA_from_NUT_woTLL
	src: NUT's Link-local
	dst: TN's Link-local
        TargetAddress: NUT's Link-local
        RFlag: 0 ( if NUT is a Router then 1)
        SFlag: 1
        OFlag: 1
	TLLOPT: NUT's MAC address

=back 1

=head1 REFERENCE

=begin html
<PRE>
RFC2462
<HR>
   (omit)
5.4.3.  Receiving Neighbor Solicitation Messages
<BR>
   On receipt of a valid Neighbor Solicitation message on an interface,
   node behavior depends on whether the target address is tentative or
   not.  If the target address is not tentative (i.e., it is assigned to
   the receiving interface), the solicitation is processed as described
<A NAME="REF">   
   in [DISCOVERY].  <B>If the target address is tentative, and the source
   address is a unicast address, the solicitation's sender is performing
   address resolution on the target; the solicitation should be silently
   ignored.</B>  Otherwise, processing takes place as described below. <B>In
   all cases, a node MUST NOT respond to a Neighbor Solicitation for a
   tentative address.</B>
</A>
<BR>
   (omit)
</PRE>

=end html

=head1 SEE ALSO

=begin html
<PRE>
 detail of v6eval tool option: see perldoc V6evalTool.pm, perldoc V6evalRemote.pm
</PRE>

=end html

=cut

