#!/usr/bin/perl
#
# $Intap$
# $TINY: LLA_DAD_NAPostDAD_SameTgt.seq,v 1.6 2002/03/05 03:04:55 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, DADNA_from_TN_SameTgt);

    #----- 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{
	    seqNG();
	}
    }else{
	vLog("NUT seems to detect Address Duplication");
	seqOK();
    }
} 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_NAPostDAD_SameTgt - check the process when NUT receives DAD NA with same Target address while DAD process(after transmitting DAD NS).

=head1 TARGET

All Node

=head1 SYNOPSIS

LLA_DAD_NAPostDAD_SameTgt.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>

   When NUT performs DAD for its Link-local unicast address made by stateless
   address autoconfiguration, NUT receives DAD NA which contains same target as
   NUT's tentative Link-local address after transimitting 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: DAD NA =========>
        name: DADNA_from_TN_SameTgt

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

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

  X<== 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 DAD NA which contains same target Address as NUT's tentative Link-local address.
        name: DADNA_from_TN_SameTgt
	src: NUT's Link-local
	dst: allnode
        TargetAddress: NUT's tentative Link-local
        RFlag: 0
        SFlag: 0
        OFlag: 1
	OLLOPT: TN's MAC address

   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 NOT 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>
<BR>
   (omit)
<BR>
5.4.4.  Receiving Neighbor Advertisement Messages
<BR>
   On receipt of a valid Neighbor Advertisement message on an interface,
   node behavior depends on whether the target address is tentative or
   matches a unicast or anycast address assigned to the interface.  If
   the target address is assigned to the receiving interface, the
<A NAME="REF">
   solicitation is processed as described in [DISCOVERY]. <B>If the target
   address is tentative, the tentative address is not unique.</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

